4.8. 使用 pod 拓扑分布限制控制 pod 放置
您可以使用 pod 拓扑分布约束来控制 pod 在节点、区、区域或其他用户定义的拓扑域间的放置。
4.8.1. 关于 pod 拓扑分布限制
通过使用 pod 拓扑分布约束,您可以对故障域中的 pod 分布提供精细的控制,以帮助实现高可用性和更有效的资源使用。
OpenShift Container Platform 管理员可以标记节点以提供拓扑信息,如区域、区、节点或其他用户定义域。在节点上设置了这些标签后,用户才能定义 pod 拓扑分布约束,以控制 pod 在这些拓扑域中的放置。
您可以指定哪些 pod 要分组在一起,它们分散到哪些拓扑域以及可以接受的基点。只有同一命名空间中的 pod 在因为约束而分散时才会被匹配和分组。
4.8.2. 配置 pod 拓扑分布限制
以下步骤演示了如何配置 pod 拓扑扩展约束,以根据区分配与指定标签匹配的 pod。
您可以指定多个 pod 拓扑分散约束,但您必须确保它们不会相互冲突。必须满足所有 pod 拓扑分布约束才能放置 pod。
先决条件
- 集群管理员已将所需的标签添加到节点。
流程
创建
Pod
spec 并指定 pod 拓扑分散约束:pod-spec.yaml
文件示例apiVersion: v1 kind: Pod metadata: name: my-pod labels: region: us-east spec: topologySpreadConstraints: - maxSkew: 1 1 topologyKey: topology.kubernetes.io/zone 2 whenUnsatisfiable: DoNotSchedule 3 labelSelector: 4 matchLabels: region: us-east 5 containers: - image: "docker.io/ocpqe/hello-pod" name: hello-pod
- 1
- 两个拓扑域间的 pod 数量的最大差别。默认为
1
,您不能指定0
值。 - 2
- 节点标签的密钥。具有此键和相同值的节点被视为在同一拓扑中。
- 3
- 如果不满足分布式约束,如何处理 pod。默认为
DoNotSchedule
,它会告诉调度程序不要调度 pod。设置为ScheduleAnyway
,它仍然会调度 pod,但调度程序会优先考虑 skew 的根据情况以使集群不要出现不平衡的情况。 - 4
- 匹配此标签选择器的 Pod 在分发时被计算并识别为组,以满足约束要求。确保指定标签选择器,否则就无法匹配 pod。
- 5
- 如果您希望以后正确计数此 Pod 规格,请确保此
Pod
spec 也会设置其标签选择器来匹配这个标签选择器。
创建 pod:
$ oc create -f pod-spec.yaml
4.8.3. pod 拓扑分布限制示例
以下示例演示了 pod 拓扑分散约束配置。
4.8.3.1. 单个 pod 拓扑分布约束示例
此 Pod
spec 示例定义了一个 pod 拓扑分散约束。它与标记为 region: us-east
的 pod 匹配:在区域间分布,指定 skew 1
,并在不满足这些要求时不调度 pod。
kind: Pod apiVersion: v1 metadata: name: my-pod labels: region: us-east spec: topologySpreadConstraints: - maxSkew: 1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: region: us-east containers: - image: "docker.io/ocpqe/hello-pod" name: hello-pod
4.8.3.2. 多个 pod 拓扑分布约束示例
此 Pod
spec 示例定义了两个 pod 拓扑分布限制。在标有 region: us-east
的 pod 上匹配:指定 skew 1
,并在不满足这些要求时不调度 pod。
第一个限制基于用户定义的标签 node
发布 pod,第二个约束根据用户定义的标签 rack
分发 pod。调度 pod 必须满足这两个限制。
kind: Pod apiVersion: v1 metadata: name: my-pod-2 labels: region: us-east spec: topologySpreadConstraints: - maxSkew: 1 topologyKey: node whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: region: us-east - maxSkew: 1 topologyKey: rack whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: region: us-east containers: - image: "docker.io/ocpqe/hello-pod" name: hello-pod