K8S日志收集

news2024/11/15 23:23:32

        本章主要讲解在 Kubernetes 集群中如何通过不同的技术栈收集容器的日志,包括程序直接输出到控制台日志、自定义文件日志等。

一、有哪些日志需要收集

        为了更加方便的处理异常,日志的收集与分析极为重要,在学习日志收集之前,需要知道在集群内有哪些日志需要收集,在这里简单的总结一些比较重要的需要收集的日志:

  • 服务器系统日志
  • Kubernetes 组件日志
  • 应用程序日志

        除了上面列出的日志外,可能还存在其他很多需要采集的日志,比如网关的日志、服务之间调用链的日志等。

二、日志采集工具有哪些

1.ELK 和 EFK

        在传统的架构中,比较成熟且流行的日志收集平台是 ELK(Elasticsearch+Logstash+Kibana)其中 Logstash 负责采集日志,并输出给 Elasticsearch,之后用 Kibana 进行展示。
        我们都知道,几乎所有的服务都可以进行容器化,ELK 技术栈同样可以部署到 Kubernetes 集群中,也可以进行相关的日志收集,但是由于 Logstash 比较消耗系统资源,并且配置稍微有点复杂,因此Kubernetes官方提出了 EFK(Elasticsearch+fluentd+Kibana)的解决方案,相对于 ELK 中的Logstash,Fluentd 采用一锅端的形式,可以直接将某些日志文件中的内容存储至 Elasticsearch,然后通过Kibana进行展示。

        但是 Fluentd 也有缺陷,比如,它只能收集控制台日志(程序直接输出到控制台的日志),不能收集非控制台的日志,所以很难满足生产环境的需求,因为大部分情况下,没有遵循云原生理念开发的程序,往往会输出很多日志文件,这些容器内的日志无法采集,除非在每个 Pod 内添加一个 sidecar,将日志文件的内容进行 tail -f 转换成控制台日志,但这也是非常麻烦的。

        另一个问题是,大部分公司内都有很成熟的 ELK 平台,如果再搭建一个 EFK 平台,属于重复,当然用来存储日志的 Elasticsearch 集群不建议搭建在 Kubernetes 集群中,因为会非常浪费 Kubernetes 集群的资源,所以大部分情况下通过 Fluentd 采集日志输出到外部的 Elasticsearch 集群中。
        综上所述,Fluentd 功能有限,Logstash 太重,所以需要一个中和的工具进行日志的收集工作,此时就可以采用一个轻量化的收集工具:Filebeat。

2.Filebeat

        在早期的 ELK 架构中,日志收集均以 Logstash 为主,Logstash 负责收集和解析日志,对内存、CPU、IO资源的消耗比较高,但是 Filebeat 所占系统的 CPU 和内存几乎可以忽略不计。
        由于 Filebeat 本身是比较轻量级的日志采集工具,因此 Filebeat 经常被用于以 sidecar 的形式配置在 Pod 中,用来采集容器内冲虚输出的自定义日志文件。当然,Filebeat 同样可以采用 Daemonset 的形式部署在 Kubernetes 集群中,用于采集系统日志和程序控制台输出的日志。
        Fluentd 和 Logstash 可以将采集的日志输出到 Elasticsearch 集群,Filebeat 同样可以将日志直接存储到 Elasticsearch 中,但是为了更好的分析日志或者减轻 Elasticsearch 的压力,一般都是将志先输出到 Kafka,再由 Logstash 进行简单的处理,最后输出到 Elasticsearch 中。

3.新贵 Loki

        上述讲的无论是 ELK、EFK还是 Filebeat,都需要用到Elasticsearch 来存储数据,Elasticsearch本身就像一座大山,维护难度和资源使用都是偏高的。对于很多公司而言,热别是创新公司,可能并不想大费周章的去搭建一个 ELK、EFK 或者其他重量级的日志平台,刚开始的人力投入可能是大于收益的,所以就需要一个更轻量级的日志收集平台。
        为了解决上述的问题和难点,一个基于 Kubernetes 平台的原生日志收集平台 Loki stack 应运而生,所以一经推出,就受到了用户的青睐。

        Loki 是 Grafana Labs 开源的一个支持水平扩展、高可用、多租户的日志聚合系统。

可以看到,Loki 主要包含如下组件:

  • Loki:主服务器,负责日志的存储和査询,参考了 prometheus 服务发现机制,将标签添加到日志流,而不是想其他平台一样进行全文索引。
  • Promtai1:负责收集日志并将其发送给 Loki,主要用于发现采集目标以及添加对应 Label,最终发送给 Loki。
  • Grafana:用来展示或查询相关日志,可以在页面査询指定标签 Pod 的日志。

        和其他工具相比,虽然 Loki 不如其他技术栈功能灵活,但是 Loki 不对日志进行全文索引,仅索弓相关日志的元数据,所以 Loki 操作起来更简单、更省成本。而且 Loki 是基于 Kubernetes 进行设计的,可以很方便的部署在 Kubernetes 上,并且对集群的 Pod 进行日志采集,采集时会将 Kubernetes 集群中的一些元数据自动添加到日志中,让技术人员可以根据命名空间、标签字段进行日志的过滤,可以很快的定位到相关日志。
        通过上述的了解,我们知道了在 Kubernetes 集群中,日志收集可以选择的技术栈有很多,不只局限于上述提到的。对于平台的选择,没有最好,只有最合适,比如公司内已经有了很成熟的 ELK 平台,那么我们可以直接采用 Fluentd 或 Filebeat,然后将 Kubernetes 的日志输出到已存在的 Elasticsearch集群中即可。如果公司并没有成熟的平台支持,又不想耗费很大的精力和成本去建立一个庞大的系统,那么 Loki stack 将会是一个很好的选择。

三、使用 EFK 收集控制台日志

        首先我们使用 EFK 收集 Kubernetes 集群中的日志,本次实验讲解的是在 Kubernetes 集群中启动一个 Elasticsearch 集群,如果企业已经有了 Elasticsearch 集群,可以直接将日志输出到已有的Elasticsearch 集群中。

1.部署Elasticsearch+Fluentd+Kibana

(1)下载需要的部署文档
[root@k8s-master ~]# get clone htps://github.com/dotbalo/k8s.git

备注:
本案例已经下载好,可以直接使用

(2)创建 EFK 所用的命名空间
[root@master ~]# cd efk-7.10.2/
[root@master efk-7.10.2]# ls
create-logging-namespace.yaml  fluentd-es-configmap.yaml  kibana-service.yaml
es-service.yaml                fluentd-es-ds.yaml         nginx-service.yaml
es-statefulset.yaml            kafka
filebeat                       kibana-deployment.yaml
[root@master efk-7.10.2]# ku create -f create-logging-namespace.yaml 
namespace/logging created
(3)创建 Elasticsearch 群集(已有该平台可以不创建) 
[root@master efk-7.10.2]# ku create -f es-service.yaml 
service/elasticsearch-logging created

备注:
为 es 集群创建服务,以便为 Fluentd 提供数据传入的端口 

[root@master efk-7.10.2]# ku get svc -n logging
NAME                    TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)             AGE
elasticsearch-logging   ClusterIP   None         <none>        9200/TCP,9300/TCP   76s

备注:

  • 9208 端口:用于所有通过 HTTP 协议进行的 API 调用。包括搜索、聚合、监控、以及其他任何使用HTTP 协议的请求。所有的客户端库都会使用该端口与 Elasticsearch 进行交互。
  • 9308 端口:是一个自定义的二进制协议,用于集群中各节点之间的通信。用于诸如集群变更、主节点选举、节点加入/离开、分片分配等事项。 
[root@master efk-7.10.2]# ku create -f es-statefulset.yaml 
serviceaccount/elasticsearch-logging created
clusterrole.rbac.authorization.k8s.io/elasticsearch-logging created
clusterrolebinding.rbac.authorization.k8s.io/elasticsearch-logging created
statefulset.apps/elasticsearch-logging created

备注:
创建 es 集群 

[root@master efk-7.10.2]# ku get pod -n logging
NAME                      READY   STATUS    RESTARTS   AGE
elasticsearch-logging-0   0/1     Pending   0          7m12s
(4)创建Kibana(已有该平台可以不创建) 
[root@master efk-7.10.2]# ku create -f kibana-deployment.yaml -f kibana-service.yaml 
deployment.apps/kibana-logging created
service/kibana-logging created
(5)修改 Fluentd 的部署文件 

        由于在 Kubernetes 集群中,可能不需要对所有的机器都采集日志,因此可以更改 Fluentd 的部署文
件。添加一个 Nodeselector,只部署至需要采集日志的主机即可。

[root@master efk-7.10.2]# grep "nodeSelector" fluentd-es-ds.yaml -A 3
      nodeSelector:
        fluentd: "true"
      volumes:
      - name: varlog
(6)为需要采集日志的服务器设置标签 
[root@master efk-7.10.2]# ku label node node1 fluentd=true
node/node1 labeled
[root@master efk-7.10.2]# ku label node node2 fluentd=true
node/node2 labeled
[root@master efk-7.10.2]# ku label node master fluentd=true
node/master labeled
[root@master efk-7.10.2]# ku get node -l fluentd=true --show-labels
NAME     STATUS   ROLES                  AGE   VERSION   LABELS
master   Ready    control-plane,master   14d   v1.23.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,fluentd=true,kubernetes.io/arch=amd64,kubernetes.io/hostname=master,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=
node1    Ready    <none>                 14d   v1.23.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,fluentd=true,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux
node2    Ready    <none>                 14d   v1.23.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,fluentd=true,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux
 (7)创建 Fluentd
[root@master efk-7.10.2]# ku create -f fluentd-es-ds.yaml -f fluentd-es-configmap.yaml 
serviceaccount/fluentd-es created
clusterrole.rbac.authorization.k8s.io/fluentd-es created
clusterrolebinding.rbac.authorization.k8s.io/fluentd-es created
daemonset.apps/fluentd-es-v3.1.1 created
configmap/fluentd-es-config-v0.2.1 created

        fluentd 的 ConfigMap 有一个字段需要注意,在 fluentd-es-configmap.yaml 文件的最后有一个output.conf:
        host elasticsearch-logging
        port 9200 

        此处的配置将收集到得数据输出到指定的 Elasticsearch 集群中,由于创建 Elasticsearch 集群时会自动创建一个名为 elasticsearch-logging 的 Service,因此默认 Fluentd 会将数据输出到前面创建的 Elasticsearch 集群中。如果企业已经存在一个成熟的 ELK 平台,可以创建一个同名的 service 指向该集群,然后就能输出到现有的 Elasticsearch 集群中。

例如:
apiVersion: v1
kind: Service
metadata:
  name:elasticsearch-logging
  namespace:logging
spec:
  type:ExternalName
  externalName:www.es.com
备注:
externalName:www.es.com
指向了外部 es 主机的地址或域名

备注:
<match **>

。。。

        host elasticsearch-logging
        port 9200
        logstash format true

。。。

        </match>

host elasticsearch-logging:指定 fluentd 获取的日志要发往的主机

port 9200:目标es 主机的端口号

logstash format true: 指定是否使用常规的 index 命名格式,(logstash-%v.%m.%d),默认为 false

2.Kibana 的使用

(1)确认创建的 Pod 已经成功启动
[root@master efk-7.10.2]# ku get pod -n logging
NAME                              READY   STATUS             RESTARTS        AGE
elasticsearch-logging-0           0/1     Pending            0               25m
fluentd-es-v3.1.1-5bn6f           0/1     CrashLoopBackOff   5 (48s ago)     6m48s
fluentd-es-v3.1.1-p4vdn           0/1     CrashLoopBackOff   5 (48s ago)     6m48s
kibana-logging-7bf48fb7b4-k6cq9   0/1     CrashLoopBackOff   9 (2m25s ago)   17m
(2)查看kibana 暴露的端口 
[root@master efk-7.10.2]# ku get svc -n logging
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
elasticsearch-logging   ClusterIP   None            <none>        9200/TCP,9300/TCP   27m
kibana-logging          NodePort    10.97.250.231   <none>        5601:32726/TCP      17m
(3)访问 kibana 

使用任意一个部署了 kube-proxy 服务的节点的 IP+32734 端口即可访问 kibana。

http://192.168.10.101:32734/kibana

3.创建一个Pod,进行日志采集

(1)编写nginx部署文件
[root@master efk-7.10.2]# vim nginx-service.yaml 

apiVersion: v1
kind: Service
metadata:
  name: mynginx
  namespace: default
  labels:
    app: mynginx
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app: mynginx

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mynginx-deployment
  namespace: default
  labels:
    app: mynginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: mynginx
  template:
    metadata:
      labels:
        app: mynginx
    spec:
      containers:
      - name: mynginx
        image: nginx:1.15.2
        ports:
          - name: http
            containerPort: 80
              protocol: TCP
 (2)部署该Deployment
[root@master efk-7.10.2]# ku create -f nginx-service.yaml 
service/mynginx created
deployment.apps/mynginx-deployment created
 (3)查看pod状态

 (4)查看暴露的端口
[root@master efk-7.10.2]# ku get svc -n default
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP        14d
mynginx      LoadBalancer   10.105.213.83   <pending>     80:32710/TCP   29s
(5)客户端访问测试 
[root@master efk-7.10.2]# curl 192.168.10.101:32710
 (6)到kibana上查看

四、使用Filebeat收集自定义文件日志

        基于云原生 12 要素开发的程序,一般会将日志直接输出到控制台,并非是指定一个文件存储日志,这一点和传统架构还是有区别的。但是公司内的程序并非都是基于云原生要素开发的,比如一些年代已久的程序,这类程序如果部署至 Kubernetes 集群中,就需要考虑如何将输出至本地文件的日志采集到Elasticsearch。
        之前我们了解到 Filebeat 是一个非常轻量级的日志收集工具,可以将其和应用程序部署至一个 Pod中,通过 Volume 进行日志文件的共享,之后 Filebeat 就可以采集里面的数据,并推送到日志平台。
        为了减轻 Elasticsearch 的压力。本案例将引入 Kafka 消息队列来缓存日志数据,之后通过Logstash 简单处理一下日志,最后再输出到 Elasticsearch 集群。这种架构在生产环境中也是常用的架构,因为日志数量可能比较多,同时也需要对其进行加工。当然 Fluentd 也可以将日志输出到 Kafka。

1.安装 helm 客户端(如果已有此工具,可跳过该步骤)

(1)下载安装包
[root@k8s-master ~]#wget https://get.helm.sh/helm-v3.6.2-linux-amd64.tar.gz
(2)解压 
[root@k8s-master ~]# tar zxvf helm-v3.6.2-linux-amd64.tar.gz
(3)安装 
[root@k8s-master ~]# mv linux-amd64/helm /usr/local/bin/
(4)查看版本
[root@master ~]# helm version
version.BuildInfo{Version:"v3.9.4", GitCommit:"dbc6d8e20fe1d58d50e6ed30f09a04a77e4c68db", GitTreeState:"clean", GoVersion:"go1.17.13"}

2.创建卡Kafka和 Logstash 

(1)部署zookeeper
[root@k8s-master ~l# cd efk-7.10.2/filebeat
[root@k8s-master filebeat]# helm install zookeeper zookeeper/ -n logging
(2)查看zookeeper 状态 
[root@k8s-master filebeat]# kubectl get pod-n logging -l app.kubernetes.io/name=zookeeper

备注:
-l:指定标签
等一会,部署好显示状态为 Running 

(3)部署 kafka
[root@master filebeat]# helm install kafka kafka/ -n logging
(4)查看 kafka 状态 
[root@k8s-master filebeat]# kubectl get pod -n logging -l app.kubernetes.io/component=kafka

备注:
等一会,部署好显示状态为 Running

(5)创建 logstash 服务
[root@master filebeat]# ku create -f logstash-service.yaml -f logstash-cm.yaml -f logstash.yaml -n logging
service/logstash-service created
configmap/logstash-configmap created
deployment.apps/logstash-deployment created

3.注入Filebeat sidecar 

(1)创建一个模拟程序
[root@master filebeat]# ku create -f filebeat-cm.yaml -f app-filebeat.yaml -n logging
configmap/filebeatconf created
service/mynginx created
deployment.apps/app2 created
 (2)查看pod状态
[root@master filebeat]# ku get pod -n logging
NAME                                   READY   STATUS    RESTARTS       AGE
app2-666cd8b58f-pdrtp                  2/2     Running   0              33s
elasticsearch-logging-0                1/1     Running   1 (28m ago)    47m
fluentd-es-v3.1.1-5bn6f                1/1     Running   16 (28m ago)   70m
fluentd-es-v3.1.1-p4vdn                1/1     Running   16 (27m ago)   70m
kafka-0                                1/1     Running   0              23m
kibana-logging-7bf48fb7b4-k6cq9        1/1     Running   21 (28m ago)   80m
logstash-deployment-6485f5d5b5-cpndc   1/1     Running   0              14m
zookeeper-0                            1/1     Running   0              25m
[root@master filebeat]# ku get svc -n logging
NAME                    TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
elasticsearch-logging   ClusterIP      None             <none>        9200/TCP,9300/TCP            90m
kafka                   ClusterIP      10.97.94.74      <none>        9092/TCP                     23m
kafka-headless          ClusterIP      None             <none>        9092/TCP,9093/TCP            23m
kibana-logging          NodePort       10.97.250.231    <none>        5601:32726/TCP               80m
logstash-service        ClusterIP      10.101.139.254   <none>        5044/TCP                     14m
mynginx                 LoadBalancer   10.98.250.245    <pending>     80:30022/TCP                 43s
zookeeper               ClusterIP      10.97.171.172    <none>        2181/TCP,2888/TCP,3888/TCP   25m
zookeeper-headless      ClusterIP      None             <none>        2181/TCP,2888/TCP,3888/TCP   25m
[root@master filebeat]# ku get svc
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP        15d
mynginx      LoadBalancer   10.105.213.83   <pending>     80:32710/TCP   58m

注意:这个 mynginx的 svc 是创建在了 default 的命名空间的。

(3)查看日志中的内容 
[root@k8s-master filebeat]# kubectl exec app-ddf4b6db9-thtbs -n logging 
-- tail/opt/date.log

 五、Loki

1.安装 Loki stack(如果已安装,忽略此步骤)

[root@k8s-master ~]# tar zxvf helm-v3.6.2-linux-amd64.tar.gz
[root@k8s-master ~]# cp linux-amd64/helm /usr/bin

2.添加安装源并下载 1oki-stack(如已有离线包,忽略此步骤)

[root@k8s-master ~]# helm repo add grafana https://grafana.github.io/helm-charts
[root@k8s-master ~]# helm repo update

备注:
其他安装源
helm repo add loki https://grafana.github.io/loki/charts && helm repo update

[root@k8s-master ~]# helm repo list

[root@k8s-master ~l# helm pull grafana/loki-stack --version 2.8.3

3.创建 Loki 命名空间 

[root@k8s-master ~#kubectl create ns loki
namespace/loki created

4. 创建 Loki stack

[root@k8s-master ~]# tar xf loki-stack-2.8.3.tgz
[root@master loki]# helm upgrade --install loki loki-stack --set grafana.enabled=true --set grafana.service.type=NodePort -n loki
Release "loki" does not exist. Installing it now.
W0903 11:51:46.761749   48521 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
W0903 11:51:46.765865   48521 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
W0903 11:51:46.769012   48521 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
W0903 11:51:46.937041   48521 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
W0903 11:51:46.937366   48521 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
W0903 11:51:46.937414   48521 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
NAME: loki
LAST DEPLOYED: Tue Sep  3 11:51:45 2024
NAMESPACE: loki
STATUS: deployed
REVISION: 1
NOTES:
The Loki stack has been deployed to your cluster. Loki can now be added as a datasource in Grafana.

See http://docs.grafana.org/features/datasources/loki/ for more detail.

5.查看Pod状态 

[root@master loki]# ku get pod -n loki
NAME                           READY   STATUS    RESTARTS   AGE
loki-0                         0/1     Running   0          3m24s
loki-grafana-fd49f9d86-jgspv   1/2     Running   0          3m24s
loki-promtail-b7jl2            1/1     Running   0          3m24s
loki-promtail-h7jjt            1/1     Running   0          3m24s
loki-promtail-szgd9            1/1     Running   0          3m24s

6.查看暴露的端口 

[root@master loki]# ku get svc -n loki
NAME              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
loki              ClusterIP   10.104.80.31     <none>        3100/TCP       115s
loki-grafana      NodePort    10.100.211.151   <none>        80:32393/TCP   115s
loki-headless     ClusterIP   None             <none>        3100/TCP       115s
loki-memberlist   ClusterIP   None             <none>        7946/TCP       115s

7.查看grafana的密码 

[root@master loki]# ku get secret loki-grafana --namespace loki -o jsonpath="{.data.admin-password}" | base64 --decode && echo
mDrZEfY8CSZwjMpbaKziqaCzUUZRt8Ku23hnFOCC

修改密码 

[root@master loki]# ku exec -it loki-grafana-fd49f9d86-jgspv -n loki -c grafana grafana-cli admin reset-admin-password admin

备注:
账号为 admin

8.登录 

http://192.168.10.101:32734/

9.创建一个 Pod,进行日志采集(还是前面的 pod)

(1)编写 nginx 部署文件
[root@master loki]# vim nginx-service.yaml 

apiVersion: v1
kind: Service
metadata:
  name: mynginx
  namespace: default
  labels:
    app: mynginx
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app: mynginx

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mynginx-deployment
  namespace: default
  labels:
    app: mynginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: mynginx
  template:
    metadata:
      labels:
        app: mynginx
    spec:
      containers:
      - name: mynginx
        image: nginx:1.15.2
        ports:
          - name: http
            containerPort: 80
            protocol: TCP
(2)部署该Dployment 
[root@master loki]# ku create -f nginx-service.yaml
(3)查看 pod 状态 
[root@master loki]# ku get pod
NAME                                  READY   STATUS    RESTARTS      AGE
mynginx-deployment-668d5454cb-9lwgx   1/1     Running   2 (25m ago)   118m
mynginx-deployment-668d5454cb-bdg8v   1/1     Running   1 (89m ago)   118m
(4)查看暴露的端口 
[root@master loki]# ku get svc -n default
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP        15d
mynginx      LoadBalancer   10.105.213.83   <pending>     80:32710/TCP   111m
(5)客户端访问测试
[root@master loki]# curl 192.168.10.101:32710
(6)在 Loki 中查看此 Pod 的日志 
{namespace="default",pod="mynginx-deployment-668d5454cb-lldng"}
{namespace="kube-system"}
{namespace="kube-system",pod="calico-node-gwtqw"}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2102762.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

矮草坪渲染尝试

本来说写unity里的&#xff0c;由于three测试方便&#xff0c;先试试three 这个图片是目标效果 可以看见草很矮&#xff0c;很密集&#xff0c;如果用instance来绘制的话&#xff0c;遭不住的 忽然发现这个效果很像绒毛效果 于是找了博客康康 https://zhuanlan.zhihu.com/p/256…

第二证券:涨停潮!传手机将使用钛金属外壳?

今天早盘&#xff0c;银行股再度重挫&#xff0c;导致上证指数、上证50纷乱创出阶段性新低&#xff0c;上证指数跌破2800点&#xff0c;小盘成长股则大面积反弹&#xff0c;创业板指、科创50等股指飘红。 盘面上&#xff0c;新式烟草、钛金属、锂矿、玻璃基板等板块涨幅居前&a…

glsl着色器学习(七)

先了解一个矩阵库twgl/m4 是一个4x4 矩阵数学转换函数的库 normalize(a, dst) 将一个向量除以它的欧几里得长度&#xff0c;归一化后返回参数"a"是一个vec3&#xff08;三维向量&#xff09;参数"dst"是用来接收结果的&#xff0c;如果不传&#xff0c;则…

【嵌入式体系结构复习资料】

选择&#xff1a; 1. 以下哪个不是嵌入式系统设计的主要目标&#xff1f;( D ) A&#xff0e;低成本 B.低功耗 C.实时要求高 D.超高性能 2&#xff0e; 嵌入式系统有别于其他系统的最大特点是&#xff08;A &#xff09;。 A&#xff0e;嵌入专用 B.高可靠 C.…

集成电路学习:什么是LCD液晶显示器

一、LCD&#xff1a;液晶显示器 LCD&#xff0c;全称Liquid Crystal Display&#xff0c;即液晶显示器&#xff0c;是一种平面超薄的显示设备。它由一定数量的彩色或黑白像素组成&#xff0c;放置于光源或者反射面前方。LCD的主要原理是以电流刺激液晶分子产生点、线、面配合背…

mysql 使用 general 开启SQL跟踪功能

查看当前状态 mysql> SHOW VARIABLES LIKE %general%; 启用 临时启用 SET GLOBAL general_logon; SET GLOBAL general_log_file/tmp/general.log; 永久启用 通过修改配置文件来启用,需要重启mysql服务 [mysqld] general_logON general_log_file/tmp/general.log 再次查看状态…

【保姆级教程】如何在Win11上搭建一个GPU环境

CUDA和CUDNN安装 CUDA安装 下载对应cuda环境 下载链接&#xff1a;https://developer.nvidia.com/cuda-downloads&#xff0c;图片下载的是 cuda_12.6.1_560.94_windows.exe 然后一路安装即可&#xff1a; 安装路径如下&#xff1a; CUDNN安装 打开cuDNN下载页面 解压后…

排查SQL Server中的内存不足及其他疑难问题

文章目录 引言I DMV 资源信号灯资源信号灯 DMV sys.dm_exec_query_resource_semaphores( 确定查询执行内存的等待)查询性能计数器什么是内存授予?II DBCC MEMORYSTATUS 查询内存对象III DBCC 命令释放多个 SQL Server 内存缓存 - 临时度量值IV 等待资源池 %ls (%ld)中的内存…

【408DS算法题】034进阶-22年真题_判断顺序存储二叉树是否是BST

Index 真题题目分析实现总结 真题题目 已知非空二叉树T的结点值均为正整数&#xff0c;采用顺序存储方式保存&#xff0c;数据结构定义如下: typedef struct { // MAX_STZE为已定义常量int SqBiTNode[MAX_SIZE]; // 保存二叉树结点值的数组int ElemNum; …

BM3D--Image Denoising by Sparse 3-D Transform-Domain Collaborative Filtering

系列文章目录 文章目录 系列文章目录前言稀疏三维变换域协同滤波图像去噪摘要1 引言2 分组和协作过滤A.分组B.按匹配分组C.协同过滤D.基于变换域收缩的协同过滤 3 算法结论 前言 论文地址 如果下载不了可以从 https://download.csdn.net/download/m0_70420861/89708940 获取 …

Pytorch安装 CUDA Driver、CUDA Runtime、CUDA Toolkit、nvcc、cuDNN解释与辨析

Pytorch的CPU版本与GPU版本 Pytorch的CPU版本 仅在 CPU 上运行&#xff0c;适用于没有显卡或仅使用 CPU 的机器。安装方式相对简单&#xff0c;无需额外配置 CUDA 或 GPU 驱动程序。使用方式与 GPU 版相同&#xff0c;唯一不同的是计算将自动在 CPU 上进行。 Pytorch的GPU版…

VBA学习(63):Excel VBA 数据分析展示/ListView控件/Combox组合框控件/CheckBox复选框控件/科目汇总表

前面我们分享了使用ListVeiw进行数据展示&#xff0c;做出“科目汇总表”来&#xff08;Excel VBA 数据分析展示/ListView控件、Excel VBA 数据分析展示/ListView控件/Combox组合框控件/科目汇总表(2)&#xff09;&#xff0c;今天&#xff0c;我们继续完善按月查询、按一级科目…

codesys进行控制虚拟轴运动时出现的一些奇怪bug的解释

codesys进行控制虚拟轴运动时出现的一些奇怪bug的解释 问题描述第一个奇怪的bug&#xff1a;新建的工程没有SoftMotion General Axis Pool选项第二个奇怪的bug&#xff1a;在新建工程SoftMotion General Axis Pool选项时&#xff0c;无法手动添加第三个奇怪的bug&#xff1a;虚…

Spring源码之refresh

1.refesh的核心介绍 在 Spring 框架中&#xff0c;refresh 主要用于刷新应用上下文。这一过程涉及多个重要的步骤&#xff0c;确保 Spring 容器的状态更新、bean 的加载以及资源的初始化。 refresh 方法的主要功能 初始化上下文&#xff1a; refresh 方法会初始化应用上下文&…

【项目实战】智能机械臂协同视觉辅助仓储物流管控平台

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

9月4日星期三今日早报简报微语报早读

9月4日星期三&#xff0c;农历八月初二&#xff0c;早报微语早读。 1、全球第二批100个地质遗产地公布&#xff0c;中国乌海、自贡、桂林等3地入选&#xff1b; 2、我国科学家在超高纯石墨领域取得重大突破&#xff1b; 3、2024上海百强企业榜单发布&#xff1a;入围门槛105…

小土堆pytorch

anaconda安装 pip list 可以看有哪些package包 nvidia-smi查看显卡的状态 安装pytorch 检验pytorch是否安装成功&#xff0c;以及是否pytorch是否可以使用gpu。 (1)查看conda版本 conda --version 或 conda -V (2)更新conda&#xff08;将conda自身更新到最新版本&#xff09; …

算法打卡 Day28(回溯算法)-组合总数 + 组合总数 Ⅱ+ 电话号码的字母组合

文章目录 Leetcode 17-电话号码的字母组合题目描述解题思路 Leetcode 39-组合总数题目描述解题思路 Leetcode 216-组合总数 Ⅲ题目描述解题思路 Leetcode 17-电话号码的字母组合 题目描述 https://leetcode.cn/problems/letter-combinations-of-a-phone-number/description/ …

Flink问题记录

尚硅谷Flink1.17问题记录 上手pom依赖循环递归WordCountStreamDemo中readTextFile是deprecated&#xff08;强烈反对的&#xff09; 上手 pom依赖循环递归 pom依赖中&#xff1a; <dependency><groupId>org.apache.flink</groupId><artifactId>flink…

J.U.C Review - 线程池原理/源码解析

文章目录 为什么要使用线程池ThreadPoolExecutor构造方法解析常见的阻塞队列实现及其特性阻塞队列在实际应用中的适用场景分析自定义ThreadFactory和RejectedExecutionHandler实际使用中的示例与代码片段 线程池的状态线程池的任务处理流程线程复用的实现四种常见的线程池newCa…