Kubernetes应用高可用保障:深入理解PodDisruptionBudget
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
概述
在Kubernetes集群管理中,确保应用的高可用性是一个关键目标。PodDisruptionBudget(PDB)是Kubernetes提供的一个强大机制,它允许应用管理员在集群维护操作(如节点排空或升级)期间,控制应用可以承受的中断程度。本文将深入解析PDB的工作原理、使用场景和最佳实践。
PDB基本概念
PodDisruptionBudget是一种Kubernetes资源对象,它定义了在自愿中断(voluntary disruptions)期间,应用可以容忍的Pod不可用数量或比例。自愿中断包括管理员主动执行的集群维护操作,如节点排空(drain)或集群升级等。
PDB的核心字段
一个PDB定义包含三个关键字段:
- selector:标签选择器,用于确定PDB保护哪些Pod
- minAvailable:必须保持可用的最小Pod数量或百分比
- maxUnavailable:允许的最大不可用Pod数量或百分比
注意:minAvailable和maxUnavailable是互斥的,一个PDB只能指定其中一个。
PDB使用场景分析
无状态前端服务
需求:确保服务容量不会减少超过10%
解决方案:设置minAvailable为90%
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: frontend-pdb
spec:
minAvailable: "90%"
selector:
matchLabels:
app: frontend
单实例有状态应用
需求:除非管理员明确沟通,否则不应终止此应用
解决方案1:不使用PDB,容忍偶尔的中断
解决方案2:设置maxUnavailable=0,并建立外部沟通机制
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: single-instance-pdb
spec:
maxUnavailable: 0
selector:
matchLabels:
app: critical-db
多实例有状态集群(如ZooKeeper、etcd)
需求:确保不会低于法定节点数
解决方案1:设置maxUnavailable=1(适用于不同规模的集群)
解决方案2:设置minAvailable为法定节点数(如3节点集群设为3)
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: zk-quorum-pdb
spec:
minAvailable: 3
selector:
matchLabels:
app: zookeeper
数值指定与舍入规则
PDB支持两种数值指定方式:
- 绝对数值:如minAvailable: 5表示必须保持5个Pod可用
- 百分比:如minAvailable: "50%"表示保持至少50%的Pod可用
百分比值会向上取整。例如,7个Pod设置minAvailable为"50%"时,Kubernetes会保持至少4个Pod可用(7×50%=3.5,向上取整为4)。
创建和管理PDB
创建PDB
通过YAML文件定义PDB:
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: myapp-pdb
spec:
maxUnavailable: 1
selector:
matchLabels:
app: myapp
然后应用该配置:
kubectl apply -f myapp-pdb.yaml
检查PDB状态
查看PDB状态:
kubectl get poddisruptionbudgets
输出示例:
NAME MIN AVAILABLE MAX UNAVAILABLE ALLOWED DISRUPTIONS AGE
myapp-pdb N/A 1 1 10m
获取详细状态信息:
kubectl get poddisruptionbudgets myapp-pdb -o yaml
高级主题
不健康Pod的驱逐策略
Kubernetes 1.26+引入了unhealthyPodEvictionPolicy
字段,控制不健康Pod的驱逐行为:
- IfHealthyBudget(默认):只有当应用未中断时,才允许驱逐不健康Pod
- AlwaysAllow:总是允许驱逐不健康Pod,即使应用已经中断
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: myapp-pdb
spec:
maxUnavailable: 1
unhealthyPodEvictionPolicy: AlwaysAllow
selector:
matchLabels:
app: myapp
非标准工作负载的限制
对于不由标准控制器管理的Pod,使用PDB有以下限制:
- 只能使用minAvailable,不能使用maxUnavailable
- minAvailable必须使用绝对数值,不能使用百分比
最佳实践
- 为关键应用配置PDB:特别是那些需要高可用的有状态服务
- 合理设置阈值:考虑应用的容错能力和业务需求
- 监控PDB状态:定期检查PDB的
ALLOWED DISRUPTIONS
值 - 配合就绪探针使用:确保PDB能准确判断Pod健康状态
- 考虑集群维护窗口:在计划维护前,可以临时调整PDB
注意事项
- PDB仅保护应用不受自愿中断影响,无法防止节点故障等非自愿中断
- 设置maxUnavailable为0或minAvailable为100%可能导致节点无法排空
- 多个PDB不应选择相同的Pod,否则可能导致意外行为
通过合理使用PodDisruptionBudget,您可以确保Kubernetes集群中的关键应用在维护期间保持高可用性,同时又不妨碍必要的集群管理操作。
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考