2.3.3. 了解如何使用 pod 中断预算来指定必须在线的 pod 数量
为确保 pod 在自愿中断(如节点维护或集群更新)期间可用,您可以使用 pod 中断预算来为应用程序定义安全限制。
PodDisruptionBudget 是一个 API 对象,用于指定某一时间必须保持在线的副本的最小数量或百分比。在项目中进行这些设置对节点维护(比如缩减集群或升级集群)有益,而且仅在自愿驱除(而非节点失败)时遵从这些设置。
PodDisruptionBudget 对象的配置由以下关键部分组成:
- 标签选择器,即一组 pod 的标签查询。
可用性级别,用来指定必须同时可用的最少 pod 的数量:
-
minAvailable是必须始终可用的 pod 的数量,即使在中断期间也是如此。 -
maxUnavailable是中断期间可以无法使用的 pod 的数量。
-
Available 指的是具有 Ready=True 的 pod 数量。ready=True 指的是能够服务请求的 pod,并应添加到所有匹配服务的负载平衡池中。
允许 maxUnavailable 为 0% 或 0,minAvailable 为 100% 或等于副本数,但这样设置可能会阻止节点排空操作。
对于 Red Hat OpenShift Service on AWS 中的所有机器配置池,maxUnavailable 的默认设置是 1。建议您不要更改这个值,且一次只更新一个 control plane 节点。对于 control plane 池,请不要将这个值改为 3。
您可以使用以下命令来检查所有项目的 pod 中断预算:
$ oc get poddisruptionbudget --all-namespaces
以下示例包含特定于 AWS 上的 Red Hat OpenShift Service 的一些值。
输出示例
NAMESPACE NAME MIN AVAILABLE MAX UNAVAILABLE ALLOWED DISRUPTIONS AGE
openshift-apiserver openshift-apiserver-pdb N/A 1 1 121m
openshift-cloud-controller-manager aws-cloud-controller-manager 1 N/A 1 125m
openshift-cloud-credential-operator pod-identity-webhook 1 N/A 1 117m
openshift-cluster-csi-drivers aws-ebs-csi-driver-controller-pdb N/A 1 1 121m
openshift-cluster-storage-operator csi-snapshot-controller-pdb N/A 1 1 122m
openshift-cluster-storage-operator csi-snapshot-webhook-pdb N/A 1 1 122m
openshift-console console N/A 1 1 116m
#...
如果系统中至少有 minAvailable 个 pod 正在运行,则 PodDisruptionBudget 被视为是健康的。超过这一限制的每个 pod 都可被驱除。
根据您的 pod 优先级与抢占设置,可能会无视 pod 中断预算要求而移除较低优先级 pod。
2.3.3.1. 使用 pod 中断预算指定必须在线的 pod 数量 复制链接链接已复制到粘贴板!
您可以使用 PodDisruptionBudget 对象来指定某一时间必须保持在线的副本的最小数量或百分比。这样可确保 pod 在自中断期间(如节点维护或集群更新)期间可用。
以下步骤演示了如何配置 pod 中断预算。
流程
使用类似以下示例的对象定义来创建 YAML 文件:
apiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: my-pdb spec: minAvailable: 2 selector: matchLabels: name: my-pod其中:
apiVersion-
指定
policy/v1API 组。 spec.minAvailable-
指定必须同时可用的最少 pod 数量。这可以是整数,也可以是指定百分比的字符串(如
20%)。 spec.selector-
指定一组资源的标签查询。
matchLabels和matchExpressions的结果在逻辑上是联合的。要选择项目中的所有 pod,将此参数设置为空,如selector {}。
或者:
apiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: my-pdb spec: maxUnavailable: 25% selector: matchLabels: name: my-pod其中:
apiVersion-
指定
policy/v1API 组。 spec.maxUnavailable-
指定同时不可用的 pod 的最大数量。这可以是整数,也可以是指定百分比的字符串(如
20%)。 spec.selector-
指定一组资源的标签查询。
matchLabels和matchExpressions的结果在逻辑上是联合的。要选择项目中的所有 pod,将此参数设置为空,如selector {}。
运行以下命令,将对象添加到项目中:
$ oc create -f </path/to/file> -n <project_name>