介绍
PDB(PodDisruptionBudget)是为了自主中断时(除了节点crash)保障应用的高可用。
在使用 PDB 时,你需要弄清楚你的应用类型以及你想要的应对措施:
- 无状态应用:
- 目标:至少有60%的副本 Available。
- 方案:创建 PDB Object,指定 minAvailable 为60%,或者 maxUnavailable 为 40%。
- 单实例的有状态应用:
- 目标:终止这个实例之前必须提前通知客户并取得同意。
- 方案:创建 PDB Object,并设置 maxUnavailable 为0。
- 多实例的有状态应用:
- 目标:最少可用的实例数不能少于某个数N,例如 etcd。
- 方案:设置 maxUnavailable=1或者 minAvailable=N,分别允许每次只删除一个实例和每次删除 expected_replicas-minAvailable 个实例。
移除节点步骤
- 将node置为不可调度。
kubectl cordon snode name>
- 执行 node drain 排空节点,将其上运行的 Pod 平滑迁移
至其他节点。kubectl drain <node name>
- 如果应用不可中断,就需要设置pdb。
- 设置了pdb后,kubelet在驱逐pod时,会去看pdb的配置,校验这个应用比如deployment最少需要多少个实例,如果驱逐了pod后不满足这个数量,驱逐就会失败,确保应用不受影响。这时可以人工干预。
实例
- 创建并应用nginx deployment
cat nginx-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx k apply -f nginx-deployment.yaml
- 创建pdb
cat pdb.yaml apiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: nginx-deployment spec: minAvailable: 1 selector: matchLabels: app: nginx k apply -f pdb.yaml
- 解码kubeconfig
cat ~/.kube/config echo 'xxx' | base64 -d > admin.crt echo 'xxx' | base64 -d > admin.key
- 创建eviction.json文件
cat eviction.json { "apiVersion": "policy/v1", "kind": "Eviction", "metadata": { "name": "nginx-deployment-75f4d489b4-b6grv", "namespace": "default" } }
- 通过evict api驱逐pod
curl -v -H 'Content-type: application/json' --key admin.key --cert admin.crt https://192.168.0.6:6443/api/v1/namespaces/default/pods/nginx-deployment-75f4d489b4-b6grv/eviction -d @eviction.json -k
- 查看pod
nginx-deployment-75f4d489b4-b6grv pod已经被重建。
- 编辑pdb,修改minAvailable为3
k edit pdb
ALLOWED DISRUPTIONS为0代表一个都不能驱逐。 - 修改nginx pod,再次驱逐
需要3个healthy pod,现在有3个,所以驱逐失败了。
注意
如果你将pdb中的minAvailable设置为0,那么这个节点就不能操作下线等操作了。