Kubernetes 在Master节点上运行DaemonSet

本文介绍如何在Kubernetes Master节点存在Taints的情况下,通过在DaemonSet的PodSpec层级添加Tolerations,使DaemonSet能运行在所有节点上。通过具体步骤和实例,展示了如何配置Tolerations以应对不同类型的Taints。

通常Kubernetes Master节点上会有污点Taints,如果希望DaemonSet运行在Kubernetes所有节点上则需要在Pod Spec层级添加对应tolerations。

1. 查看Master节点Tolerations

可以通过kuberctl describe nodes 查看指定Master Taints

[root@k8s~]# kubectl describe nodes kubernetes-master01
Name:               kubernetes-master01
Roles:              controlplane,etcd
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=kubernetes-master01
                    kubernetes.io/os=linux
                    node-role.kubernetes.io/controlplane=true
                    node-role.kubernetes.io/etcd=true
Annotations:        flannel.alpha.coreos.com/backend-data: {"VtepMAC":"ca:89:74:c4:d1:5d"}
                    flannel.alpha.coreos.com/backend-type: vxlan
                    flannel.alpha.coreos.com/kube-subnet-manager: true
                    flannel.alpha.coreos.com/public-ip: 10.10.10.1
                    node.alpha.kubernetes.io/ttl: 0
                    projectcalico.org/IPv4IPIPTunnelAddr: 10.42.1.1
                    rke.cattle.io/external-ip: 10.10.10.1
                    rke.cattle.io/internal-ip: 10.10.10.1
                    volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp:  Sat, 27 Jun 2020 19:06:44 +0800
Taints:             node-role.kubernetes.io/etcd=true:NoExecute
                    node-role.kubernetes.io/controlplane=true:NoSchedule
Unschedulable:      false
Lease:
  HolderIdentity:  kubernetes-master01
  AcquireTime:     <unset>
  RenewTime:       Sun, 19 Jul 2020 17:30:00 +0800

2. 在DaemonSet YAML中配置Tolerations

  在pod spec层级下添加tolerations对应Master节点上的Taints。

---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset-test
  namespace: demo
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      tolerations:
        - key: node-role.kubernetes.io/controlplane
          operator: Exists
          effect: NoSchedule
        - key: node-role.kubernetes.io/etcd
          operator: Exists
          effect: NoExecute
      containers:
        - name: nginx
          image: nginx:latest
          imagePullPolicy: IfNotPresent

3. 查看效果

可以看到DaemonSet在Kubernetes所有节点上都运行了一个Pod。

[root@k8s ~]# kubectl get pod -n demo -o wide
NAME                   READY   STATUS    RESTARTS   AGE   IP            NODE                  NOMINATED NODE   READINESS GATES
daemonset-test-9tq2n   1/1     Running   0          26m   10.42.2.2     kubernetes-master03   <none>           <none>
daemonset-test-pxqdf   1/1     Running   0          26m   10.42.0.2     kubernetes-master02   <none>           <none>
daemonset-test-gxc8j   1/1     Running   0          26m   10.42.1.3     kubernetes-master01   <none>           <none>
daemonset-test-2vd94   1/1     Running   0          26m   10.42.5.93    kubernetes-node01     <none>           <none>
daemonset-test-wnsdc   1/1     Running   0          26m   10.42.4.145   kubernetes-node03     <none>           <none>
daemonset-test-zz9wp   1/1     Running   0          26m   10.42.3.22    kubernetes-node02     <none>           <none>

 

Kubernetes 中,若希望 DaemonSet 仅在主节点master nodes)上运行,需要结合 **Taint(污点)** 和 **Toleration(容忍度)** 机制,以及 **Node Selector** 或 **Node Affinity** 来实现。 ### 1. 主节点的默认污点 Kubernetes节点通常带有默认的污点 `node-role.kubernetes.io/master:NoSchedule` 或 `node-role.kubernetes.io/control-plane:NoSchedule`,用于防止普通 Pod 被调度到主节点运行。因此,若希望 DaemonSet 能在主节点运行,必须为其配置相应的容忍度[^1]。 ### 2. 配置 DaemonSet 的容忍度 在 DaemonSet 的 Pod 模板中添加与主节点污点匹配的容忍度,例如: ```yaml tolerations: - key: node-role.kubernetes.io/master operator: Exists effect: NoSchedule ``` ### 3. 使用 Node Selector 或 Node Affinity 限制节点范围 为了确保 DaemonSet 仅在主节点运行,还需通过 `nodeSelector` 或 `affinity` 明确指定目标节点。例如使用 `nodeSelector`: ```yaml nodeSelector: node-role.kubernetes.io/master: "" ``` 或者使用更灵活的 `nodeAffinity`: ```yaml affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-role.kubernetes.io/master operator: Exists ``` ### 4. 完整示例 以下是一个完整的 DaemonSet 配置示例,确保其 Pod 仅在主节点运行: ```yaml apiVersion: apps/v1 kind: DaemonSet metadata: name: daemonset-on-master spec: selector: matchLabels: app: daemonset-on-master template: metadata: labels: app: daemonset-on-master spec: tolerations: - key: node-role.kubernetes.io/master operator: Exists effect: NoSchedule containers: - name: main-container image: nginx nodeSelector: node-role.kubernetes.io/master: "" ``` ### 5. 注意事项 - 确保主节点标签未被修改或删除,否则 `nodeSelector` 或 `affinity` 可能无法正确匹配节点。 - 若使用的是 Kubernetes 1.24 及以上版本,主节点标签可能为 `node-role.kubernetes.io/control-plane`,需相应调整容忍度和选择器。 - 需确保主节点允许运行非核心组件的 Pod,部分集群可能默认禁止此类操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值