Kubernetes应用高可用保障:深入理解PodDisruptionBudget

Kubernetes应用高可用保障:深入理解PodDisruptionBudget

website Kubernetes website and documentation repo: website 项目地址: https://gitcode.com/gh_mirrors/webs/website

概述

在Kubernetes集群管理中,确保应用的高可用性是一个关键目标。PodDisruptionBudget(PDB)是Kubernetes提供的一个强大机制,它允许应用管理员在集群维护操作(如节点排空或升级)期间,控制应用可以承受的中断程度。本文将深入解析PDB的工作原理、使用场景和最佳实践。

PDB基本概念

PodDisruptionBudget是一种Kubernetes资源对象,它定义了在自愿中断(voluntary disruptions)期间,应用可以容忍的Pod不可用数量或比例。自愿中断包括管理员主动执行的集群维护操作,如节点排空(drain)或集群升级等。

PDB的核心字段

一个PDB定义包含三个关键字段:

  1. selector:标签选择器,用于确定PDB保护哪些Pod
  2. minAvailable:必须保持可用的最小Pod数量或百分比
  3. 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支持两种数值指定方式:

  1. 绝对数值:如minAvailable: 5表示必须保持5个Pod可用
  2. 百分比:如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的驱逐行为:

  1. IfHealthyBudget(默认):只有当应用未中断时,才允许驱逐不健康Pod
  2. AlwaysAllow:总是允许驱逐不健康Pod,即使应用已经中断
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: myapp-pdb
spec:
  maxUnavailable: 1
  unhealthyPodEvictionPolicy: AlwaysAllow
  selector:
    matchLabels:
      app: myapp

非标准工作负载的限制

对于不由标准控制器管理的Pod,使用PDB有以下限制:

  1. 只能使用minAvailable,不能使用maxUnavailable
  2. minAvailable必须使用绝对数值,不能使用百分比

最佳实践

  1. 为关键应用配置PDB:特别是那些需要高可用的有状态服务
  2. 合理设置阈值:考虑应用的容错能力和业务需求
  3. 监控PDB状态:定期检查PDB的ALLOWED DISRUPTIONS
  4. 配合就绪探针使用:确保PDB能准确判断Pod健康状态
  5. 考虑集群维护窗口:在计划维护前,可以临时调整PDB

注意事项

  1. PDB仅保护应用不受自愿中断影响,无法防止节点故障等非自愿中断
  2. 设置maxUnavailable为0或minAvailable为100%可能导致节点无法排空
  3. 多个PDB不应选择相同的Pod,否则可能导致意外行为

通过合理使用PodDisruptionBudget,您可以确保Kubernetes集群中的关键应用在维护期间保持高可用性,同时又不妨碍必要的集群管理操作。

website Kubernetes website and documentation repo: website 项目地址: https://gitcode.com/gh_mirrors/webs/website

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宫文琼Perfect

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值