To specify a preference towards a group of nodes that a pod can be placed on, you can use a node affinity in the pod spec. For example, you could configure a pod to run only on a node with a specific CPU or in a specific availability zone. The node does not have control over the placement.
There are two types of node affinity rules: required and preferred.
Required rules must be met before a pod can be scheduled on a node. Preferred rules specify that, if the rule is met, the scheduler tries to enforce the rules, but does not guarantee enforcement.
|
|
If labels on a node change at runtime that results in an node affinity rule on a pod no longer being met, the pod continues to run on the node.
|
You configure node affinity through the Pod spec file. You can specify a required rule, a preferred rule, or both. If you specify both, the node must first meet the required rule, then attempts to meet the preferred rule.
The following example is a Pod spec with a rule that requires the pod be placed on a node with a label whose key is e2e-az-NorthSouth and whose value is either e2e-az-North or e2e-az-South:
Example pod configuration file with a node affinity required rule
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
securityContext:
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: e2e-az-NorthSouth
operator: In
values:
- e2e-az-North
- e2e-az-South
containers:
- name: with-node-affinity
image: docker.io/ocpqe/hello-pod
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
# ...
spec.affinity.nodeAffinity
-
Specifies the stanza to configure node affinity.
spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution
-
Specifies a required rule. Configure the following nodeSelectorTerms.matchExpressions parameters:
key
-
Specifies the key of the key/value pair (label) that must be matched to apply the rule.
operator
-
Specifies the relationship between the label on the node and the set of values in the matchExpression parameters in the Pod spec. This value can be In, NotIn, Exists, or DoesNotExist, Lt, or Gt.
values
-
Specifies the value of the key/value pair (label) that must be matched to apply the rule.
The following example is a node specification with a preferred rule that a node with a label whose key is e2e-az-EastWest and whose value is either e2e-az-East or e2e-az-West is preferred for the pod:
Example pod configuration file with a node affinity preferred rule
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
securityContext:
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: e2e-az-EastWest
operator: In
values:
- e2e-az-East
- e2e-az-West
containers:
- name: with-node-affinity
image: docker.io/ocpqe/hello-pod
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
# ...
spec.affinity.nodeAffinity
-
Specifies the stanza to configure node affinity.
spec.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution
-
Specifies a preferred rule. Configure a weight and the following preference.matchExpression parameters:
weight
-
Specifies a weight for a preferred rule. The node with highest weight is preferred.
key
-
Specifies the key of the key/value pair (label) that must be matched to apply the rule.
operator
-
Specifies the relationship between the label on the node and the set of values in the matchExpression parameters in the Pod spec. This value can be In, NotIn, Exists, or DoesNotExist, Lt, or Gt. There is no explicit node anti-affinity concept, but using the NotIn or DoesNotExist operator replicates that behavior.
values
-
Specifies the value of the key/value pair (label) that must be matched to apply the rule.
|
|
If you are using node affinity and node selectors in the same pod configuration, note the following:
-
If you configure both nodeSelector and nodeAffinity, both conditions must be satisfied for the pod to be scheduled onto a candidate node.
-
If you specify multiple nodeSelectorTerms associated with nodeAffinity types, then the pod can be scheduled onto a node if one of the nodeSelectorTerms is satisfied.
-
If you specify multiple matchExpressions associated with nodeSelectorTerms, then the pod can be scheduled onto a node only if all matchExpressions are satisfied.
|