关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

【Kubernetes】 DaemonSet 详解(二)

发布时间:2023-06-28 12:01:10

三、DaemonSet的应用场景

1.1 在节点上部署系统级守护进程

DaemonSet 最常见的应用场景之一是在节点上部署系统级守护进程。例如,Kubernetes 官方提供的 kube-proxykube-dns 组件都是以 DaemonSet 的形式运行在每个节点上的。这些组件是 Kubernetes 集群中非常重要的系统级进程,需要在每个节点上运行,以确保 Kubernetes 集群的正常运行。

以下是部署 kube-proxy DaemonSet 的示例 YAML 文件:

apiVersion: apps/v1 kind: DaemonSet metadata:  name: kube-proxy  namespace: kube-system  labels:  k8s-app: kube-proxy spec:  selector:  matchLabels:  k8s-app: kube-proxy  updateStrategy:  type: RollingUpdate  template:  metadata:  labels:  k8s-app: kube-proxy  spec:  containers:  - name: kube-proxy  image: k8s.gcr.io/kube-proxy:v1.22.0  securityContext:  privileged: true  command:  - /usr/local/bin/kube-proxy  args:  - --config=/var/lib/kube-proxy/config.conf  volumeMounts:  - name: kube-proxy-config  mountPath: /var/lib/kube-proxy  volumes:  - name: kube-proxy-config  configMap:  name: kube-proxy

   

在这个 YAML 文件中,我们使用 apps/v1 API 版本创建了一个名为 kube-proxy 的 DaemonSet。它的 selector 字段指定了需要运行这个 DaemonSet 的 Pod 的标签,updateStrategy 指定了更新策略,这里使用的是滚动更新。template 字段定义了 Pod 的模板,包括容器、挂载的卷和命令参数等。

1.2 在节点上运行普通容器

在 Kubernetes 集群中,通常有许多需要在每个节点上运行的容器,例如日志收集代理、监控代理、安全代理等。使用 DaemonSet 控制器,可以方便地在每个节点上运行这些容器。


下面是一个运行 fluentd 日志收集代理的 DaemonSet 的示例 YAML 文件:

apiVersion: apps/v1 kind: DaemonSet metadata:  name: fluentd spec:  selector:  matchLabels:  name: fluentd  template:  metadata:  labels:  name: fluentd  spec:  containers:  - name: fluentd  image: fluent/fluentd:v1.7-1  volumeMounts:  - name: varlog  mountPath: /var/log  volumes:  - name: varlog  hostPath:  path: /var/log

   

在上面的 YAML 文件中,我们定义了一个名为 fluentd 的 DaemonSet。该 DaemonSet 会在每个节点上运行一个名为 fluentd 的容器。

该容器使用 fluent/fluentd:v1.7-1 镜像,并将主机节点上的 /var/log 目录挂载到容器中的 /var/log 目录下。这样,该容器就可以从节点上的日志文件中收集日志。

1.3 维护集群状态

另一个常见的 DaemonSet 应用场景是维护集群状态。在 Kubernetes 集群中,有许多需要在每个节点上运行的控制器,例如网络插件、存储插件、DNS 插件等。这些控制器通常需要在每个节点上运行,以维护集群状态。

例如,CNI(Container Network Interface)插件负责为 Kubernetes 集群中的容器分配 IP 地址和路由信息,因此需要在每个节点上运行。Kubernetes 官方提供的 CNI 插件就是以 DaemonSet 的形式运行在每个节点上的。

下面是部署 CNI 插件的示例 YAML 文件:

apiVersion: apps/v1 kind: DaemonSet metadata:  name: kube-flannel-ds-amd64  namespace: kube-system  labels:  tier: node  app: flannel spec:  selector:  matchLabels:  app: flannel  updateStrategy:  type: RollingUpdate  template:  metadata:  labels:  app: flannel  spec:  containers:  - name: kube-flannel  image: quay.io/coreos/flannel:v0.14.0  command:  - /opt/bin/flanneld  args:  - --ip-masq  - --kube-subnet-mgr  - --iface=enp0s8 # 这里需要根据实际网络接口修改  securityContext:  privileged: true  env:  - name: POD_NAME  valueFrom:  fieldRef:  fieldPath: metadata.name  - name: POD_NAMESPACE  valueFrom:  fieldRef:  fieldPath: metadata.namespace  volumeMounts:  - name: flannel-cfg  mountPath: /etc/kube-flannel/  hostNetwork: true  volumes:  - name: flannel-cfg  configMap:  name: kube-flannel-cfg

   

在这个 YAML 文件中,我们使用 apps/v1 API 版本创建了一个名为 kube-flannel-ds-amd64 的 DaemonSet。它的 selector 字段指定了需要运行这个 DaemonSet 的 Pod 的标签,updateStrategy 指定了更新策略,这里使用的是滚动更新。template 字段定义了 Pod 的模板,包括容器、挂载的卷和命令参数等。

这个 YAML 文件中定义了一个名为 kube-flannel 的容器,使用 quay.io/coreos/flannel:v0.14.0 镜像,并将容器的网络接口设置为 enp0s8。该容器还从 configMap 挂载了配置文件,并开启了特权模式。

1.4 在节点上运行工具

除了守护进程、普通容器和控制器之外,还可以使用 DaemonSet 在每个节点上运行工具。这些工具通常用于调试、监控和诊断集群状态。

例如,使用 DaemonSet在每个节点上运行诊断工具的示例 YAML 文件如下所示:

apiVersion: apps/v1 kind: DaemonSet metadata:  name: diagnostic-tool spec:  selector:  matchLabels:  app: diagnostic-tool  template:  metadata:  labels:  app: diagnostic-tool  spec:  containers:  - name: diagnostic-tool  image: your-docker-image  command:  - sh  - -c  - |  while true; do  # do some diagnostic tasks  sleep 60  done  volumeMounts:  - name: host-var-run  mountPath: /host/var/run  readOnly: true  volumes:  - name: host-var-run  hostPath:  path: /var/run

   

在这个 YAML 文件中,我们定义了一个名为 diagnostic-tool 的 DaemonSet。该 DaemonSet 会在每个节点上运行一个名为 diagnostic-tool 的容器。

该容器使用一个自定义的 Docker 镜像,并执行一个 while 循环,在其中执行一些诊断任务。此外,容器还将节点上的 /var/run 目录挂载到容器中的 /host/var/run 目录下,以便读取节点上的运行时信息。

使用 DaemonSet 运行诊断工具可以快速定位节点和集群级别的问题,例如网络问题、存储问题和性能问题等

四、DaemonSet 对象详解

1.1 DaemonSet的结构及其各个部分的作用

DaemonSet 是 Kubernetes 中一种类型的控制器对象,用于在每个节点上运行一个 Pod 副本版本,确保每个节点上都有一个或多个 Pod 副本。DaemonSet 控制器可以保证在新增节点时自动在新增的节点上创建 Pod 副本,同时在节点删除时,自动删除该节点上的 Pod 副本。

在 DaemonSet 对象中,有以下几个部分:

  • metadata:元数据部分包含了对象的名称、命名空间、标签等信息。
  • spec:规格部分包含了 DaemonSet 对象的规格,如选择器、Pod 模板等。
  • status:状态部分包含了 DaemonSet 对象的当前状态信息,如运行中的 Pod 数量等。

其中,spec 部分是 DaemonSet 对象中最重要的部分,它包含了以下几个字段:

  • selector:指定了哪些节点需要运行 Pod 副本。可以使用节点标签选择器指定节点的标签,也可以使用节点名称选择器指定节点的名称。
  • template:指定了要运行在节点上的 Pod 模板。模板中可以指定容器镜像、启动命令等信息。
  • updateStrategy:指定了 DaemonSet 的更新策略。默认情况下,DaemonSet 会在每个节点上运行一个 Pod 副本,如果需要更新 Pod 版本,则会逐个节点进行更新。可以使用 RollingUpdate 策略实现平滑的更新过程,也可以使用 OnDelete 策略实现在节点删除时更新 Pod 版本。

/template/Home/leiyu/PC/Static