Node Affinity
Node Affinity vs. Taints and Tolerations
Understanding the Difference
While taints and tolerations are primarily used for preventing pod scheduling on specific nodes, node affinity is used to attract pods to specific nodes based on their labels.
Taints and Tolerations:
Taints: Mark a node as unsuitable for pods unless they have specific tolerations.
Tolerations: Allow pods to tolerate specific taints, enabling them to run on tainted nodes.
Guarantee: Taints and tolerations don't guarantee pod scheduling on a specific node; they only prevent scheduling on unsuitable nodes.
Node Affinity:
Attracts pods to nodes based on label matching.
Provides more granular control over pod placement.
Can be used for both required and preferred scheduling.
Taints and tolerations alone aren't sufficient for precise pod placement based on disk type. Node affinity offers more flexibility.
Properties in the Node affinity
requireDuringSchedulingIgnoredDuringExecution: If the required label is removed, the scheduler will no longer find suitable nodes, and the pod will remain pending. Existing pods unaffected.
preferredDuringSchedulingIgnoredDuringExecution: Removing the preferred label will simply reduce the likelihood of the pod being scheduled on nodes that previously matched the label. Existing pods unaffected.
requireDuringSchedulingIgnoredDuringExecution:
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: redis
name: redis
spec:
containers:
- image: redis
name: redis
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
the pod is in the pending state because no node matches with the affinity
after labeling the node the pod got assigned
preferedDuringSchedulingIgnoredDuringExecution- property
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: redis
name: redis-2
spec:
containers:
- image: redis
name: redis-2
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: disktype
operator: In
values:
- hdd
Exists Operator
The Exists
operator in node affinity ensures that a pod is scheduled on any node possessing a specific label key, irrespective of its value, even if it's empty.
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: redis
name: redis-3
spec:
containers:
- image: redis
name: redis-3
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: Exists