Node affinity¶
How to place a pod to a node?
They are 3 ways to place a POD on a specific node:
- Node Selectors: With the Node Selectors we cannot provide advanced expressions like OR or NOT with node selectors. nodeSelector is the simplest recommended form of node selection constraint. You can add the nodeSelector field to your Pod specification and specify the node labels you want the target node to have. Kubernetes only schedules the Pod onto nodes that have each of the labels you specify.
- Taints and Tolerations:
- Node Affinity
- Node affinity allows you to tell Kubernetes to schedule pods only to specific subsets of nodes.
Some benefits of affinity and anti-affinity over the nodeSelectors
are
- The
affinity/anti-affinity
language is more expressive.nodeSelector
only selects nodes with all the specified labels.Affinity/anti-affinity
gives you more control over the selection logic. - You can indicate that a rule is
soft
orpreferred
, so that the scheduler still schedules the Pod even if it can't find a matching node. - You can constrain a Pod using labels on other Pods running on the node (or other topological domain), instead of just node labels, which allows you to define rules for which Pods can be co-located on a node.
pod with node affinity and anti-affinity
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: topology.kubernetes.io/zone
operator: In
values:
- antarctica-east1
- antarctica-west1
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: another-node-label-key
operator: In
values:
- another-node-label-value
containers:
- name: with-node-affinity
image: registry.k8s.io/pause:2.0