在 Kubernetes 中,污点(Taints)和容忍度(Tolerations)是用于节点调度的一种机制,它们允许你控制哪些 Pod 能够调度到哪些节点上。
污点是节点上的一种属性,它会阻止未经授权的 Pod 调度到该节点上。当你在节点上设置了一个污点时,只有那些具有匹配容忍度的 Pod 才能够在该节点上被调度。
作用方式:污点通过给节点添加标签的方式生效。
语法:污点由 key、value 和 effect 三个部分组成。
key:污点的名称。
value:污点的值。
effect:污点的影响,可以是 “NoSchedule”(默认)或 “PreferNoSchedule”。“NoSchedule” 表示将阻止未经容忍的 Pod 调度到该节点上,而 “PreferNoSchedule” 表示尽量不在该节点上调度未经容忍的 Pod,但不是绝对禁止。
kubectl taint nodes node01 key1=value1:NoSchedule
# 查看所有节点的是否有污点
[root@master01 ~]# kubectl describe node | grep -i taint
Taints: <none>
Taints: <none>
Taints: <none>
Taints: key1=value1:NoSchedule
Taints: <none>
kubectl taint nodes node1 key1=value1:NoSchedule-
容忍度是 Pod 的一个属性,它允许 Pod 被调度到带有指定污点的节点上。如果 Pod 具有与节点上设置的污点匹配的容忍度,则它可以被调度到该节点上。
作用方式:通过在 Pod 的 YAML 配置中添加 tolerations 来指定。
语法:容忍度由 key、operator、value、effect 四个部分组成。
key:与节点上设置的污点的 key 匹配。
operator:用于指定匹配规则,常见的有 “Equal”、“Exists”、“Exists”。
value:与节点上设置的污点的 value 匹配。
effect:与节点上设置的污点的 effect 匹配。
这是部分yaml文件内容,添加容忍度其实类似于添加标签。
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
根据咱们上面添加的污点设置一下nginx Pod容忍度。
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
tolerations:
- key: "key1"
value: "value1"
operator: "Exists"
effect: "NoSchedule"
operator: "Equal"
部署这个Pod以后将会调度到node01上面。
operator 字段解释:
effect 字段解释
举个例子:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: nginx
image: nginx
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoExecute"
tolerationSeconds: 3600 # 容忍度持续时间为 3600 秒(1 小时),超过这个时间仍然会呗驱逐。
通过污点和容忍度的组合,你可以精确地控制 Pod 在 Kubernetes 集群中的调度行为,确保特定类型的任务被分配到特定类型的节点上,从而更好地管理资源和提高系统的稳定性和可靠性。