介绍
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,那么这个节点就不能操作下线等操作了。