【Kubernetes】污点和容忍
一、概述
在 Kubernetes(k8s)中,污点(Taints) 是定义在节点上的一种机制,用于拒绝某些 Pod 调度到该节点,除非这些 Pod 具有对应的容忍度(Tolerations)。污点可以用来控制 Pod 的调度行为,确保特定的 Pod 不会被分配到不合适的节点上。
容忍(Tolerations) 是与污点(Taints)相对应的一种机制。容忍允许 Pod 被调度到带有特定污点的节点上,或者在节点被添加了特定污点后,允许已经运行在该节点上的 Pod 继续运行。简而言之,容忍是对污点的一种“豁免”机制。
污点的组成
-
Key:污点的键,用于标识污点的类型。
-
Value:污点的值,通常与 Key 一起用于标识污点的具体属性。
-
Effect:污点的作用效果,有以下三种类型:
-
NoSchedule:没有配置此污点容忍度的新 Pod 不能调度到此节点,但节点上已存在的 Pod 不受影响。
-
PreferNoSchedule:没有配置此污点容忍度的新 Pod 尽量不要调度到此节点,但如果找不到合适的节点,仍然会调度到此节点。
-
NoExecute:没有配置此污点容忍度的新 Pod 不能调度到此节点,同时节点上已存在的 Pod 也会被驱逐。
-
污点的使用场景
-
独占节点:通过给节点添加污点,可以确保只有特定的 Pod 能够调度到该节点。例如,某些节点可能具有特殊的硬件资源(如 GPU),可以通过污点和容忍度来限制只有特定的 Pod 能够使用这些节点。
-
驱逐 Pod:当节点出现故障或资源不足时,Kubernetes 会自动为节点添加污点(如
node.kubernetes.io/memory-pressure
),并使用NoExecute
作为排斥等级,此时没有设置此类污点容忍度的 Pod 会被驱逐。
污点的操作
-
添加污点:可以使用
kubectl taint
命令为节点添加污点。例如:kubectl taint nodes <node-name> <key>=<value>:<effect>
-
查看污点:可以使用
kubectl describe node
命令查看节点的污点信息:kubectl describe node <node-name> | grep 'Taints'
-
删除污点:可以使用
kubectl taint
命令删除节点的污点:kubectl taint nodes <node-name> <key>=<value>:<effect>-
二、PreferNoSchedule
kubectl taint node node1 tag=huaiche:PreferNoSchedule
三、NoSchedule
kubectl taint node node1 tag=huaiche:NoSchedule
四、NoExecute
kubectl taint node node1 tag=huaiche:NoExecute
五、编写容忍对应污点的Pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
tolerations:
- key: "check-nginx"
operator: "Equal"
value: "web"
effect: "NoSchedule"
containers:
- name: my-container
image: my-image