Requests / Limits / QoS
Guaranteed: requests = limits (CPU + Memory,
jeder Container), nie wegen fremder Pods evicted,
oom_score_adj −997. Eviction-Reihenfolge: Nutzung
> requests, dann Priority. QoS ist nur Näherung.
Burstable: mindestens ein request/limit, aber nicht Guaranteed. BestEffort: weder requests noch limits, erste Opfer bei Eviction.
CPU-Limits drosseln (CFS-throttle, Latenz-Spitzen). Memory-Limit-Hit ⇒ OOMKill. Faustregel: Memory-Limit ja, CPU-Limit nur wenn Multi-Tenant-Schutz nötig.
Affinity / Anti-Affinity
podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution
mit topologyKey: kubernetes.io/hostname verteilt
Replicas auf Nodes. preferred… ist Hint, kein
harter Constraint. topologyKey: topology.kubernetes.io/zone
= Zone-Spread.
Taints / Tolerations
Taint am Node:
kubectl taint node n1 gpu=true:NoSchedule.
Toleration im Pod erlaubt Scheduling auf getainted Node, erzwingt es aber nicht (dafür nodeSelector/Affinity).
Topology Spread Constraints
maxSkew + topologyKey +
whenUnsatisfiable: DoNotSchedule | ScheduleAnyway.
Modernerer Ersatz für viele Anti-Affinity-Regeln:
Pod-(Anti-)Affinity bremst laut Doku den Scheduler in Clustern ab
einigen hundert Nodes. matchLabelKeys: [pod-template-hash]
(Beta, Default an seit 1.27) rechnet den Skew je Revision, sonst
verzerren alte Pods den Rollout.
PriorityClass & Preemption
preemptionPolicy: PreemptLowerPriority | Never und
value je PriorityClass.
system-*-critical ist reserviert.
DRA (GA seit 1.34)
GPUs/NICs über ResourceClaim +
DeviceClass (resource.k8s.io/v1) statt
Device Plugin. Seit 1.37 GA: Extended-Resource-Mapping (bestehende
nvidia.com/gpu-Requests laufen unverändert über
DRA, wenn eine DeviceClass extendedResourceName setzt)
und Device Taints.