在 Kubernetes 中,调度亲和性和反亲和性,特别是通过污点(Taints)和容忍(Tolerations)机制,可以帮助管理员更加精细地控制 Pod 在节点上的分布。以下是有关实战操作的例子:
污点(Taints)
创建一个带有污点的节点:
# 假设有一个名为 node1 的节点
kubectl taint nodes node1 key=value:effect
# 其中:
# - key:污点的键名
# - value:污点的值
# - effect:污点的影响效果,可以是 NoSchedule、PreferNoSchedule 或者 NoExecute
例如,阻止所有 Pod 在节点上调度:
kubectl taint nodes node1 dedicated=special-user:NoSchedule
容忍(Tolerations)
创建一个带有容忍度的 Pod:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
tolerations:
- key: "dedicated"
operator: "Equal"
value: "special-user"
effect: "NoSchedule"
containers:
- name: my-container
image: my-app:v1
在这个例子中,Pod my-pod
具有对 dedicated=special-user:NoSchedule
这个污点的容忍,意味着尽管 node1
被标记为不允许调度普通 Pod,但这个 Pod 仍然可以被调度到 node1
上。
清除污点
如果你想移除节点上的污点,可以这样操作:
kubectl taint nodes node1 dedicated:special-user-
这里的 -
表示清除指定键名的污点。
示例解释
- 污点(Taints)的作用是让调度器避免将不具备相应容忍度的 Pod 调度到带有特定污点的节点上。
- 容忍(Tolerations)则是 Pod 明确表达自己可以接受某种污点的能力,也就是说,它愿意在这样的节点上运行。
这种机制可以帮助集群管理员实施特定的资源隔离策略,比如将一部分节点专门留给特定的用户或任务类型使用。同时,结合调度器的其他策略,如节点选择器(nodeSelector)和亲和性规则(affinity rules),可以实现复杂的资源调度策略。