译文 | Kubernetes 1.26:PodDisruptionBudget 守护不健康 Pod 时所用的驱逐策略

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

对于 Kubernetes 集群而言想要确保日常干扰不影响应用的可用性不是一个简单的任务。上月发布的 Kubernetes v1.26 增加了一个新的特性允许针对 PodDisruptionBudget (PDB) 指定不健康 Pod 驱逐策略这有助于在节点执行管理操作期间保证应用的可用性。

PodDisruptionBudget (PDB)https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/disruptions/#pod-disruption-budgets

01

解决什么问题

API 发起的 Pod 驱逐需遵循 PodDisruptionBudget (PDB) 约束。这意味着因驱逐 Pod 而请求的自愿干扰不应干扰守护的应用且 PDB 的 .status.currentHealthy 不应低于 .status.desiredHealthy。如果正在运行的 Pod 状态为 Unhealthy则该 Pod 不计入 PDB 状态只有在应用不受干扰时才可以驱逐这些 Pod。这有助于尽可能确保受干扰或还未启动的应用的可用性确保不会因驱逐造成额外的停机时间。

但对于想要清空节点而又不进行任何手动干预的集群管理员而言这种机制很有问题。若一些应用因 Pod 处于 CrashLoopBackOff 状态由于漏洞或配置错误或 Pod 无法进入就绪状态而行为异常会使这项任务变得更加复杂。这是因为当某应用的所有 Pod 均不健康时所有驱逐请求都会因违反 PDB 而失败。这种情况下清空节点不会有任何作用。

另一方面某些用户经常依赖现有行为来

  • 防止因删除守护基础资源或存储的 Pod 而造成数据丢失

  • 让应用达到最佳可用性。

Kubernetes 1.26 为 PodDisruptionBudget API 引入了新的实验性字段.spec.unhealthyPodEvictionPolicy。启用此字段后将允许你达成这两种目的。

02

工作原理

API 发起的驱逐是触发 Pod 优雅终止的一个过程。这个过程可以通过直接调用 API 发起也能使用 kubectl drain 或集群中的其他主体来发起。在这个过程中移除每个 Pod 时将与对应的 PDB 协商确保始终有足够数量的 Pod 在集群中运行。

而驱逐策略允许 PDB 创建者进一步控制如何处理不健康的 Pod。有两个驱逐策略可供选择IfHealthyBudget 和 AlwaysAllow。

前者 IfHealthyBudget 采用现有行为以达到你默认可获得的最佳可用性。不健康的 Pod 只有在其应用中可用的 Pod 个数达到 .status.desiredHealthy 即最小可用个数时才会被干扰。

通过将 PDB 的 spec.unhealthyPodEvictionPolicy 字段设置为 AlwaysAllow可以表示为应用选择尽可能最佳的可用性。采用此策略时始终能够驱逐不健康的 Pod。这可以简化集群的维护和升级。

我们认为 AlwaysAllow 通常是一个更好的选择但是对于某些关键负载你可能仍然倾向于防止不健康的 Pod 被从节点上清空或其他形式的 API 发起的驱逐。

03

具体用法

这是一个 Alpha 特性意味着你必须使用命令行参数 --feature-gates=PDBUnhealthyPodEvictionPolicy=true 为 kube-apiserver 启用 PDBUnhealthyPodEvictionPolicy 特性门控。

特性门控https://kubernetes.io/zh-cn/docs/reference/command-line-tools-reference/feature-gates/

这里举一个例子。假设

  • 已在集群中启用了此特性门控且已定义了运行普通 Web 服务器的 Deployment

  • 已为 Deployment 的 Pod 打了标签 app: nginx

  • 想要限制可避免的干扰你知道对于此应用而言尽力而为的可用性也是足够的

  • 你决定即使这些 Web 服务器 Pod 不健康也允许驱逐

  • 你创建 PDB 守护此应用使用 AlwaysAllow 策略驱逐不健康的 Pod。

具体 YAML 如下

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: nginx-pdb
spec:
  selector:
    matchLabels:
      app: nginx
  maxUnavailable: 1
  unhealthyPodEvictionPolicy: AlwaysAllow

参考资料

[1] 阅读 KEPUnhealthy Pod Eviction Policy for PDBs

https://github.com/kubernetes/enhancements/tree/master/keps/sig-apps/3017-pod-healthy-policy-for-pdb

[2] 阅读针对 PodDisruptionBudget 的不健康 Pod 驱逐策略文档

https://kubernetes.io/zh-cn/docs/tasks/run-application/configure-pdb/#unhealthy-pod-eviction-policy

[3] 参阅 Kubernetes 文档--PodDisruptionBudget

https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/disruptions/#pod-disruption-budgets

[4] 参阅 Kubernetes 文档--清空节点

https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/safely-drain-node/

[5] 参阅 Kubernetes 文档--驱逐

https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/api-eviction/

[4] 原英文博客Kubernetes 1.26: Eviction policy for unhealthy pods guarded by PodDisruptionBudgets

https://kubernetes.io/blog/2023/01/06/unhealthy-pod-eviction-policy-for-pdbs/


本文译者

要海峰

现任「DaoCloud 道客」高级文档工程师

K8s reviewerIstio maintainerotel 等 member

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: k8s