1.理论详解
1.1 NodeAffinity节点亲和性,是在pod上定义的一种属性,使pod能够按照我们要求调度到某个node上。而Taints正好相反,它可以让node拒绝pod,甚至驱逐。
1.2 Taints(污点)是node上定义的一种属性,给node设置完污点后,k8s不会将pod调度到这个node上,于是k8s就给pod设置了另一种属性Tolerations(容忍),只要pod能够容忍node上的污点,那么k8s就会忽略node上的污点,就能够(不是必须)把pod调度到有污点的node上。
因此 Taints(污点)通常与Tolerations(容忍)配合使用。
2.设置污点
kubectl taint node [node] key=value[effect]
其中[effect] 可取值: [ NoSchedule | PreferNoSchedule | NoExecute ]
NoSchedule :一定不能被调度。
PreferNoSchedule:尽量不要调度。
NoExecute:不仅不会调度,还会驱逐Node上已有的Pod。
示例:
[root@k8s-master ~]# kubectl describe node k8s-node1 |grep Taints
Taints: <none>
[root@k8s-master ~]# kubectl taint node k8s-node1 key=value:NoSchedule
node/k8s-node1 tainted
[root@k8s-master ~]# kubectl describe node k8s-node1 |grep Taints
Taints: key=value:NoSchedule
3.取消污点
去除指定key及其effect:
kubectl taint nodes node_name key:[effect]- #(这里的key不用指定value)
去除指定key所有的effect:
kubectl taint nodes node_name key-
示例:
#比如先设置污点:
kubectl taint node k8s-node1 key=value:NoSchedule
kubectl taint node k8s-node1 key=value:NoExecute
#去除指定key及其effect:
[root@k8s-master ~]# kubectl taint node k8s-node1 key:NoExecute-
node/k8s-node1 untainted
[root@k8s-master ~]# kubectl taint node k8s-node1 key:NoSchedule-
node/k8s-node1 untainted
#去除指定key所有的effect:
[root@k8s-master ~]# kubectl taint node k8s-node1 key-
node/k8s-node1 untainted
4.示例
给k8s-node1 设置一个污点,该Taint(污点)的键为dev,值为yundi,Taint的效果是NoSchedule。这意味着pod明确声明可以容忍这个taint(污点),否则就不会调度到这个node上。
kubectl taint node k8s-node1 dev=yundi:NoSchedule
然后需要在pod上声明Tolerations(容忍度),下面的Tolerations表示可以容忍具有该taint的node,使pod能够调度到有该污点的node上。
apiVersion: v1
kind: Pod
metadata:
name: test
spec:
tolerations:
- key: "dev"
operator: "Equal"
value: "yundi"
effect: "NoSchedule"
containers:
- name: test
image: busybox:latest
也可以写成这种
tolerations:
- key: "dev"
operator: "Exists"
effect: "NoSchedule"
网友评论