Bird
Raised Fist0
Kubernetesdevops~10 mins

Pod affinity and anti-affinity in Kubernetes - Step-by-Step Execution

Choose your learning style10 modes available
Process Flow - Pod affinity and anti-affinity
Pod Scheduling Request
↓
Check Pod Affinity Rules
↓
Match Affinity
↓
Check Pod Anti-Affinity Rules
↓
Reject Node
↓
Pod Scheduled on Node
When Kubernetes schedules a pod, it checks affinity and anti-affinity rules to decide which node is suitable. Affinity prefers nodes with matching pods; anti-affinity avoids nodes with certain pods.
Execution Sample
Kubernetes
apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - frontend
        topologyKey: kubernetes.io/hostname
This pod requests to be scheduled on a node that already runs pods with label app=frontend.
Process Table
StepPod Affinity CheckPod Anti-Affinity CheckNode DecisionReason
1Check if node has pods with label app=frontendCheck if node has pods with conflicting labelsPass affinity checkNode has pods with app=frontend label
2N/ANo pods with conflicting labels foundPass anti-affinity checkNo anti-affinity conflict on node
3N/AN/APod scheduledNode meets affinity and anti-affinity rules
4Check next nodeCheck anti-affinityFail affinity checkNode lacks pods with app=frontend label
5N/AN/APod not scheduled on this nodeAffinity rule not met
💡 Pod scheduled on first node that passes both affinity and anti-affinity checks
Status Tracker
VariableStartAfter Step 1After Step 2After Step 3Final
Node Affinity Matchfalsetruetruetruetrue
Node Anti-Affinity Conflictfalsefalsefalsefalsefalse
Pod Scheduledfalsefalsefalsetruetrue
Key Moments - 2 Insights
Why does the pod fail to schedule on a node without matching affinity labels?
Because the affinity rule requires the node to have pods with label app=frontend, nodes without this label fail the affinity check as shown in execution_table row 4.
What happens if a node has pods that violate anti-affinity rules?
The node is rejected during the anti-affinity check, preventing the pod from scheduling there, as indicated in execution_table row 2 if anti-affinity conflict was true.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, at which step does the pod get scheduled?
AStep 3
BStep 1
CStep 4
DStep 5
💡 Hint
Refer to the 'Node Decision' column where 'Pod scheduled' appears at Step 3.
According to the variable tracker, what is the value of 'Node Anti-Affinity Conflict' after Step 2?
Aundefined
Btrue
Cfalse
Dnull
💡 Hint
Check the 'Node Anti-Affinity Conflict' row under 'After Step 2' in variable_tracker.
If the pod affinity rule was removed, how would the scheduling change in the execution table?
APod would never schedule
BPod would schedule on any node without affinity check
CPod would fail anti-affinity check always
DPod would schedule only on nodes with anti-affinity conflicts
💡 Hint
Without affinity rules, the affinity check step would be skipped, allowing scheduling on any node passing anti-affinity.
Concept Snapshot
Pod affinity and anti-affinity guide Kubernetes where to place pods.
Affinity prefers nodes with certain pods.
Anti-affinity avoids nodes with conflicting pods.
Rules use labels and topology keys.
Pods schedule only on nodes passing both checks.
Full Transcript
Pod affinity and anti-affinity are rules Kubernetes uses to decide where to place pods. When scheduling, Kubernetes checks if nodes have pods matching affinity labels to prefer those nodes. It also checks anti-affinity rules to avoid nodes with pods that should not be colocated. If a node passes both checks, the pod is scheduled there. This process ensures pods run close to or away from certain other pods based on labels and topology keys.

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

  1. 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.
  2. 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.
  3. Final Answer:

    To schedule pods close to other pods with matching labels -> Option D
  4. 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"}]}
B. "podAntiAffinity": {"preferredDuringSchedulingIgnoredDuringExecution": [{"weight": 100, "podAffinityTerm": {"labelSelector": {"matchLabels": {"app": "web"}}, "topologyKey": "kubernetes.io/hostname"}}]}
C. "podAffinity": {"requiredDuringSchedulingIgnoredDuringExecution": [{"labelSelector": {"matchLabels": {"app": "web"}}, "topologyKey": "kubernetes.io/hostname"}]}
D. "podAffinity": {"preferredDuringSchedulingIgnoredDuringExecution": [{"weight": 50, "podAffinityTerm": {"labelSelector": {"matchLabels": {"app": "web"}}, "topologyKey": "kubernetes.io/zone"}}]}

Solution

  1. Step 1: Identify required pod anti-affinity syntax

    Required pod anti-affinity uses podAntiAffinity with requiredDuringSchedulingIgnoredDuringExecution and a label selector plus topology key.
  2. Step 2: Match syntax with options

    "podAntiAffinity": {"requiredDuringSchedulingIgnoredDuringExecution": [{"labelSelector": {"matchLabels": {"app": "web"}}, "topologyKey": "kubernetes.io/hostname"}]} correctly uses podAntiAffinity with requiredDuringSchedulingIgnoredDuringExecution and proper labelSelector and topologyKey.
  3. Final Answer:

    Correct required pod anti-affinity syntax -> Option A
  4. Quick Check:

    Required anti-affinity uses podAntiAffinity + requiredDuringScheduling [OK]
Hint: Required anti-affinity uses podAntiAffinity + requiredDuringScheduling [OK]
Common Mistakes:
  • Using podAffinity instead of podAntiAffinity
  • Confusing required and preferred rules
  • Wrong topologyKey values
3. Given this pod spec snippet, what will happen if a pod with label app: frontend is scheduled?
affinity:
  podAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
    - labelSelector:
        matchLabels:
          app: backend
      topologyKey: kubernetes.io/hostname
medium
A. The pod will be scheduled only if no pod with label app=backend exists
B. The pod will be scheduled on any node regardless of other pods
C. The pod will be scheduled on a node that already runs a pod with label app=backend
D. The pod scheduling will fail due to syntax error

Solution

  1. Step 1: Understand required podAffinity behavior

    Required podAffinity means the pod must be placed on a node where pods with matching labels already run, here app=backend.
  2. Step 2: Apply to given pod spec

    The pod with label app=frontend requires a node with pods labeled app=backend, so it will schedule only on such nodes.
  3. Final Answer:

    The pod will be scheduled on a node that already runs a pod with label app=backend -> Option C
  4. Quick Check:

    Required podAffinity = schedule near matching pods [OK]
Hint: Required podAffinity means schedule near matching pods [OK]
Common Mistakes:
  • Thinking podAffinity prevents scheduling near pods
  • Confusing required and preferred affinity
  • Assuming scheduling fails without matching pods
4. You wrote this anti-affinity rule but pods are still scheduled on the same node:
podAntiAffinity:
  requiredDuringSchedulingIgnoredDuringExecution:
  - labelSelector:
      matchLabels:
        app: database
    topologyKey: ""

What is the likely cause?
medium
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

  1. Step 1: Check topologyKey usage

    The topologyKey must be a valid node label key like kubernetes.io/hostname. Empty string disables the rule.
  2. Step 2: Understand scheduler behavior

    With empty topologyKey, the scheduler ignores the anti-affinity rule, allowing pods on same node.
  3. Final Answer:

    Empty topologyKey causes the rule to be ignored -> Option A
  4. 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

  1. 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.
  2. 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.
  3. 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.
  4. Final Answer:

    Use required podAntiAffinity on hostname and preferred podAffinity on zone -> Option B
  5. 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 unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard