Node-affinity and Node-selector are concepts in Kubernetes that allow you to influence the scheduling of Pods onto nodes based on node-specific attributes or conditions.
Node Affinity:
Node Affinity is a more flexible and expressive feature that allows you to constrain which nodes your pod is eligible to be scheduled based on node labels. It consists of two types: requiredDuringSchedulingIgnoredDuringExecution
and preferredDuringSchedulingIgnoredDuringExecution
.
requiredDuringSchedulingIgnoredDuringExecution
: Specifies that a pod must be scheduled onto nodes that satisfy certain expressions.Example YAML:
package main
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: example-label
operator: In
values:
- example-value
2. preferredDuringSchedulingIgnoredDuringExecution
: Specifies that a pod would prefer to be scheduled onto nodes with certain labels, but it’s not a hard requirement.
Example YAML:
package main
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- preference:
matchExpressions:
- key: example-label
operator: In
values:
- example-value
weight: 50
Node Selector:
Node Selector is a simpler way to constrain pod scheduling to nodes based on their labels. It is a field of PodSpec that specifies a map of key-value pairs. A pod can only be scheduled to a node if the node has labels that match the nodeSelector
specified in the pod definition.
Example YAML:
package main
nodeSelector:
example-label: example-value
This ensures that the pod is scheduled only on nodes that have the label example-label
with the value example-value
.
Summary:
Node Affinity: Provides more advanced and flexible rules for scheduling based on node attributes. It allows you to set requirements and preferences.
Node Selector: Offers a simpler way to specify hard requirements for scheduling pods to nodes based on node labels.
Both node-affinity
and node-selector
are useful for ensuring that your pods are scheduled onto nodes that meet specific criteria, helping you optimize workload placement within your Kubernetes cluster.