在Kubernetes的世界里,污点(Taints)和容忍度(Tolerations)是一对好基友,它们一起帮助我们管理Pods在集群中的分布。简单来说,污点就是给节点打上标签,告诉K8s调度器:“这个节点有特殊需求,不是所有Pods都能来。” 而容忍度则是Pods的通行证,告诉调度器:“别担心,我能适应这个特殊需求。”
污点(Taints)
污点是节点上的标记,用来告诉调度器哪些Pods不能调度到这个节点上。污点有三个参数:键(Key)、值(Value)和效果(Effect)。
- 效果:有三种,
NoSchedule
(不允许调度)、PreferNoSchedule
(尽量不调度)、NoExecute
(不允许调度,并且驱逐已有的不兼容Pods)。
容忍度(Tolerations)
容忍度是Pods的属性,用来告诉调度器:“我可以容忍某些污点。” 一个Pod可以有多个容忍度,每个容忍度对应一个污点的键、值和效果。
实战演练
-
给节点打上污点
假设我们有一个节点叫
node1
,我们希望只有特定的Pods能调度到这个节点上。我们可以给这个节点打上一个污点:kubectl taint nodes node1 special=true:NoSchedule
这条命令给
node1
节点打上了一个污点,键是special
,值是true
,效果是NoSchedule
。 -
创建一个能容忍污点的Pod
为了让Pod能够调度到带有上述污点的节点上,我们需要在Pod的定义中添加容忍度:
apiVersion: v1
kind: Pod
metadata:
name: special-pod
spec:
containers:
- name: my-container
image: nginx
tolerations:
- key: "special"
operator: "Equal"
value: "true"
effect: "NoSchedule"在这个Pod定义中,
tolerations
部分告诉调度器,这个Pod可以容忍键为special
,值为true
,效果为NoSchedule
的污点。
总结
- 灵活性:污点和容忍度提供了一种灵活的方式来控制Pods的调度,可以根据需要轻松地对节点进行标记和对Pods进行配置。
- 安全性:通过合理使用污点和容忍度,可以提高集群的安全性,例如,可以将关键的Pods调度到特定的安全节点上。
- 资源隔离:在多租户环境中,污点和容忍度可以帮助实现资源隔离,确保不同用户或团队的Pods不会相互干扰。