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] }
| Type | Effect |
| required | Hard; pod stays Pending if no match |
| IgnoredDuringExecution | Existing pods not evicted on label change |
2. Using preferredDuringScheduling
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
preference:
matchExpressions:
- { key: disktype, operator: In, values: [ssd] }
| Field | Detail |
| weight | 1-100; higher = stronger preference |
| Behavior | Soft; pod scheduled if no node matches |
3. Configuring Node Selectors
spec:
nodeSelector:
disktype: ssd
kubernetes.io/arch: amd64
| Property | Detail |
| Simplicity | Equality only |
| Use | Quick filtering; node affinity for advanced |
4. Using matchExpressions
| Operator | Effect |
| In / NotIn | Value set membership |
| Exists / DoesNotExist | Label presence |
| Gt / Lt | Numeric comparison (single value) |
5. Setting Node Label Selectors
| Well-Known Label | Purpose |
kubernetes.io/hostname | Node name |
kubernetes.io/arch | amd64, arm64 |
kubernetes.io/os | linux, windows |
topology.kubernetes.io/zone | AZ |
topology.kubernetes.io/region | Region |
node.kubernetes.io/instance-type | VM type (m5.large) |
6. Combining Multiple Affinity Rules
| Logic | Rule |
| nodeSelectorTerms | OR across terms |
| matchExpressions within term | AND |
| required + preferred | required 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
| Behavior | Detail |
| Sum per node | Scheduler adds weights of matching preferences |
| Tie-break | Higher sum scores better |
9. Using IgnoredDuringExecution
| Suffix | Available |
| IgnoredDuringExecution | Both required & preferred (current behavior) |
| RequiredDuringExecution | Planned — would evict pods on label change |
10. Troubleshooting Affinity Rules
| Symptom | Cause |
| Pending FailedScheduling | No node matches required affinity |
| Wrong AZ chosen | Missing zone constraint |
| Imbalanced placement | Use topology spread constraints |
| Label typo | Verify kubectl get nodes --show-labels |