其他
Kubernetes 污点与容忍详解
来源:https://ops.fwy.pub/taint-and-toleration-in-k8s/
taint 基本用法
设置污点: kubectl taint node [node] key=value:[effect]
其中[effect] 可取值:[ NoSchedule | PreferNoSchedule | NoExecute ]: #示例:kubectl taint node test test=16:NoSchedule
NoSchedule :一定不能被调度。 PreferNoSchedule:尽量不要调度。 NoExecute:不仅不会调度,还会驱逐Node上已有的Pod。 去除污点: kubectl taint node [node] key:[effect]-
#比如设置污点:
kubectl taint node test test=16:NoSchedule
kubectl taint node test test=16:NoExecute
#去除指定key及其effect:
kubectl taint nodes node_name key:[effect]- #(这里的key不用指定value)
#去除指定key所有的effect:
kubectl taint nodes node_name key-
#示例:
kubectl taint node test test:NoSchedule-
kubectl taint node test test:NoExecute-
kubectl taint node test test-
kubectl taint nodes node1 key=value:NoSchedule
apiVersion: v1
kind: Pod
metadata:
name: pod-taints
spec:
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
containers:
- name: pod-taints
image: busybox:latest
也可以写成如下:
tolerations:
- key: "key"
operator: "Exists"
effect: "NoSchedule"
toleration 用法
operator的值为Exists,这时无需指定value operator的值为Equal并且value相等
如果不指定operator,则默认值为Equal。
空的key配合Exists操作符能够匹配所有的键和值 空的effect匹配所有的effect
NoSchedule:如果一个pod没有声明容忍这个Taint,则系统不会把该Pod调度到有这个Taint的node上 PreferNoSchedule:NoSchedule的软限制版本,如果一个Pod没有声明容忍这个Taint,则系统会尽量避免把这个pod调度到这一节点上去,但不是强制的。 NoExecute:定义pod的驱逐行为,以应对节点故障。NoExecute这个Taint效果对节点上正在运行的pod有以下影响: 没有设置Toleration的Pod会被立刻驱逐 配置了对应Toleration的pod,如果没有为tolerationSeconds赋值,则会一直留在这一节点中 配置了对应Toleration的pod且指定了tolerationSeconds值,则会在指定时间后驱逐
从kubernetes1.6版本开始引入了一个alpha版本的功能,即把节点故障标记为Taint(目前只针对node unreachable及node not ready,相应的NodeCondition "Ready"的值为Unknown和False)。激活TaintBasedEvictions功能后(在--feature-gates参数中加入TaintBasedEvictions=true),NodeController会自动为Node设置Taint,而状态为"Ready"的Node上之前设置过的普通驱逐逻辑将会被禁用。注意,在节点故障情况下,为了保持现存的pod驱逐的限速设置,系统将会以限速的模式逐步给node设置Taint,这就能防止在一些特定情况下(比如master暂时失联)造成的大量pod被驱逐的后果。这一功能兼容于tolerationSeconds,允许pod定义节点故障时持续多久才被逐出。
多污点与多容忍配置
如果剩余的Taint中存在effect=NoSchedule,则调度器不会把该pod调度到这一节点上。 如果剩余的Taint中没有NoSchedule的效果,但是有PreferNoSchedule效果,则调度器会尝试不会pod指派给这个节点 如果剩余Taint的效果有NoExecute的,并且这个pod已经在该节点运行,则会被驱逐;如果没有在该节点运行,也不会再被调度到该节点上。
kubectl taint nodes node1 key1=value1:NoSchedule
kubectl taint nodes node1 key1=value1:NoExecute
kubectl taint nodes node1 key2=value2:NoSchedule
在pod上设置两个toleration:
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoExecute"
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
tolerationSeconds: 3600
常见应用场景节点独占
kubectl taint nodes test dedicated=groupName:NoSchedule
1. 具有特殊硬件设备的节点
kubectl taint nodes test special=true:NoSchedule
kubectl taint nodes test special=true:PreferNoSchedule
2. 应对节点故障
tolerations:
- key: "node.alpha.kubernetes.io/unreachable"
operator: "Exists"
effect: "NoExecute"
tolerationSeconds: 6000
对于Node未就绪状态,可以把key设置为node.alpha.kubernetes.io/notReady
。
如果没有为pod指定node.alpha.kubernetes.io/noReady的Toleration,那么Kubernetes会自动为pod加入tolerationSeconds=300的node.alpha.kubernetes.io/notReady类型的toleration。
如果没有为pod指定node.alpha.kubernetes.io/unreachable的Toleration,那么Kubernetes会自动为pod加入tolerationSeconds=300的node.alpha.kubernetes.io/unreachable类型的toleration。
这些系统自动设置的toleration用于在node发现问题时,能够为pod确保驱逐前再运行5min。这两个默认的toleration由Admission Controller "DefaultTolerationSeconds"自动加入。
- END -
往期推荐:
据说 90% 以上的IT工程师都达不到这个作息时间表
构建和管理容器的 10 个技巧