K8S日志收集

embedded/2024/9/20 1:22:44/ 标签: kubernetes, 容器, efk, Loki

        本章主要讲解在 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 3nodeSelector: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: mynginxnamespace: defaultlabels:app: mynginx
spec:type: LoadBalancerports:- port: 80targetPort: httpprotocol: TCPname: httpselector:app: mynginx---apiVersion: apps/v1
kind: Deployment
metadata:name: mynginx-deploymentnamespace: defaultlabels:app: mynginx
spec:replicas: 2selector:matchLabels:app: mynginxtemplate:metadata:labels:app: mynginxspec:containers:- name: mynginximage: nginx:1.15.2ports:- name: httpcontainerPort: 80protocol: 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: mynginxnamespace: defaultlabels:app: mynginx
spec:type: LoadBalancerports:- port: 80targetPort: httpprotocol: TCPname: httpselector:app: mynginx---apiVersion: apps/v1
kind: Deployment
metadata:name: mynginx-deploymentnamespace: defaultlabels:app: mynginx
spec:replicas: 2selector:matchLabels:app: mynginxtemplate:metadata:labels:app: mynginxspec:containers:- name: mynginximage: nginx:1.15.2ports:- name: httpcontainerPort: 80protocol: 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.ppmy.cn/embedded/108339.html

相关文章

QT基础 QPropertyAnimation简单学习

目录 1.简单介绍 2.使用步骤 3.部分代码示例 4.多项说明 5.信号反馈 6.自定义属性 1. 定义自定义属性 2. 使用 QPropertyAnimation 动画化自定义属性 3. 连接信号和槽 4.注意事项 7.更多高级示例 1.简单介绍 QPropertyAnimation是Qt中的一个类&#xff0c;用于实现属性…

idea安装并使用maven依赖分析插件:Maven Helper

在 IntelliJ IDEA 中安装并使用 Maven Helper 插件可以帮助你更方便地管理 Maven 项目的依赖&#xff0c;比如查看依赖树、排除冲突依赖等。以下是安装和使用 Maven Helper 插件的步骤&#xff1a; 安装 Maven Helper 插件 打开 IntelliJ IDEA 并进入你的项目。 在 IDE 的右下…

百度飞浆OCR半自动标注软件OCRLabel配置【详细

今天帮标注人员写了一份完整的百度飞浆OCR标注软件的安装配置说明书、以供标注人员使用 包括各种环境安装包一起分享出来【conda\python\label项目包、清华源配置文件、pycharm社区版安装包】 提取码&#xff1a;umys 1、解压并安装tools文件下的miniconda,建议安装在D盘下的…

Win32绕过UAC弹窗获取管理员权限

在早些年写一些桌面软件时&#xff0c;需要管理员权限&#xff0c;但是又不想UAC弹窗&#xff0c;所以一般是直接将UAC的级别拉到最低&#xff0c;或者直接禁用UAC的相关功能。 什么是UAC(User Account Control) 用户帐户控制 (UAC) 是一项 Windows 安全功能&#xff0c;旨在保…

Flink SQL 中常见的数据类型

Flink SQL 中常见的数据类型 目标 通过了解Flink SQL 中常见的数据类型,掌握正确编写Flink SQL 语句背景 Apache Flink 支持多种数据类型,这些数据类型被用于 Flink SQL 表达式、Table API 以及 DataStream API 中。以下是 Flink SQL 中常见的数据类型: 基本数据类型 Boo…

<Rust>egui学习之部件(十一):如何在窗口中添加单选框radiobutton部件?

前言 本专栏是关于Rust的GUI库egui的部件讲解及应用实例分析&#xff0c;主要讲解egui的源代码、部件属性、如何应用。 环境配置 系统&#xff1a;windows 平台&#xff1a;visual studio code 语言&#xff1a;rust 库&#xff1a;egui、eframe 概述 本文是本专栏的第十一篇…

算法练习题17——leetcode54螺旋矩阵

题目描述 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 代码 import java.util.*;class Solution {public List<Integer> spiralOrder(int[][] matrix) {// 用于存储螺旋顺序遍历的结果List<Integer>…

学习整理使用jquery实现获取相同name被选中的多选框值的方法

学习整理使用jquery实现获取相同name被选中的多选框值的方法 <html><head><meta charset"gbk"><!-- 引入JQuery --><script src"https://www.qipa250.com/jquery/dist/jquery.min.js" type"text/javascript"><…

flutter开发实战-flutter build web微信无法识别二维码及小程序码问题

flutter开发实战-flutter build web微信无法识别二维码及小程序码问题 GitHub Pages是一个直接从GitHub存储库托管的静态站点服务&#xff0c;‌它允许用户通过简单的配置&#xff0c;‌将个人的代码项目转化为一个可以在线访问的网站。‌这里使用flutter build web来构建web发…

现代计算机中数字的表示与浮点数、定点数

现代计算机中数字的表示与浮点数、定点数 导读&#xff1a;浮点数运算是一个非常有技术含量的话题&#xff0c;不太容易掌握。许多程序员都不清楚使用操作符比较float/double类型的话到底出现什么问题。这篇文章讲述了浮点数的来龙去脉&#xff0c;所有的软件开发人员都应该读…

【网络安全】服务基础第二阶段——第三节:Linux系统管理基础----Linux用户与组管理

目录 一、用户与组管理命令 1.1 用户分类与UID范围 1.2 用户管理命令 1.2.1 useradd 1.2.2 groupadd 1.2.3 usermod 1.2.4 userdel 1.3 组管理命令 1.3.1 groupdel 1.3.2 查看密码文件 /etc/shadow 1.3.4 passwd 1.4 Linux密码暴力破解 二、权限管理 2.1 文件与目…

封装触底加载组件

&#xff08;1&#xff09;首先创建一个文件名为&#xff1a;InfiniteScroll.vue <template><div ref"scrollContainer" class"infinite-scroll-container"><slot></slot><div v-if"loading" class"loading-sp…

nginx 新建一个 PC web 站点

注意&#xff1a;进行实例之前必须完成nginx的源码编译。&#xff08;阅读往期文章完成步骤&#xff09; 1.编辑nginx的配置文件&#xff0c;修改内容 [rootlocalhost ~]# vim /usr/local/nginx/conf/nginx.conf 2.创建新目录/usr/local/nginx/conf.d/&#xff0c;编辑新文件…

【激活函数总结】Pytorch中的激活函数详解: ReLU、Leaky ReLU、Sigmoid、Tanh 以及 Softmax

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发…

问:你知道IO和NIO有哪些区别不?

一、先表示一下_ Java IOJava NIO主要特点面向流&#xff08;Stream&#xff09;的I/O操作面向缓冲区&#xff08;Buffer&#xff09;和通道&#xff08;Channel&#xff09;的I/O操作&#xff0c;支持非阻塞I/O和选择器&#xff08;Selector&#xff09;常用方法InputStream、…

el-table 单元格,双击编辑

el-table 单元格&#xff0c;双击编辑 实现效果 代码如下 <template><el-table :data"tableData" style"width: 100%"><el-table-column prop"name" label"姓名" width"180"><template slot-scope&q…

flutter开发实战-flutter build web发布到github page及图片未显示问题

flutter开发实战-flutter build web发布到github page及图片未显示问题 GitHub Pages是一个直接从GitHub存储库托管的静态站点服务&#xff0c;‌它允许用户通过简单的配置&#xff0c;‌将个人的代码项目转化为一个可以在线访问的网站。‌这里使用flutter build web来构建web…

反向沙箱-安全上网解决方案

随着信息化的发展&#xff0c;企业日常办公越来越依赖互联网。终端以及普通PC终端在访问互联网过程中&#xff0c;会遇到各种各样不容忽视的风险&#xff0c;例如员工主动故意的数据泄漏&#xff0c;后台应用程序偷偷向外部发信息&#xff0c;木马间谍软件的外联&#xff0c;以…

pikachu文件包含漏洞靶场

File inclusion(local) 创建1.php 步骤一&#xff1a;选择一个球员提交 ../../../../1.php File Inclusion(remote)&#xff08;远程文件包含&#xff09; 步骤一&#xff1a;更改参数 php.ini ⾥有两个重要的参数 allow_url_fopen 、allow_url_include &#xff1b; 步骤二…

SpringBoot教程(十五) | SpringBoot集成RabbitMq(消息丢失、消息重复、消息顺序、消息顺序)

SpringBoot教程&#xff08;十五&#xff09; | SpringBoot集成RabbitMq&#xff08;消息丢失、消息重复、消息顺序、消息顺序&#xff09; RabbitMQ常见问题解决方案问题一&#xff1a;消息丢失的解决方案&#xff08;1&#xff09;生成者丢失消息丢失的情景解决方案1&#xf…