节点亲和性允许 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。 |
以下示例是一个节点规范,其中包含一条首选规则,即首选具有标签的节点(该标签的键为e2e-az-EastWest,其值为e2e-az-East或e2e-az-West)用于 Pod。
具有节点亲和性首选规则的示例 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 调度到节点上。
|