📖 Scenario: You are managing a Kubernetes cluster for a small online store. You want to control how pods are placed on nodes to improve reliability and performance.Specifically, you want some pods to be placed together (affinity) and some pods to be placed apart (anti-affinity).
🎯 Goal: Learn how to write pod specifications with affinity rules using podAffinity and podAntiAffinity in Kubernetes pod manifests.You will create a pod manifest with labels, then add affinity and anti-affinity rules, and finally check the pod spec output.
📋 What You'll Learn
Create a pod manifest with specific labels
Add pod affinity rules to schedule pods together
Add pod anti-affinity rules to avoid scheduling pods together
Print the final pod manifest YAML
💡 Why This Matters
🌍 Real World
Pod affinity and anti-affinity help control pod placement in Kubernetes clusters to improve availability and performance by grouping or separating pods.
💼 Career
Understanding pod affinity rules is important for Kubernetes administrators and DevOps engineers to optimize workload distribution and fault tolerance.
Progress0 / 4 steps
1
Create a basic pod manifest with labels
Create a YAML manifest for a pod named web-server in namespace default. The pod should have a container named nginx using image nginx:latest. Add labels app: web and tier: frontend under metadata.labels.
Kubernetes
Hint
Use metadata.labels to add labels. Containers go under spec.containers.
2
Add pod affinity to schedule pods together
Add a podAffinity rule under spec.affinity to require scheduling this pod on nodes where pods with label app: web are already running. Use requiredDuringSchedulingIgnoredDuringExecution with topologyKey: kubernetes.io/hostname.
Kubernetes
Hint
Put podAffinity under spec.affinity. Use requiredDuringSchedulingIgnoredDuringExecution with a list of rules.
3
Add pod anti-affinity to avoid scheduling pods together
Add a podAntiAffinity rule under spec.affinity to avoid scheduling this pod on nodes where pods with label tier: frontend are running. Use preferredDuringSchedulingIgnoredDuringExecution with weight 100 and topologyKey: kubernetes.io/hostname.
Kubernetes
Hint
Put podAntiAffinity under spec.affinity. Use preferredDuringSchedulingIgnoredDuringExecution with weight and podAffinityTerm.
4
Print the final pod manifest YAML
Print the complete pod manifest YAML with the affinity and anti-affinity rules included.
Kubernetes
Hint
Use a print statement to confirm the manifest is ready.
Practice
(1/5)
1. What is the main purpose of podAffinity in Kubernetes?
easy
A. To automatically restart pods on failure
B. To prevent pods from running on the same node
C. To limit the number of pods per node
D. To schedule pods close to other pods with matching labels
Solution
Step 1: Understand podAffinity concept
Pod affinity is used to place pods close to other pods that have specific labels, improving communication or resource sharing.
Step 2: Compare options with podAffinity purpose
Only To schedule pods close to other pods with matching labels describes placing pods close to others with matching labels, which matches podAffinity's goal.
Final Answer:
To schedule pods close to other pods with matching labels -> Option D
Quick Check:
podAffinity = place pods close [OK]
Hint: Affinity means placing pods near each other [OK]
Common Mistakes:
Confusing affinity with anti-affinity
Thinking affinity limits pods per node
Mixing affinity with pod restart policies
2. Which of the following is the correct syntax to specify a required pod anti-affinity rule in a pod spec?
easy
A. "podAntiAffinity": {"requiredDuringSchedulingIgnoredDuringExecution": [{"labelSelector": {"matchLabels": {"app": "web"}}, "topologyKey": "kubernetes.io/hostname"}]}
A. Empty topologyKey causes the rule to be ignored
B. Label selector is incorrect syntax
C. Required rules are always ignored by scheduler
D. podAntiAffinity must be under preferredDuringSchedulingIgnoredDuringExecution
Solution
Step 1: Check topologyKey usage
The topologyKey must be a valid node label key like kubernetes.io/hostname. Empty string disables the rule.
Step 2: Understand scheduler behavior
With empty topologyKey, the scheduler ignores the anti-affinity rule, allowing pods on same node.
Final Answer:
Empty topologyKey causes the rule to be ignored -> Option A
Quick Check:
Valid topologyKey needed for anti-affinity [OK]
Hint: topologyKey cannot be empty for anti-affinity rules [OK]
Common Mistakes:
Leaving topologyKey empty
Misplacing anti-affinity under preferred instead of required
Assuming required rules are ignored
5. You want to deploy multiple replicas of a pod with label app: cache so that no two pods run on the same node, but you want the scheduler to try to keep pods in the same zone if possible. Which affinity configuration achieves this?
hard
A. Use podAffinity with requiredDuringSchedulingIgnoredDuringExecution on app: cache and topologyKey: kubernetes.io/hostname only
B. Use podAntiAffinity with requiredDuringSchedulingIgnoredDuringExecution on app: cache and topologyKey: kubernetes.io/hostname, plus podAffinity with preferredDuringSchedulingIgnoredDuringExecution on topologyKey: failure-domain.beta.kubernetes.io/zone
C. Use podAntiAffinity with preferredDuringSchedulingIgnoredDuringExecution on app: cache and topologyKey: kubernetes.io/hostname only
D. Use podAffinity with preferredDuringSchedulingIgnoredDuringExecution on app: cache and topologyKey: failure-domain.beta.kubernetes.io/zone only
Solution
Step 1: Prevent pods on same node strictly
Use podAntiAffinity with requiredDuringSchedulingIgnoredDuringExecution and topologyKey: kubernetes.io/hostname to ensure no two pods run on the same node.
Step 2: Prefer pods in same zone
Add podAffinity with preferredDuringSchedulingIgnoredDuringExecution and topologyKey: failure-domain.beta.kubernetes.io/zone to encourage scheduling pods in the same zone but not strictly.
Step 3: Combine both rules
Use podAntiAffinity with requiredDuringSchedulingIgnoredDuringExecution on app: cache and topologyKey: kubernetes.io/hostname, plus podAffinity with preferredDuringSchedulingIgnoredDuringExecution on topologyKey: failure-domain.beta.kubernetes.io/zone combines strict anti-affinity on node and preferred affinity on zone, matching the requirement.
Final Answer:
Use required podAntiAffinity on hostname and preferred podAffinity on zone -> Option B
Quick Check:
Strict anti-affinity + preferred affinity = Use podAntiAffinity with requiredDuringSchedulingIgnoredDuringExecution on app: cache and topologyKey: kubernetes.io/hostname, plus podAffinity with preferredDuringSchedulingIgnoredDuringExecution on topologyKey: failure-domain.beta.kubernetes.io/zone [OK]
Hint: Use required anti-affinity on node + preferred affinity on zone [OK]
Common Mistakes:
Using affinity instead of anti-affinity to separate pods
Using preferred instead of required for strict separation
Ignoring zone preference
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.