节点亲和性允许 Pod 指定对其可以放置在其上的节点组的亲和性。节点无法控制放置。
例如,您可以将 Pod 配置为仅在具有特定 CPU 或特定可用区中的节点上运行。
节点亲和性规则有两种类型:**必需**和**首选**。
在 Pod 可以调度到节点上之前,**必须**满足必需规则。首选规则指定,如果满足该规则,调度程序将尝试强制执行这些规则,但不保证强制执行。
|
如果节点上的标签在运行时发生更改,导致 Pod 上的节点亲和性规则不再满足,则 Pod 将继续在该节点上运行。
|
您可以通过 `Pod`规范文件配置节点亲和性。您可以指定必需规则、首选规则或两者兼有。如果您同时指定两者,则节点必须首先满足必需规则,然后尝试满足首选规则。
以下示例是一个 `Pod` 规范,其中包含一个规则,该规则要求将 Pod 放置在具有标签的节点上,该标签的键为 `e2e-az-NorthSouth`,其值为 `e2e-az-North` 或 `e2e-az-South`。
具有节点亲和性必需规则的示例 Pod 配置文件
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
securityContext:
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
affinity:
nodeAffinity: (1)
requiredDuringSchedulingIgnoredDuringExecution: (2)
nodeSelectorTerms:
- matchExpressions:
- key: e2e-az-NorthSouth (3)
operator: In (4)
values:
- e2e-az-North (3)
- e2e-az-South (3)
containers:
- name: with-node-affinity
image: docker.io/ocpqe/hello-pod
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
# ...
1 |
配置节点亲和性的节。 |
2 |
定义必需规则。 |
3 |
必须匹配的键/值对(标签)才能应用规则。 |
4 |
操作符表示节点上的标签与Pod 规范中matchExpression 参数中的值集之间的关系。此值可以是In 、NotIn 、Exists 或DoesNotExist 、Lt 或Gt 。 |
以下示例是一个节点规范,它具有一个首选规则:优先为 Pod 选择键为e2e-az-EastWest
且值为e2e-az-East
或e2e-az-West
的节点。
包含节点亲和性首选规则的示例 Pod 配置文件
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
securityContext:
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
affinity:
nodeAffinity: (1)
preferredDuringSchedulingIgnoredDuringExecution: (2)
- weight: 1 (3)
preference:
matchExpressions:
- key: e2e-az-EastWest (4)
operator: In (5)
values:
- e2e-az-East (4)
- e2e-az-West (4)
containers:
- name: with-node-affinity
image: docker.io/ocpqe/hello-pod
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
# ...
1 |
配置节点亲和性的节。 |
2 |
定义首选规则。 |
3 |
指定首选规则的权重。权重最高的节点优先。 |
4 |
必须匹配的键/值对(标签)才能应用规则。 |
5 |
操作符表示节点上的标签与Pod 规范中matchExpression 参数中的值集之间的关系。此值可以是In 、NotIn 、Exists 或DoesNotExist 、Lt 或Gt 。 |
没有明确的节点反亲和性概念,但使用NotIn
或DoesNotExist
操作符可以复制该行为。
|
如果您在同一个 Pod 配置中同时使用节点亲和性和节点选择器,请注意以下事项
-
如果您同时配置nodeSelector 和nodeAffinity ,则必须同时满足这两个条件,Pod 才能调度到候选节点上。
-
如果您指定了与nodeAffinity 类型关联的多个nodeSelectorTerms ,那么如果满足其中一个nodeSelectorTerms ,则 Pod 可以调度到节点上。
-
如果您指定了与nodeSelectorTerms 关联的多个matchExpressions ,则只有在满足所有matchExpressions 的情况下,Pod 才能调度到节点上。
|