Node Hardening (Vorschau) in Azure Kubernetes Service (AKS)

Die Knotenhärtung ist ein Opt-In-Feature für Linux-Knotenpools, das die Knotenstabilität aufrechterhält, wenn Workloads CPU-, Speicher- oder Datenträgerengpässe verursachen. Wenn Sie die Knotenhärtung auf einem Cluster aktivieren, ändert AKS, wie jeder Knoten Ressourcen für Kubernetes-Komponenten und Hostdienste reserviert und erzwingt, und wie der kubelet Pods entfernt, wenn Ressourcen knapp werden.

In diesem Artikel wird erläutert, welche Änderungen die Knotenhärtung mit sich bringt, die gehärteten Standardwerte mit den AKS-Standardwerten verglichen und Ihnen gezeigt, wie Sie das Feature aktivieren, überprüfen, anpassen und deaktivieren.

Important

AKS-Preview-Funktionen stehen auf Selbstbedienungs- und Opt-in-Basis zur Verfügung. Vorschauversionen werden „im Istzustand“ und „wie verfügbar“ bereitgestellt und sind von den Service Level Agreements und der eingeschränkten Garantie ausgeschlossen. AKS-Vorschauversionen werden teilweise vom Kundensupport auf Grundlage der bestmöglichen Leistung abgedeckt. Daher sind diese Funktionen nicht für die Verwendung in der Produktion vorgesehen. Weitere Informationen finden Sie in den folgenden Supportartikeln:

Vorteile der Node-Härtung

Bei ausgelasteten oder sprunghaft ausgelasteten Knoten können Workloads Ressourcen nutzen, die das Kubelet, die Containerlaufzeit und Hostdienste benötigen. In diesem Fall können Knoten nicht mehr reagieren, einen NotReady-Status melden oder Pods abrupt beenden. Die Node-Härtung reduziert diese Risiken auf folgende Weise:

  • Erzwungene Reservierungen: Standardmäßig verwendet AKS kube-reservierte Werte nur, um zu berechnen, wie viel Kapazität der Scheduler pods zuordnen kann. Durch die Verwendung von Node Hardening erzwingt das Kubelet auch kube-reserved und vom System reservierte Kapazität über Linux-Steuerungsgruppen (cgroups). Das Kubelet und containerd werden in einer dedizierten kubereserved.slice cgroup ausgeführt, sodass sie ihre reservierte CPU-Freigabe und den Arbeitsspeicher behalten, auch wenn Pods den Knoten auslasten.
  • Dedizierte Kapazität für Hostdienste: Die Knotenhärtung fügt eine systemreservierte Zuordnung für Hostbetriebssystemdienste hinzu, die in system.slice ausgeführt werden.
  • Mehr Arbeitsspeicherreserve: Die harte Eviction-Schwelle für verfügbaren Arbeitsspeicher skaliert mit dem Knotenspeicher, sodass der Kubelet Pods entfernt, bevor auf dem Knoten der Arbeitsspeicher kritisch knapp wird.
  • Ordnungsgemäße Entfernung: Schwellenwerte für die vorläufige Entfernung lassen den Kubelet Pods kontrolliert mit einer Beendigungsfrist entfernen, wenn Arbeitsspeicher oder Festplattenspeicher knapp werden. Die harte Eviction, die Pods sofort beendet, dient dann als letztes Mittel.
  • Reservierungen, die mit der Pod-Dichte zunehmen: Die Berechnung des für Kube reservierten Speichers steigt mit der maximalen Anzahl von Pods pro Knoten, wodurch der Overhead von Kubelet und Containerd bei der Ausführung einer größeren Anzahl von Pods berücksichtigt wird.

Was ändert sich, wenn Sie Node Hardening aktivieren

In den folgenden Tabellen werden die Standardwerte für Linux-Knoten mit Kubernetes 1.29 oder höher mit den Standardwerten verglichen, die AKS anwendet, wenn die Knotenhärtung aktiviert ist.

Ressourcenreservierungen

Setting Ohne Knotenhärtung Mit Node Hardening
Kube-reservierte CPU Basierend auf der Anzahl der CPU-Kerne. Weitere Informationen finden Sie unter CPU-Reservierungen. Unverändert
Für Kube reservierter Arbeitsspeicher min(20 × maxPods + 50, 25% of node memory) MiB min(35 × maxPods + max(250, 2% of node memory), 25% of node memory) MiB
Kube-reservierte Prozess-IDs (PIDs) 1000 Nicht reserviert
Systemreservierte CPU None 100m
Vom System reservierter Speicher None 200 MiB plus 100 MiB für jede volle 32 GiB des Knotenspeichers, plus 100 MiB für Cluster, die Azure CNI verwenden
Systemreservierter kurzlebiger Speicher None 1Gi

Entfernungsschwellenwerte

Setting Ohne Knotenhärtung Mit Node Hardening
Dauerhafte Entfernung: memory.available 100Mi 250Mi für Knoten mit 8 GiB Arbeitsspeicher oder weniger, 375Mi für Knoten mit mehr als 8 GiB und weniger als 32 GiB und 512Mi für Knoten mit 32 GiB oder mehr
Dauerhafte Entfernung: nodefs.available und nodefs.inodesFree 10% und 5% Unverändert
Dauerhafte Entfernung: pid.available 2000 Nicht festgelegt
Soft eviction: memory.available None 500Mi, 750Mi oder 1Gi mit den gleichen Knotenspeicherstufen wie bei der dauerhaften Entfernung, mit einer Toleranzperiode von 30 Sekunden
Soft-Eviction: nodefs.available und nodefs.inodesFree None 12% und 7%, jeweils mit einer 2-minütigen Karenzzeit
Maximale Beendigungsfrist des Pods während der Soft-Eviction Nicht festgelegt 60 Sekunden

Cgroup-Durchsetzung

Setting Ohne Knotenhärtung Mit Node-Härtung
Erzwungener Knoten zuweisbar pods pods, kube-reserved und system-reserved
Kubelet und containerd cgroup system.slice, ohne Grenzen kubereserved.slice, wobei der Arbeitsspeicher auf den für Kube reservierten Arbeitsspeicher begrenzt und eine CPU-Freigabe proportional zur Kube-reservierten CPU ist
cgroup für Host-Services system.slice, ohne Grenzen system.slice, wobei der Arbeitsspeicher auf den systemreservierten Arbeitsspeicher begrenzt und eine CPU-Freigabe proportional zur systemreservierten CPU-Leistung ist

Da die Knotenhärtung mehr Kapazität reserviert, melden Knoten weniger allocatable-Kapazität für Pods. Auf einem Knoten mit 4 vCPUs und 16 GiB Arbeitsspeicher, der Azure CNI verwendet, reduziert die Aktivierung der Node-Härtung die zuweisbare Kapazität wie folgt:

  • Mit dem standardmäßigen Höchstwert von 250 Pods pro Knoten, um ca. 570 MiB Arbeitsspeicher, 100 Millicores CPU und 1 GiB kurzlebigen Speicher.
  • Bei maximal 30 Pods pro Knoten sind das etwa 1,3 GiB Arbeitsspeicher, 100 Millicores CPU und 1 GiB kurzlebiger Speicher.

Soft-Eviction-Schwellenwerte reduzieren nicht die zuweisbare Kapazität. Sie ändern sich nur, wenn das Kubelet beginnt, Pods zu verdrängen.

Überlegungen

Beachten Sie die folgenden Überlegungen, bevor Sie Node Hardening aktivieren:

  • Sie aktivieren die Knotenhärtung auf Clusterebene und sie gilt für alle Linux-Knotenpools im Cluster. Sie können sie nicht für einzelne Knotenpools aktivieren, und es wirkt sich nicht auf Windows-Knotenpools aus.
  • Knoten melden weniger zuweisbare Kapazität, sodass Pods, die auf einen Knoten passen, bevor Sie die Node-Härtung aktivieren, möglicherweise danach nicht mehr passen. Überprüfen Sie Ihre Pod-Ressourcenanforderungen und die Größen der Knotenpools.
  • Hostdienste in system.slice teilen eine feste Speichergrenze, die dem für das System reservierten Speicher entspricht. Wenn Sie Ihre eigenen Agents auf Knoten als systemd-Dienste ausführen, z. B. Sicherheits-, Überwachungs- oder Protokollweiterleitungs-Agents, werden diese Agents auf diesen Grenzwert angerechnet. Überprüfen Sie deren Speicherauslastung und Stabilität, bevor Sie die Knotenhärtung in der Produktion verwenden.
  • Werte, die Sie in der benutzerdefinierten Kubelet-Konfiguration eines Knotenpools festlegen, setzen die entsprechenden Standardeinstellungen für die Knotenhärtung außer Kraft. Weitere Informationen finden Sie unter Anpassen von Knotenhärtungseinstellungen.
  • Wenn Sie die Knotenhärtung später deaktivieren, behalten vorhandene Knotenpools die gehärteten Einstellungen für die vorläufige Entfernung bei, auch nachdem ein Reimaging für ihre Knoten durchgeführt wurde. Um diese Einstellungen zu entfernen, müssen Sie neue Knotenpools erstellen. Weitere Informationen finden Sie unter Node Hardening deaktivieren.
  • Standardwerte können sich ändern, während sich das Feature in der Vorschau befindet. Beginnen Sie mit einem Nichtproduktionscluster, und überprüfen Sie Ihre Workloads unter repräsentativen Knotendruckbedingungen.

Prerequisites

  • Ein Azure-Abonnement. Wenn Sie kein Konto haben, erstellen Sie ein kostenloses Konto.
  • Ein AKS-Cluster mit Linux-Knotenpools oder Berechtigungen zum Erstellen eines solchen Clusters.
  • Die aks-preview Azure CLI-Erweiterung und das CustomNodeConfigPreview Featureflag, wie in den folgenden Abschnitten beschrieben.

Installieren Sie die aks-preview Azure CLI-Erweiterung

  1. Installieren Sie die aks-preview Erweiterung mithilfe des az extension add Befehls.

    az extension add --name aks-preview
    
  2. Aktualisieren Sie die Erweiterung mithilfe des Befehls az extension update auf die neueste Version.

    az extension update --name aks-preview
    

Registriere die CustomNodeConfigPreview-Feature-Flag

  1. Registrieren Sie das CustomNodeConfigPreview Feature-Flag mithilfe des az feature register Befehls.

    az feature register --namespace "Microsoft.ContainerService" --name "CustomNodeConfigPreview"
    

    Es dauert einige Minuten, bis der Status Registered (Registriert) angezeigt wird.

  2. Überprüfen Sie den Registrierungsstatus mithilfe des az feature show Befehls.

    az feature show --namespace "Microsoft.ContainerService" --name "CustomNodeConfigPreview"
    
  3. Wenn der Status "Registriert" angezeigt wird, aktualisieren Sie die Registrierung des Microsoft. ContainerService-Ressourcenanbieter mithilfe des az provider register Befehls.

    az provider register --namespace "Microsoft.ContainerService"
    

Knotenhärtung aktivieren

Während der Vorschau ist Node Hardening standardmäßig nicht aktiviert.

Aktivieren der Knotenhärtung auf einem neuen Cluster

Erstellen Sie einen Cluster mit aktivierter Knotenhärtung mithilfe des az aks create Befehls mit dem --enable-node-hardening Parameter.

Dieser Befehl erfordert die aks-preview Erweiterung und das CustomNodeConfigPreview Feature-Flag. Weitere Informationen finden Sie unter Voraussetzungen.

az aks create \
    --resource-group <resource-group-name> \
    --name <cluster-name> \
    --enable-node-hardening \
    --generate-ssh-keys

Informationen zum Überprüfen der Änderung finden Sie unter Einstellungen für Knotenhärtung überprüfen.

Aktivieren der Knotenhärtung auf einem vorhandenen Cluster

Aktivieren Sie die Knotenhärtung auf einem vorhandenen Cluster mithilfe des az aks update Befehls mit dem --enable-node-hardening Parameter.

Dieser Befehl erfordert die aks-preview Erweiterung und das CustomNodeConfigPreview Feature-Flag. Weitere Informationen finden Sie unter Voraussetzungen.

az aks update \
    --resource-group <resource-group-name> \
    --name <cluster-name> \
    --enable-node-hardening

Um die Änderung zu bestätigen, siehe Überprüfen der Knotenhärtungseinstellungen.

Überprüfen der Knotenhärtungseinstellungen

  1. Rufen Sie die Anmeldeinformationen für Ihren Cluster mithilfe des az aks get-credentials Befehls ab.

    az aks get-credentials --resource-group <resource-group-name> --name <cluster-name>
    
  2. Überprüfen Sie die effektiven Kubelet-Reservierungs- und Eviction-Einstellungen auf einem Knoten, indem Sie den Kubelet-Konfigurationsendpunkt abfragen.

    kubectl get --raw "/api/v1/nodes/<node-name>/proxy/configz" | jq '.kubeletconfig | {kubeReserved, systemReserved, evictionHard, evictionSoft, evictionSoftGracePeriod, evictionMaxPodGracePeriod, enforceNodeAllocatable}'
    

    Auf einem gehärteten Knoten enthalten systemReserved und kube-reserved Werte, und system-reserved umfasst enforceNodeAllocatable und evictionSoft.

  3. Vergleichen Sie die Kapazität des Knotens mit seinen allocatable-Ressourcen.

    kubectl get node <node-name> -o jsonpath='{.status.capacity}{"\n"}{.status.allocatable}{"\n"}'
    

    Auf einem gehärteten Knoten sind allocatable CPU, Memory und ephemeraler Speicher niedriger als die Kapazität. Der Unterschied entspricht den für Kube reservierten und systemreservierten Werten in den Ressourcenreservierungen sowie den Schwellenwerten für die dauerhafte Entfernung in den Entfernungsschwellenwerten. Beispielsweise liegt auf einem Knoten mit 4 vCPUs und 16 GiB Arbeitsspeicher, der Azure CNI nutzt, die zuweisbare CPU-Leistung um 240 Millicores unter der Kapazität: 140 Millicores sind für Kube reserviert und 100 Millicores für das System.

Anpassen von Knotenhärtungseinstellungen

Mithilfe einer benutzerdefinierten Kubelet-Konfiguration können Sie die Standardeinstellungen für kube-reserved und eviction für einen Linux-Knotenpool außer Kraft setzen. Für diese Einstellungen ist die CustomNodeConfigPreview Feature-Flag erforderlich. Sie können diese verwenden, unabhängig davon, ob die Knotenhärtung auf dem Cluster aktiviert ist. AKS verwaltet vom System reservierte Werte und die CGroup-Erzwingung, und Sie können sie nicht anpassen.

Jede Einstellung setzt eine Zeile in den Tabellen " Ressourcenreservierungen" oder "Schwellenwerte für Eviction" außer Kraft. Kube-reservierte Zeilen entsprechen den kubeReserved Einstellungen. Zeilen zur dauerhaften Entfernung entsprechen den hardEvictionThreshold-Einstellungen. Zeilen zur vorläufigen Entfernung entsprechen den softEvictionThreshold- und softEvictionGracePeriod-Einstellungen. Die maximale Toleranzperiode beim Beenden von Pods entspricht evictionMaxPodGracePeriodInSeconds.

Sie können die folgenden Einstellungen konfigurieren:

Setting Overrides Description
kubeReserved.cpuMillicores Kube-reservierte CPU Für Kubernetes-System-Daemons reservierte CPU in Milliscores.
kubeReserved.memoryMB Für Kube reservierter Arbeitsspeicher Für Kubernetes-Systemdaemone reservierter Speicher in MiB.
hardEvictionThreshold.memoryAvailable Dauerhafte Entfernung: memory.available Schwellenwert für die dauerhafte Entfernung für verfügbaren Speicher.
hardEvictionThreshold.nodeFsAvailable Dauerhafte Entfernung: nodefs.available Schwellenwert für die dauerhafte Entfernung für den verfügbaren Knotendateisystemspeicher.
hardEvictionThreshold.nodeFsInodesFree Dauerhafte Entfernung: nodefs.inodesFree Schwellenwert für die dauerhafte Entfernung für freie I-Knoten des Knotendateisystems.
softEvictionThreshold.memoryAvailable Soft eviction: memory.available Soft-Eviction-Schwellenwert für den verfügbaren Speicher.
softEvictionThreshold.nodeFsAvailable Vorläufige Entfernung: nodefs.available Soft-Eviction-Schwellenwert für den verfügbaren Speicherplatz des Node-Dateisystems.
softEvictionThreshold.nodeFsInodesFree Vorläufige Entfernung: nodefs.inodesFree Schwellenwert für die vorläufige Entfernung für freie I-Knoten des Knotendateisystems.
softEvictionGracePeriod.memoryAvailable Soft Eviction: memory.available Karenzzeit Wie lange der verfügbare Arbeitsspeicher unter dem Schwellenwert für die vorläufige Entfernung bleiben muss, bevor der Kubelet Pods entfernt.
softEvictionGracePeriod.nodeFsAvailable Soft Eviction: nodefs.available Karenzzeit Wie lange der verfügbare Knotendateisystembereich unter dem Schwellenwert für die vorläufige Entfernung bleiben muss, bevor der Kubelet Pods entfernt.
softEvictionGracePeriod.nodeFsInodesFree Soft Eviction: nodefs.inodesFree Karenzzeit Wie lange freie Knotendateisystem-Inodes unter ihrem weichen Schwellenwert bleiben müssen, bevor der Kubelet Pods entfernt.
evictionMaxPodGracePeriodInSeconds Maximale Toleranzperiode beim Beenden von Pods während der vorläufigen Entfernung Maximale Anzahl von Sekunden, die das Kubelet Pods während einer Soft-Eviction beenden lässt.
  • Zulässige Werte, Mindest- und Validierungsregeln für jede Einstellung finden Sie unter "Benutzerdefinierte Knotenkonfigurationsparameter für AKS".
  • Legen Sie für jedes Eviction-Signal sowohl die weiche Eviction-Schwelle als auch die entsprechende Karenzzeit fest, und stellen Sie sicher, dass jeder softe Eviction-Schwellenwert größer als der harte Eviction-Schwellenwert für dasselbe Signal ist.
  1. Erstellen Sie eine Kubelet-Konfigurationsdatei, z. B. nodehardening-kubelet.json, mit den Einstellungen, die Sie anpassen möchten. Im folgenden Beispiel werden alle konfigurierbaren Werte festgelegt. Es legt kube-reserved auf 200 Millicores von CPU und 1.024 MiB Arbeitsspeicher fest. Legt die Schwellenwerte für die dauerhafte Entfernung für 512Mi verfügbaren Speicher, 10% verfügbaren Dateisystemspeicher und 5% freie I-Knoten fest. Legt Schwellenwerte für die vorläufige Entfernung für 1Gi, 12% und 7% mit Toleranzperioden von 30 Sekunden, 2 Minuten und 2 Minuten fest. Außerdem wird eine maximale Beendigungsfrist für Pods von 60 Sekunden festgelegt.

    {
      "kubeReserved": {
        "cpuMillicores": 200,
        "memoryMB": 1024
      },
      "hardEvictionThreshold": {
        "memoryAvailable": "512Mi",
        "nodeFsAvailable": "10%",
        "nodeFsInodesFree": "5%"
      },
      "softEvictionThreshold": {
        "memoryAvailable": "1Gi",
        "nodeFsAvailable": "12%",
        "nodeFsInodesFree": "7%"
      },
      "softEvictionGracePeriod": {
        "memoryAvailable": "30s",
        "nodeFsAvailable": "2m",
        "nodeFsInodesFree": "2m"
      },
      "evictionMaxPodGracePeriodInSeconds": 60
    }
    
  2. Erstellen Sie einen Linux-Knotenpool, der die Konfigurationsdatei mithilfe des az aks nodepool add Befehls mit dem --kubelet-config Parameter verwendet.

    az aks nodepool add \
        --resource-group <resource-group-name> \
        --cluster-name <cluster-name> \
        --name <node-pool-name> \
        --kubelet-config ./nodehardening-kubelet.json
    

    Sie können den --kubelet-config Parameter auch mit dem az aks create Befehl verwenden, um die Konfiguration auf den anfänglichen Knotenpool des Clusters anzuwenden.

Node-Härtung deaktivieren

Deaktivieren Sie die Knotenhärtung mithilfe des az aks update Befehls mit dem --disable-node-hardening Parameter.

Dieser Befehl erfordert die aks-preview Erweiterung und das CustomNodeConfigPreview Feature-Flag. Weitere Informationen finden Sie unter Voraussetzungen.

az aks update \
    --resource-group <resource-group-name> \
    --name <cluster-name> \
    --disable-node-hardening

Durch das Deaktivieren der Knotenhärtung wird die Einstellung auf Clusterebene deaktiviert, vorhandene Knoten werden jedoch nicht sofort geändert. Vorhandene Knoten behalten alle gehärteten Einstellungen bei, bis sie z. B. während eines Knotenimageupgrades neu aufgesetzt werden. Nachdem ein Knoten neu aufgesetzt wurde, gelten die folgenden Änderungen:

  • Auf die AKS-Standardwerte zurückgesetzt: Kube-reservierte und vom System reservierte Ressourcen, harte Eviction-Schwellenwerte und Cgroup-Erzwingung. Die zuweisbare Kapazität des Knotens erhöht sich entsprechend.
  • Beibehalten: Die Soft-Eviction-Schwellenwerte, die Soft-Eviction-Karenzzeiten und die maximale Beendigungsfrist für Pods während der Soft-Eviction.

Sie können eine benutzerdefinierte Kubelet-Konfiguration nur festlegen, wenn Sie einen Cluster oder einen Knotenpool erstellen, sodass Sie die beibehaltenen Soft-Eviction-Einstellungen nicht aus einem vorhandenen Knotenpool entfernen können. Um sie zu entfernen, erstellen Sie einen neuen Knotenpool, in dem diese Einstellungen explizit deaktiviert sind, verschieben Sie Ihre Workloads in den neuen Knotenpool, und löschen Sie dann den alten Knotenpool.

  1. Erstellen Sie eine Kubelet-Konfigurationsdatei, z. B. remove-soft-eviction.json. Im folgenden Beispiel wird jeder Schwellenwert für die vorläufige Entfernung und jede Toleranzperiode auf eine leere Zeichenfolge festgelegt, wodurch die vorläufige Entfernung für dieses Signal deaktiviert wird. Außerdem wird die maximale Karenzfrist für Pod-Beendigung auf 0 festgelegt, bei der es sich um den Standard-AKS-Standardwert handelt.

    {
      "softEvictionThreshold": {
        "memoryAvailable": "",
        "nodeFsAvailable": "",
        "nodeFsInodesFree": ""
      },
      "softEvictionGracePeriod": {
        "memoryAvailable": "",
        "nodeFsAvailable": "",
        "nodeFsInodesFree": ""
      },
      "evictionMaxPodGracePeriodInSeconds": 0
    }
    
  2. Erstellen Sie einen Linux-Knotenpool, der die Konfigurationsdatei mithilfe des az aks nodepool add Befehls mit dem --kubelet-config Parameter verwendet.

    az aks nodepool add \
        --resource-group <resource-group-name> \
        --cluster-name <cluster-name> \
        --name <node-pool-name> \
        --kubelet-config ./remove-soft-eviction.json
    
  3. Verschieben Sie Ihre Workloads in den neuen Knotenpool, und löschen Sie dann den alten Knotenpool. Weitere Informationen finden Sie unter Ändern der Größe von Knotenpools in AKS.

Informationen zum Überprüfen der Einstellungen auf einem Knoten finden Sie unter Einstellungen für Knotenhärtung überprüfen. Auf Knoten im neuen Knotenpool ist evictionSoft leer.