用 PodDisruptionBudget 来保护应用
一个 PodDisruptionBudget 有 3 个字段:
- 标签选择算符 .spec.selector 用于指定其所作用的 Pod 集合,该字段为必需字段。
- .spec.minAvailable 表示驱逐后仍须保证可用的 Pod 数量。即使因此影响到 Pod 驱逐 (即该条件在和 Pod 驱逐发生冲突时优先保证)。 minAvailable 值可以是绝对值,也可以是百分比。
- .spec.maxUnavailable (Kubernetes 1.7 及更高的版本中可用)表示驱逐后允许不可用的 Pod 的最大数量。其值可以是绝对值或是百分比。
说明:
policy/v1beta1 和 policy/v1 API 中 PodDisruptionBudget 的空选择算符的行为 略有不同。在 policy/v1beta1 中,空的选择算符不会匹配任何 Pods,而 policy/v1 中,空的选择算符会匹配名字空间中所有 Pods。
说明: 干扰预算并不能真正保证指定数量/百分比的 Pod 一直处于运行状态。例如: 当 Pod 集合的 规模处于预算指定的最小值时,承载集合中某个 Pod 的节点发生了故障,这样就导致集合中可用 Pod 的 数量低于预算指定值。预算只能够针对自发的驱逐提供保护,而不能针对所有 Pod 不可用的诱因。
设置 maxUnavailable 值为 0%(或 0)或设置 minAvailable 值为 100%(或等于副本数) 可能会阻塞节点,导致资源耗尽。按照 PodDisruptionBudget 的语义,这是允许的。
用户可以在下面看到 pod 干扰预算定义的示例,它们与带有 app: zookeeper 标签的 pod 相匹配:
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: zk-pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: zookeeper
你可以通过类似 kubectl apply -f mypdb.yaml 的命令来创建 PDB。
PDB 对象无法更新,必须删除后重新创建。
kubectl get poddisruptionbudgets