K8S日志收集

        本章主要讲解在 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.mzph.cn/pingmian/52974.shtml

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

相关文章

GitLab 是什么?GitLab使用常见问题解答

GitLab 是什么 GitLab是由GitLab Inc.开发&#xff0c;使用MIT许可证的基于网络的Git仓库管理工具开源项目&#xff0c;且具有wiki和issue跟踪功能&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的web服务。 ​GitLab 是由 GitLab Inc.开发&#xff0c…

从0开始训练基于自己声音的AI大模型(基于开源项目so-vits-svc)

写在前面&#xff1a; 本文所使用的技术栈仅为&#xff1a;Python 其他操作基于阿里云全套的可视化平台&#xff0c;只需要熟悉常规的计算机技术即可。 目录 Step 1:注册及登录阿里云主机 Step 2:找到大模型项目 Step 3:创建大模型环境实例 Step 4:进入Ai_singer教程 Step…

C语言之猜数字小游戏

哈喽&#xff0c;大家好&#xff01;我是冰淇淋加点糖。今天我们来用前面所学的知识来开发一个猜数字的小游戏&#xff0c;锻炼我们的编程能力和编程思维。 猜数字小游戏功能简介 1.随机生成一个1-100的数字。 2.玩家用户开始猜数字。 > 猜大了&#xff0c;提醒猜大了…

[米联客-XILINX-H3_CZ08_7100] FPGA程序设计基础实验连载-27浅谈XILINX BRAM的基本使用

软件版本&#xff1a;VIVADO2021.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA 实验平台&#xff1a;米联客-MLK-H3-CZ08-7100开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 http…

C#/WinForm 演示遗传算法

一、一览 二、遗传算法流程 种群初始&#xff1a;随机生成一组N个DNA&#xff0c;每个DNA上都有S个基因&#xff0c;每个DNA都有自己的r值&#xff08;适度值&#xff09;。r最大的DNA为种群最优。 选择操作&#xff1a;将每个DNA的r值占总体的比例作为新一代选取的概率&#…

2024 【Delphi 12】苹果ios开发环境配置(五星保姆级)

目录 一、创建证书 1. 创建证书签名请求&#xff1a;&#xff08;在苹果电脑上操作&#xff09;&#xff1a; .certSigningRequest 文件 2. 创建证书&#xff1a;在苹果的 开发者网站 上操作 重复以上步骤并下载对应的证书文件如下&#xff1a; 3. 创建标识符&#xff08;…

Debezium+Kafka:Oracle 11g 数据实时同步至 DolphinDB 运维手册

目前我们已经支持基于开源技术 Debezium Kafka&#xff0c;从 Mysql 和 Oracle 11g 实时同步数据到 DolphinDB 中。由于当前方案涉及到四个程序的部署&#xff0c;而且具体的 Source 同步任务和 Sink 同步任务还需要额外管理&#xff0c;在运维上具有一定难度。 本文将基于 O…

Ecology10中的CAS身份认证问题

单点登录&#xff08;SSO&#xff09;是一种身份验证解决方案&#xff0c;可让用户通过一次性用户身份验证登录多个应用程序和网站。实现SSO的方式有很多种&#xff0c;比如Kerberos、SAML、OAuth2、JWT、OpenID、CAS、LDAP等。 CAS CAS (Central Authentication Service) 最初…

西中区2024年度安全知识竞赛活动方案

为有效预防安全生产事故的发生&#xff0c;深化西中区全体员工对安全生产的认识&#xff0c;切实提升全体人员的安全意识和自我保护能力&#xff0c;夯实安全知识基础&#xff0c;丰富安全文化内涵&#xff0c;推动安全生产工作更加规范化、系统化&#xff0c;根据西中区安全生…

git 回滚的三种方式

按照从旧到新的顺序 你依次提交了 1 2 3 4 5 现在你想回到1 如何操作 第一种方法 hard reset git reset --hard 执行命令后 你会发现 效果实现了 东西都回到了那次更改 但是2345的更改都没了 并且你会发现 你有更新 这是因为这个hard reset 只会改本地的 远程的不改 一更新就…

EasyCVR视频汇聚平台:巧妙解决WebRTC无法播放H.265视频的难题

随着科技的飞速发展&#xff0c;视频监控已经成为现代安全管理不可或缺的一部分&#xff0c;广泛应用于智慧工地、智慧煤矿、智慧工厂、智慧社区和智慧校园等多个领域。在这个过程中&#xff0c;视频编码技术和实时通信技术显得尤为重要。EasyCVR视频汇聚平台&#xff0c;凭借其…

Python爬虫(一文通)

Python爬虫&#xff08;基本篇&#xff09; 一&#xff1a;静态页面爬取 Requests库的使用 1&#xff09;基本概念安装基本代码格式 应用领域&#xff1a;适合处理**静态页面数据和简单的 HTTP 请求响应**。 Requests库的讲解 含义&#xff1a;requests 库是 Python 中一个…

机器人外呼有哪些优势?

机器人外呼&#xff0c;作为一种结合了计算机技术和人工智能技术的自动化工具&#xff0c;具有多重显著优势。以下是其主要优势的详细阐述&#xff1a; ### 1. 高效性 * **大幅提升工作效率**&#xff1a;机器人外呼可以全天候、不间断地进行工作&#xff0c;不受时间、地点和…

pytest+pycharm+HTMLTestReportCN实现接口自动化

前提&#xff1a;已安装pycharm&#xff0c;已配置python环境 第一步&#xff1a;新建一个py类&#xff0c;用来执行all的测试用例 import HTMLTestReportCN import unittest, os, yagmail# -*- coding: utf-8 -*- """ Time &#xff1a; 2024/9/2 14:50 Auth …

/单元测试

承接上文 统一异常处理&#xff0c;封装结果-CSDN博客 ******************************************** 登录业务 Service public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements EmployeeService {Resourceprivate JwtUtils j…

数据库透明加密的定义与原理

数据库透明加密(TDE)是一种先进的加密技术&#xff0c;主要用于保护存储在数据库中的敏感数据&#xff0c;防止未经授权的访问和数据泄露。以下是对数据库透明加密的详细解析&#xff1a; 一、定义与原理 定义&#xff1a;数据库透明加密是一种在数据库管理系统(DBMS)中集成加密…

苹果笔记本电脑能不能玩游戏?苹果电脑玩游戏咋样?

过去Mac玩不了游戏最大的问题&#xff0c;就是图形API自成一体&#xff0c;苹果既不支持微软的DirectX&#xff0c;同时为了推广自家的Metal图形API&#xff0c;又对OpenGL和Vulkan两大主流的通用API敬而远之。游戏生态、硬件瓶颈让苹果电脑不适合玩游戏。 不过说到底&#xf…

点餐收银小程序

一、项目概述 Hi&#xff0c;大家好&#xff0c;今天分享的项目是《点餐收银小程序》。 系统含管理员/商家/用户三种角色&#xff0c;商家能维护菜式类别、维护菜品信息&#xff0c;用户在小程序能够选择门店&#xff0c;查看门店下各个分类的菜式信息&#xff0c;并进行加购…

ai免费生成ppt软件有哪些?我推荐秒出PPT

现在市面上的ai生成PPT软件非常的多。有收费的&#xff0c;也有不收费的&#xff0c;生成的效果也各不相同。要选择一个性价比高的确实难度不小。 我在使用了不少的产品之后&#xff0c;说一说我的心得。 首先就是&#xff0c;大部分免费的ai生成ppt产品并不好用。我怕不排除…

Cortex-A7的运行模式和寄存器组详解

0 参考资料 ARM Cortex-A(armV7)编程手册V4.0.pdf ARM体系结构与编程第2版2 Cortex-A7运行模式 2.1 运行模式 Cortex-A7共有9种运行模式&#xff0c;如下图所示&#xff1a; 除了用户模式之外其它模式均属于特权模式&#xff0c;在特权模式下处理器可以访问所有系统资源&am…