做为一个合格的运维,如何保障服务7X24小时可用是核心思考,在实际生产应用中,不可避免的会发生各种中断,分别是自愿中断(人或者程序所有者发起的中断)和非自愿中断(各类故障或者资源不足引起的中断)。在应对非自愿中断中,Kubernetes通过健康检测机制,以及1.18版本后的优先级机制进行了解决。但实际工作中,非自愿中断是最好预防和解决的,只需要做好相应的架构和预案即可,而最难预防的恰恰是自愿中断,人的操作往往危害更大,并且更难预防。为了应对这个问题,Kubernetes推出了PodDisruptionBudget(Pod中断预算,简称PDB),用以定义在自愿中断期间,集群可以容忍的Pod最大不可用数量。
PDBs的关键特性
-
最小可用(Min Available): 通过指定最小可用Pod数量,确保在中断期间至少有这么多的Pod保持运行。这对于维持服务的基本运行至关重要。
-
最大不可用(Max Unavailable): 通过指定最大不可用Pod数量,限制在中断期间可以被驱逐的Pod数量。这有助于避免大规模的服务中断。
-
选择器(Selector): PDBs使用选择器来确定哪些Pod受到保护。只有匹配选择器的Pod才会受到PDB的限制。
-
优先级(Priority): PDBs可以与
PriorityClass
结合使用,为不同优先级的Pod设置不同的中断预算。
如何创建和使用PDBs
创建PDB的基本步骤如下:
-
定义PDB: 创建一个YAML文件,定义PDB的规格,包括最小可用Pod数量、最大不可用Pod数量以及选择器。
apiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: my-pdb spec: minAvailable: 2 # 至少2个Pod始终可用 selector: matchLabels: app: my-app
-
应用PDB: 使用
kubectl apply
命令应用YAML文件,创建PDB对象。kubectl apply -f my-pdb.yaml
-
验证PDB: 使用
kubectl get pdb
命令查看PDB的状态,确保它已正确应用。kubectl get pdb my-pdb
PDBs的限制和注意事项
-
自愿中断: PDBs主要针对自愿中断,如计划维护。对于非自愿中断,如节点故障,PDBs不会产生影响。
-
抢占(Preemption): 在Kubernetes 1.8及以后的版本中,抢占功能不受PDBs的限制。这意味着在执行抢占时,可能会驱逐受PDB保护的Pod。
-
集群操作: PDBs可能会影响集群的一些操作,如节点排空。如果PDB的设置阻止了Pod的驱逐,可能会导致集群操作延迟或失败。
-
版本兼容性: 确保Kubernetes集群版本支持PDBs。PDBs是在Kubernetes 1.8版本中引入的。