Configuring Node Affinity

1. Using requiredDuringScheduling

affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - { key: topology.kubernetes.io/zone, operator: In, values: [us-east-1a, us-east-1b] }
TypeEffect
requiredHard; pod stays Pending if no match
IgnoredDuringExecutionExisting pods not evicted on label change

2. Using preferredDuringScheduling

preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
  preference:
    matchExpressions:
    - { key: disktype, operator: In, values: [ssd] }
FieldDetail
weight1-100; higher = stronger preference
BehaviorSoft; pod scheduled if no node matches

3. Configuring Node Selectors

spec:
  nodeSelector:
    disktype: ssd
    kubernetes.io/arch: amd64
PropertyDetail
SimplicityEquality only
UseQuick filtering; node affinity for advanced

4. Using matchExpressions

OperatorEffect
In / NotInValue set membership
Exists / DoesNotExistLabel presence
Gt / LtNumeric comparison (single value)

5. Setting Node Label Selectors

Well-Known LabelPurpose
kubernetes.io/hostnameNode name
kubernetes.io/archamd64, arm64
kubernetes.io/oslinux, windows
topology.kubernetes.io/zoneAZ
topology.kubernetes.io/regionRegion
node.kubernetes.io/instance-typeVM type (m5.large)

6. Combining Multiple Affinity Rules

LogicRule
nodeSelectorTermsOR across terms
matchExpressions within termAND
required + preferredrequired filters first

7. Using Node Anti-Affinity

requiredDuringSchedulingIgnoredDuringExecution:
  nodeSelectorTerms:
  - matchExpressions:
    - { key: workload, operator: NotIn, values: [batch] }
Note: No dedicated "node anti-affinity" — express via NotIn / DoesNotExist.

8. Setting Weight Priority

BehaviorDetail
Sum per nodeScheduler adds weights of matching preferences
Tie-breakHigher sum scores better

9. Using IgnoredDuringExecution

SuffixAvailable
IgnoredDuringExecutionBoth required & preferred (current behavior)
RequiredDuringExecutionPlanned — would evict pods on label change

10. Troubleshooting Affinity Rules

SymptomCause
Pending FailedSchedulingNo node matches required affinity
Wrong AZ chosenMissing zone constraint
Imbalanced placementUse topology spread constraints
Label typoVerify kubectl get nodes --show-labels