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 反亲和性规则表示如果该节点上已运行具有键为security
且值为S2
的标签的 Pod,则 Pod 优先不调度到该节点上。
带有 Pod 亲和性的示例Pod
配置文件
apiVersion: v1
kind: Pod
metadata:
name: with-pod-affinity
spec:
securityContext:
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
affinity:
podAffinity: (1)
requiredDuringSchedulingIgnoredDuringExecution: (2)
- labelSelector:
matchExpressions:
- key: security (3)
operator: In (4)
values:
- S1 (3)
topologyKey: topology.kubernetes.io/zone
containers:
- name: with-pod-affinity
image: docker.io/ocpqe/hello-pod
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
1 |
配置 Pod 亲和性的段落。 |
2 |
定义必需规则。 |
3 |
必须匹配的键和值(标签)才能应用该规则。 |
4 |
运算符表示现有 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: (1)
preferredDuringSchedulingIgnoredDuringExecution: (2)
- weight: 100 (3)
podAffinityTerm:
labelSelector:
matchExpressions:
- key: security (4)
operator: In (5)
values:
- S2
topologyKey: kubernetes.io/hostname
containers:
- name: with-pod-affinity
image: docker.io/ocpqe/hello-pod
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
1 |
配置 Pod 反亲和性的段落。 |
2 |
定义首选规则。 |
3 |
为首选规则指定权重。权重最高的节点优先。 |
4 |
确定反亲和性规则何时应用的 Pod 标签的描述。为标签指定键和值。 |
5 |
运算符表示现有 Pod 上的标签与新 Pod 规范中matchExpression 参数中的一组值之间的关系。可以是In 、NotIn 、Exists 或DoesNotExist 。 |
|
如果节点上的标签在运行时发生更改,使得 Pod 上的亲和性规则不再满足,则 Pod 将继续在该节点上运行。
|