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个重启还是所有的全部重启。
Pod_Status.png

三、结论

从上面可以看到,当配置了PDB和污点的情况下,是以污点为优先级更高,会立即迁移走所有pod,PDB这时候是不生效的。

posted @ 2020-09-04 14:17  无知是恶  阅读(302)  评论(0编辑  收藏  举报