Mit der Pod Affinity (Pod-Affinität) legt Kubernetes fest, dass ein Pod in der Nähe bestimmter anderer Pods laufen soll. Die Regel steht im Feld spec.affinity.podAffinity und arbeitet mit den Labels der Ziel-Pods, die ein Kubernetes-Label-Selektor auswählt.
Harte und weiche Regeln
Pod-Affinität gibt es in zwei Ausprägungen:
requiredDuringSchedulingIgnoredDuringExecution– die Bedingung muss beim Scheduling zwingend erfüllt sein, sonst bleibt der Pod Pending.preferredDuringSchedulingIgnoredDuringExecution– eine weiche Präferenz mitweight(1–100): Kubernetes versucht, sie zu erfüllen, findet aber auch einen anderen Platz.
Der Namensbestandteil „IgnoredDuringExecution“ bedeutet: Läuft ein Pod einmal, wird er nicht verschoben, wenn sich später Labels ändern.
Beispiel
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: redis-cache
topologyKey: kubernetes.io/hostname
Dieses Beispiel platziert den Pod nur auf einem Node, auf dem bereits ein Pod mit dem Label app: redis-cache läuft. Der topologyKey bestimmt die Ebene: kubernetes.io/hostname bedeutet derselbe Node, topology.kubernetes.io/zone dieselbe Verfügbarkeitszone. Als Operatoren sind In, NotIn, Exists, DoesNotExist, Gt und Lt erlaubt.
Wofür ist Pod Affinity da?
Typische Anwendungsfälle sind latenzkritische Paare – etwa eine Anwendung, die auf demselben Node wie ihr Redis-Cache laufen soll – und Datenlokalität, wenn ein Pod nah an anderen Pods arbeiten muss. Die Abgrenzung zur Node-Affinität: Dort entscheiden Labels des Kubernetes-Nodes, bei der Pod-Affinität entscheiden Labels anderer Pods. Das Gegenstück ist die Pod-Anti-Affinität; die gleichmäßige Verteilung übernehmen Topology Spread Constraints. Verwaltet werden die Regeln wie alle Ressourcen mit kubectl.