K8S PDB和taint同时存在
一、PDB和Taint简介
PDB
由于一些人为的或者不可避免的原因,pod可能会中断,而使用Pod Disruption Budget可以最大限度地保证在pod中断发生时集群仍然保持能够接受的状态.
一句话,PDB能够限制同时中断的pod的数量,以保证集群的高可用性.
使用PodDisruptionBudget来保护集群
[root@qa-k8s-1-master eric]# kubectl get pdb
NAME MIN AVAILABLE MAX UNAVAILABLE ALLOWED DISRUPTIONS AGE
noah-php-demo-pdb N/A 2 0 6s
污点(taints)与容忍(tolerations)
对于nodeAffinity无论是硬策略还是软策略方式,都是调度 pod 到预期节点上,而Taints恰好与之相反,如果一个节点标记为 Taints ,除非 pod 也被标识为可以容忍污点节点,否则该 Taints 节点不会被调度 pod。
那么如果在设置了PDB的情况下同时有设置了污点,那么是按PDB还是污点方式迁移pod?我们接下来测试下到底谁的优先级更高。
二、创建PDB和给node打污点
创建pdb
[root@qa-k8s-1-master eric]# cat pdb.yaml
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: noah-php-demo-pdb
spec:
maxUnavailable: 2
selector:
matchLabels:
business_domain: noah-php-demo.vip.vip.com
[root@qa-k8s-1-master eric]# kubectl apply -f pdb.yaml
poddisruptionbudget.policy/noah-php-demo-pdb created
给node打上污点
支持kubectl edit node yaml方式,也可以用taint命令
annotations:
scheduler.alpha.kubernetes.io/taints: '[{"key":"xxx","operator":"Equal","value":"yyy","effect":"NoSchedule"}
operator可以定义为:
Equal 表示key是否等于value,默认
Exists 表示key是否存在,此时无需定义value
effect可以定义为:
NoSchedule 表示不允许调度,已调度的不影响
PreferNoSchedule 表示尽量不调度
NoExecute 表示不允许调度,已调度的在tolerationSeconds(定义在Tolerations上)后删除
这里使用NoExecute来立即触发容器重启
[root@qa-k8s-1-master eric]# kubectl taint node 10.189.108.141 key=value:NoExecute
node/10.189.108.141 tainted
同时立即去查看pod状态看看是只有maxUnavailable=2个重启还是所有的全部重启。
三、结论
从上面可以看到,当配置了PDB和污点的情况下,是以污点为优先级更高,会立即迁移走所有pod,PDB这时候是不生效的。