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
配置文件
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将继续在节点上运行。
|