taints 内容包括 key、value、effect:
key 就是配置的键值
value 就是内容
effect 是标记了这个 taints 行为是什么
目前 Kubernetes 里面有三个 taints 行为:
NoSchedule 禁止新的 Pod 调度上来
PreferNoSchedul 尽量不调度到这台
k8s的master节点本身就带有effect类型为NoSchedule的污点,这也是为什么k8s在调度Pod时,不会调度到master节点的原因,具体查看如下:(Kubeadm在安装初始化init的时候给master打上了污点,其余节点是没有该污点的。Master节点主要任务是管理集群的,不应该跑具体的业务应用。所以不允许pod落在master节点)
[root@k8s-master ~]# kubectl describe node k8s-master
Taints: node-role.kubernetes.io/master:NoSchedule
kubectl taint nodes k8s-master node-role.kubernetes.io/master=:NoSchedule
注意⚠️ : 为master设置的这个taint中, node-role.kubernetes.io/master
为key
, value
为空, effect
为NoSchedule
- 封锁节点 (设为不可调度,避免新的 Pod 调度上来)。
- 将该节点上的 Pod 删除。
- ReplicaSet 控制器检测到 Pod 减少,会重新创建一个 Pod,调度到新的节点上。
设置节点不可以调度
[root@k8s-master ~]# kubectl cordon k8s-node1
[root@k8s-master ~]# kubectl describe node k8s-node1
node.kubernetes.io/unschedulable:NoSchedule
设置将节点上pod驱逐
# kubectl drain node2 --force --ignore-daemonsets
kubectl drain操作会将相应节点上的旧Pod删除,并在可调度节点上面起一个对应的Pod。当旧Pod没有被正常删除的情况下,新Pod不会起来。
例如:旧Pod一直处于Terminating
状态。
对应的解决方式是通过重启相应节点的kubelet,或者强制删除该Pod。
# 重启发生`Terminating`节点的kubelet
systemctl restart kubelet
# 强制删除`Terminating`状态的Pod
kubectl delete pod <PodName> --namespace=<Namespace> --force --grace-period=0
#节点恢复正常后, 设置节点为可调度
kubectl uncordon k8s-node1