k8s 集群中可能管理着非常庞大的服务器,这些服务器可能是各种各样不同类型的,比如机房、地理位置、配置等,有些是计算型节点,有些是存储型节点,此时我们希望能更好的将 pod 调度到与之需求更匹配的节点上。
此时就需要用到污点(Taint)和容忍(Toleration),这些配置都是 key: value 类型的。
K8S的污点和容忍是其中一种高级调度功能,作用是让 Kubernetes 集群中的节点有选择地接受或拒绝来自不同类型 Pod 的调度请求,可以帮助运维人员更好地管理、调度和控制应用程序的部署。
在节点上设置污点,当我们在一个节点上打上污点以后,k8s 会认为尽量不要将 pod 调度到该节点上。
配置污点主要分为两类
设置了 NoSchedule 污点的节点将不会被调度器分配新的 Pod,但已经运行的 Pod 不受影响。这个污点用于标记节点暂时无法接受新的 Pod 的情况,例如节点维护或故障。
设置了 NoExecute 污点的节点将不会被调度器分配新的 Pod,并且已经运行在该节点上的 Pod,如果它们不容忍该污点,则会被驱逐出该节点。这个污点用于标记节点上的某些服务或资源已经不再可用,而正在运行的 Pod 需要尽快迁移到其他节点。
“软性”的 NoSchedule
,尽量避免往该节点上调度,但不能保证完全避免
# 为节点打上污点, 这里的key和value是自定义的标签,主要作用是为了解释为什么打污点
kubectl taint node k8s-master key=value:NoExecute
# 移除污点,就是打污点的命令后面加一个-
kubectl taint node k8s-master key=value:NoSchedule-
# 查看污点
kubectl describe no k8s-master
------------------- 看Taints数据
Taints: node-role.kubernetes.io/master:NoSchedule
在K8S中,master节点默认有一个NoSchedule类型的污点,现在我是想通过配置污点的方式将一个运行在节点1的pod转移到 master节点上。
1、去除master污点
kubectl taint node node-role.kubernetes.io/master:NoSchedule-
2、给节点1添加一个NoExecute 类型的污点
kubectl taint node k8s-node1 ceshi=t:NoExecute
做完这两步之后就会发现pod转移到master节点上运行了
容忍是标注在 pod 上的,当 pod 被调度时,如果没有配置容忍,则该 pod 不会被调度到有污点的节点上,只有该 pod 上标注了满足某个节点的所有污点,则可能会被调度到这些节点
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
#容忍配置
tolerations:
- key: "test"
operator: "Equal"
value: "t"
effect: "NoSchedule"
表示要匹配的污点的键(Key),就是标签的key。必须与节点上设置的污点键一致。
表示匹配操作符,可以取值为 “Equal”、“Exists” 或 “DoesNotExist”,分别表示完全匹配、存在匹配和不存在匹配。如果为Exists,则不需要value
标签的值
表示匹配效果(Effect),可以取值为 “NoSchedule”、“PreferNoSchedule” 或 “NoExecute”,分别表示不可调度、尽量避免调度和驱逐。
这四个参数中,前三个主要是为了匹配标签的key-value,effect匹配污点类型
存在两种特殊情况:
如果一个容忍度的
key
为空且operator
为Exists
, 表示这个容忍度与任意的 key、value 和 effect 都匹配,即这个容忍度能容忍任何污点。如果
effect
为空,则可以与所有键名key1
的效果相匹配。