创建守护进程集工作负载DaemonSet

DaemonSet也被称为“守护进程集”,它会保证在每个节点上有且仅有一个Pod。集群中新增节点时,DaemonSet也会为其自动创建一个Pod。它适用于日志收集组件(如Fluentd)、节点监控代理(如Prometheus Node Exporter)等场景。通过本文,您可了解DaemonSet的特点、通过控制台及kubectl创建DaemonSet的方法。

DaemonSet介绍

DaemonSet在默认情况下会在每个节点上运行一个Pod,但会受到以下调度策略的影响。关于调度策略的更多信息,请参见调度

  • 污点与容忍度:DaemonSet Pod受到污点限制,不会运行在无法容忍的节点上。但它们默认容忍下列污点:

    • node.kubernetes.io/unschedulable:NoSchedule

    • node.kubernetes.io/not-ready:NoExecute(容忍300秒)

    • node.kubernetes.io/unreachable:NoExecute(容忍300秒)

  • nodeSelector:DaemonSet Pod同样受到nodeSelector限制。例如,若DaemonSet配置了nodeSelector: { disktype: ssd },则仅会在标签为disktype=ssd的节点上运行。

  • 亲和性配置:节点与Pod亲和性、反亲和性配置同样适用于DaemonSet。

说明

DaemonSet虽然可以实现部分调度策略,但这并非是它的设计目标。如果您需要执行较为复杂的调度,请考虑使用Deployment。关于DaemonSet的更多信息,请参见官方文档

查看kube-proxy Pods

Kubernetes默认组件kube-proxy就通过DaemonSet在每个节点部署,您可执行以下命令,查看kube-proxy所属Pod。

kubectl get pods --all-namespaces -o wide | grep kube-proxy

预期输出如下,在每个节点上都有kube-proxy Pod。由于kube-proxy采用hostNetwork模式(hostNetwork: true),因此PodIP与其所在节点相同。

kube-system     kube-proxy-worker-hfzkh     1/1     Running     0          2d21h   192.168.*.92    cn-shanghai.192.168.*.92   <none>           <none>
kube-system     kube-proxy-worker-pxnnf     1/1     Running     0          2d21h   192.168.*.11    cn-shanghai.192.168.*.11   <none>           <none>
kube-system     kube-proxy-worker-r2t26     1/1     Running     0          2d21h   192.168.*.7     cn-shanghai.192.168.*.7    <none>           <none>

创建DaemonSet

您可以通过控制台或kubectl两种方式创建DaemonSet。

通过控制台创建

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 守护进程集

  3. 守护进程集页面,单击使用镜像创建

  4. 由于DaemonSet的特性,控制台配置项与Deployment有以下不同:

    • 应用基本信息:DaemonSetPod数量由节点数量决定,因此没有副本数量配置。

    • 高级配置:因为相同的原因,DaemonSet同样没有伸缩配置

    其余配置项则与Deployment相同,请参见创建无状态工作负载Deployment中的配置项说明创建DaemonSet。

通过kubectl命令行创建

重要

创建工作负载前,请确保已通过kubectl连接到集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群

  1. 复制并保存以下YAML内容至daemonset.yaml文件中。

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: nginx-test
      namespace: default  # 根据需要更改命名空间
      labels:
        app: nginx
    spec:
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            resources:
              limits:
                cpu: '1'
                memory: 2Gi
              requests:
                cpu: 500m
                memory: 512Mi
  2. 执行以下命令创建DaemonSet。

    kubectl apply -f daemonset.yaml

    预期输出:

    daemonset.apps/nginx-test created
  3. 执行以下命令,查看DaemonSet Pod的详细信息。

    kubectl get pods --all-namespaces -o wide | grep nginx-test

    预期输出如下,每个节点都有一个pod在运行

    default     nginx-test-8mqvh     1/1     Running     0          3m38s   192.168.*.**    cn-shanghai.192.168.**.250   <none>           <none>
    default     nginx-test-ltlx6     1/1     Running     0          3m38s   192.168.*.**    cn-shanghai.192.168.**.98    <none>           <none>
    default     nginx-test-n6zrv     1/1     Running     0          3m38s   192.168.*.**    cn-shanghai.192.168.**.17    <none>           <none>

相关文档