Zabránenie plánovania podov na špecifické uzly v K3s (nodeAffinity)

Vytvorené: 24. 8. 2025 08:43 Aktualizované: 27. 8. 2025 13:14
Vyriešené
Obsah článku

title: "Zabránenie plánovania podov na špecifické uzly v K3s (nodeAffinity)"
slug: "k3s-node-affinity-exclude-nodes"
technologies: ["Kubernetes", "K3s", "DaemonSet", "nodeAffinity", "Labels", "Taints"]
tags: ["kubernetes", "k3s", "scheduling", "daemonset", "gpu-operator", "resource-management"]
date_solved: "2025-08-21"

Projekt/Téma: Zabránenie plánovania podov na špecifické uzly v K3s (nodeAffinity)

  1. Cieľ / Problém na vyriešenie: DaemonSet (napr. gpu-operator-node-feature-discovery-worker) sa automaticky snaží spustiť na všetkých uzloch v klastri. Na nízko-výkonných uzloch (Raspberry Pi Zero 2 W) tento pod spôsobuje extrémne vysokú záťaž a zaseknutie uzla. Cieľom je zabrániť plánovaniu tohto DaemonSetu na špecifické, nevhodné uzly.

  2. Použité technológie a nástroje:

    • Orchestrácia: Kubernetes (K3s)
    • Nástroj: kubectl
    • Koncepty: DaemonSet, Labels, Taints, nodeAffinity
  3. Kľúčové postupy a konfiguračné kroky:

    1. Identifikovať nízko-výkonné uzly, ktoré chceme vylúčiť (napr. z1, z2, z3).
    2. Pridať na tieto uzly unikátne označenie (Label). Toto je kľúč, podľa ktorého budeme filtrovať.
      kubectl label nodes z1 Arch=rpi-zero
      kubectl label nodes z2 Arch=rpi-zero
      kubectl label nodes z3 Arch=rpi-zero
    3. Otvoriť na úpravu YAML definíciu problémového DaemonSetu.
      kubectl edit daemonset gpu-operator-node-feature-discovery-worker -n default
    4. Do špecifikácie podu (spec.template.spec) pridať sekciu affinity, ktorá definuje pravidlo pre plánovanie.
    5. Uložiť zmeny. Kubernetes automaticky ukončí pody na uzloch, ktoré už nespĺňajú nové pravidlá.
  4. Výsledné kódy a skripty: YAML snippet, ktorý sa pridá do spec.template.spec v DaemonSete:

    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: Arch
              operator: NotIn
              values:
              - rpi-zero
  5. Zistené problémy a riešenia (Gotchas):

    • Problém: Použitie Taints (kubectl taint nodes ...) nemusí stačiť. Niektoré systémové DaemonSety majú všeobecné tolerancie, ktoré im umožňujú bežať aj na "pošpinených" uzloch.
    • Riešenie: nodeAffinity je silnejší a explicitnejší mechanizmus. Pravidlo operator: NotIn je ideálne na vylúčenie skupiny uzlov na základe ich označenia (label).
  6. Finálny výsledok / Záver: Problémový DaemonSet sa už neplánuje na nízko-výkonné uzly Raspberry Pi Zero, čím sa uvoľnili ich zdroje. Uzly sa stabilizovali a mohli sa úspešne pripojiť do klastra.

Vyriešené: 21. 8. 2025