一、概念
-
污点与容忍
污点taints定义在节点之上的键值型属性数据。当节点被标记为有污点,那么意味着不允许pod调度到该节点。
容忍tolerations是定义在 Pod对象上的键值型属性数据。被打上污点的节点,如果同时被pod标记为可以容忍污点的节点,则允许pod调度到该节点。。
ps:在使用kubeadm部署的k8s集群的时候应该会发现,通常情况下,应用不会调度到master节点。因为默认给master节点加了污点。
1)污点一般打在节点上,且一个节点可以配置使用多个污点
2)容忍是标注在pod(资源控制器)上的。一个Pod(资源控制器)也可以有多个容忍度。启动pod一般不会调度在有污点的节点上,除非该pod标注了这些污点的容忍,才可以被调度。
-
污点配置类型
1)Noschdule:如果Pod不能忍受这类污点,则该污点节点后续不会进行pod调度,已经创建的pod不会受到影响。
2)NoExecute:如果Pod不能忍受这类污点,则该污点节点会马上驱除该节点上所有非kube-system空间的所有pod节点。3)PreferNoSchedule: NoSchedule的软约束,即该污点节点后续基本不会进行pod调度,但是无其他节点可供调度时,才允许调度到该节点。已经创建的pod不会受到影响。
二、相关操作
-
为节点打上污点:kubectl taint node worker1 key=value:NoSchedule
-
移除污点:kubectl taint node k8s-master key=value:Noschedule-
-
查看污点指令:kubectl taint -h
-
pod配置容忍
# pod的 spec下面配置容忍 tolerations: - key: "污点的 key" value: "污点的value" offect: "NoSchedule" #污点产生的影响 operator: "Equal" #1.Equal:pod和节点的key+value都要相等。2.Exists:pod和节点的key相等即可。 tolerationSeconds: 时间(s) #tolerationSeconds不设置,则Pod会一直在满足容忍的节点上一直执行。
三、实操污点NoSchedule
-
给worker1节点打上污点:kubectl taint no worker1 key1=value1:NoSchedule
-
查看节点: kubectl describe no worker1
-
编写yaml清单:vi deployment-nginx.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: deployment-nginx #Deployment 的名称 labels: app: nginx spec: replicas: 3 # 创建 Pod 的副本数 selector: #定义 Deployment 如何找到要管理的 Pod,与 template 的 label(标签)对应 matchLabels: app: nginx template: #字段包含以下字段: metadata: labels: app: nginx #使用 label(标签)标记 Pod spec: #表示 Pod 运行一个名字为 nginx 的容器 containers: - name: nginx image: nginx:1.15 #表示 Pod 运行一个名字为 nginx 的容器 ports: #容器用于发送和接收流量的端口 - containerPort: 80
-
创建:kubectl apply -f deployment-nginx.yaml
-
查看,发现worker1上面没有调度pod:kubectl get pod -o wide
-
移除污点:kubectl taint no worker1 key1=value1:NoSchedule-
四、实操污点NoExecute
-
删除所有pod:kubectl delete -f deployment-nginx.yaml
-
重新部署:kubectl apply -f deployment-nginx.yaml
-
查看:kubectl get pod -o wide
-
设置NoExecute:kubectl taint no worker1 key1=value1:NoExecute
-
查看节点:kubectl get pod -o wide
ps:可以看到,除了kube-system空间以外的其他空间,所有worker1上的pod都被驱除
五、实操容忍
-
在deployment-nginx上设置污点容忍,然后再次查看:vi deployment-nginx.yaml
tolerations: - key: "key1" operator: "Equal" value: "value1" effect: "NoExecute"
完整配置
apiVersion: apps/v1 kind: Deployment metadata: name: deployment-nginx labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: tolerations: - key: "key1" operator: "Equal" value: "value1" effect: "NoExecute" containers: - name: nginx image: nginx:1.15 ports: - containerPort: 80
-
更新:kubectl apply -f deployment-nginx.yaml
-
查看pod:kubectl get pod -o wide
-
测试完还原,删除污点:kubectl taint no worker1 key1=value1:NoExecute-