You configure node affinity through the pod specification 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 specification 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
:
Sample pod configuration file with a node affinity required rule
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
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
1 |
The stanza to configure node affinity. |
2 |
Defines a required rule. |
3 |
The key/value pair (label) that must be matched to apply the rule. |
4 |
The operator represents the relationship between the label on the node and the set of values in the matchExpression parameters in the pod specification. This value can be In , NotIn , Exists , or DoesNotExist , Lt , or Gt . |
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:
Sample pod configuration file with a node affinity preferred rule
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
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
1 |
The stanza to configure node affinity. |
2 |
Defines a preferred rule. |
3 |
Specifies a weight for a preferred rule. The node with highest weight is preferred. |
4 |
The key/value pair (label) that must be matched to apply the rule. |
5 |
The operator represents the relationship between the label on the node and
the set of values in the matchExpression parameters in the pod specification.
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.
|
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.
|
Configuring a Required Node Affinity Rule
Required rules must be met before a pod can be scheduled on a node.
The following steps demonstrate a simple configuration that creates a node and a pod that the scheduler is required to place on the node.
-
Add a label to a node by editing the node configuration or by using the oc label node
command:
$ oc label node node1 e2e-az-name=e2e-az1
|
To modify a node in your cluster, update the node configuration maps as needed.
Do not manually edit the node-config.yaml file.
|
-
In the pod specification, use the nodeAffinity
stanza to configure the requiredDuringSchedulingIgnoredDuringExecution
parameter:
-
Specify the key and values that must be met. If you want the new pod to be scheduled on the node you edited, use the same key
and value
parameters as the label in the node.
-
Specify an operator
. The operator can be In
, NotIn
, Exists
, DoesNotExist
, Lt
, or Gt
. For example, use the operator In
to require the label to be in the node:
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: e2e-az-name
operator: In
values:
- e2e-az1
- e2e-az2
-
Create the pod:
$ oc create -f e2e-az2.yaml
Configuring a Preferred Node Affinity Rule
Preferred rules specify that, if the rule is met, the scheduler tries to enforce the rules, but does not guarantee enforcement.
The following steps demonstrate a simple configuration that creates a node and a pod that the scheduler tries to place on the node.
-
Add a label to a node by editing the node configuration or by executing the oc label node
command:
$ oc label node node1 e2e-az-name=e2e-az3
|
To modify a node in your cluster, update the node configuration maps as needed.
Do not manually edit the node-config.yaml file.
|
-
In the pod specification, use the nodeAffinity
stanza to configure the preferredDuringSchedulingIgnoredDuringExecution
parameter:
-
Specify a weight for the node, as a number 1-100. The node with highest weight is preferred.
-
Specify the key and values that must be met. If you want the new pod to be scheduled on the node you edited, use the same key
and value
parameters as the label in the node:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: e2e-az-name
operator: In
values:
- e2e-az3
-
Specify an operator
. The operator can be In
, NotIn
, Exists
, DoesNotExist
, Lt
, or Gt
. For example, use the operator In
to require the label to be in the node.
-
Create the pod.
$ oc create -f e2e-az3.yaml