4.2. 使用关联性和反关联性规则相对于其他 pod 放置 pod
要控制工作负载分布,您可以使用 pod 关联性和反关联性规则来指定 pod 是否可以调度到接近其他 pod 还是独立于其他 pod。
关联性是 pod 的一个属性,用于控制它们希望调度到的节点。反关联性是 pod 的一个属性,用于阻止 pod 调度到某个节点上。
在 Red Hat OpenShift Service on AWS 中,可以借助 pod 关联性和 pod 反关联性来根据其他 pod 上的键/值标签限制 pod 有资格调度到哪些节点。
4.2.1. 了解 pod 关联性 复制链接链接已复制到粘贴板!
您可以使用 pod 关联性和 pod 反关联性 来根据其他 pod 上的键/值标签限制 pod 有资格调度到哪些节点。
- 如果新 pod 上的标签选择器与当前 pod 上的标签匹配,pod 关联性可以命令调度程序将新 pod 放置到与其他 pod 相同的节点上。
- 如果新 pod 上的标签选择器与当前 pod 上的标签匹配,pod 反关联性可以阻止调度程序将新 pod 放置到与具有相同标签的 pod 相同的节点上。
例如,您可以使用关联性规则,在服务内或相对于其他服务中的 pod 来分散或聚拢 pod。如果特定服务的 pod 的性能已知会受到另一服务的 pod 影响,那么您可以利用反关联性规则,防止前一服务的 pod 调度到与后一服务的 pod 相同的节点上。或者,您可以将服务的 pod 分散到节点间、可用性区域或可用性集,以减少相关的故障。
标签选择器可能与带有多个 pod 部署的 pod 匹配。在配置反关联性规则时,请使用标签的唯一组合以避免匹配的 pod。
pod 关联性规则有两种,即必要规则和偏好规则。
必须满足必要规则,pod 才能调度到节点上。偏好规则指定在满足规则时调度程序会尝试强制执行规则,但不保证一定能强制执行成功。
根据 pod 优先级和抢占设置,调度程序可能无法在不违反关联性要求的前提下为 pod 找到适合的节点。若是如此,pod 可能不会被调度。
要防止这种情况,请仔细配置优先级相同的 pod 的 pod 关联性。
您可以通过 Pod 规格文件配置 pod 关联性/反关联性。您可以指定必要规则或偏好规则,或同时指定这两种规则。如果您同时指定,节点必须首先满足必要规则,然后尝试满足偏好规则。
以下示例显示了配置了 pod 关联性和反关联性的 Pod 规格。
在本例中,pod 关联性规则指明,只有当节点至少有一个已在运行且具有键 security 和值 S1 的标签的 pod 时,pod 才可以调度到这个节点上。pod 反关联性则表示,如果节点已在运行带有键 security 和值 S2.的标签的 pod,则 pod 将偏向于不调度到该节点上。
具有 pod 关联性的 Pod 配置文件示例
apiVersion: v1
kind: Pod
metadata:
name: with-pod-affinity
spec:
securityContext:
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: security
operator: In
values:
- S1
topologyKey: topology.kubernetes.io/zone
containers:
- name: with-pod-affinity
image: docker.io/ocpqe/hello-pod
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
其中:
spec.affinity.podAffinity- 指定用于配置 pod 关联性的小节。
spec.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution指定 必要规则 的参数。配置以下
labelSelector.matchExpressions.key参数:key- 指定必须匹配的键/值对键(标签),才能应用该规则。
values- 指定必须匹配键/值对(标签)才能应用该规则的值。
operator-
指定现有 pod 上的标签和新 pod 规格中
matchExpression参数的值集合之间的关系。可以是In、NotIn、Exists或DoesNotExist。
具有 pod 反关联性的 Pod 配置文件示例
apiVersion: v1
kind: Pod
metadata:
name: with-pod-antiaffinity
spec:
securityContext:
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: security
operator: In
values:
- S2
topologyKey: kubernetes.io/hostname
containers:
- name: with-pod-affinity
image: docker.io/ocpqe/hello-pod
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
其中:
spec.affinity.podAffinity- 指定用于配置 pod 关联性的小节。
spec.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution指定 偏好规则 的参数。配置 weight 和以下
podAffinityTerm.labelSelector.matchExpressions参数:weight- 指定偏好规则的权重。优先选择权重最高的节点。
key- 指定必须匹配的键/值对键(标签),才能应用该规则。
values- 指定必须匹配键/值对(标签)才能应用该规则的值。
operator-
指定现有 pod 上的标签和新 pod 规格中
matchExpression参数的值集合之间的关系。可以是In、NotIn、Exists或DoesNotExist。
如果节点标签在运行时改变,使得不再满足 pod 上的关联性规则,pod 会继续在该节点上运行。