Wenn Sie Knoten reparieren oder warten müssen, sollten Sie zuerst die Knoten in den Wartungsmodus versetzen. Dadurch werden vorhandene Pods und Arbeitslasten ordnungsgemäß per Drain beendet, wobei kritische System-Pods wie der API-Server ausgeschlossen werden. Der Wartungsmodus verhindert außerdem, dass der Knoten neue Pod-Zuweisungen erhält. Im Wartungsmodus können Sie an Ihren Knoten arbeiten, ohne den Pod-Traffic zu unterbrechen.
Funktionsweise
Google Distributed Cloud bietet eine Möglichkeit, Knoten in den Wartungsmodus zu versetzen. Auf diese Weise können andere Clusterkomponenten korrekt erkennen, dass sich der Knoten im Wartungsmodus befindet. Wenn Sie einen Knoten in den Wartungsmodus versetzen, können keine weiteren Pods auf dem Knoten geplant werden und vorhandene Pods werden beendet.
Anstatt den Wartungsmodus zu verwenden, können Sie auch manuell Kubernetes-Befehle wie kubectl cordon
und kubectl drain
auf einem bestimmten Knoten verwenden.
Wenn Sie den Wartungsmodus verwenden, führt Google Distributed Cloud folgende Schritte aus:
1,29
Google Distributed Cloud fügt den angegebenen Knoten die Markierung
baremetal.cluster.gke.io/maintenance:NoSchedule
hinzu, um die Planung neuer Pods auf dem Knoten zu verhindern.Google Distributed Cloud verwendet die Bereinigungs-API, um jeden Pod zu entfernen. Bei dieser Methode zum Ausgleichen von Knoten werden PodDisruptionBudgets (PDBs) berücksichtigt. Sie können PDBs konfigurieren, um Ihre Arbeitslasten zu schützen. Dazu geben Sie mit den Feldern
minAvailable
undmaxUnavailable
ein tolerierbares Maß an Unterbrechung für eine Reihe von Pods an. Das Draining von Knoten auf diese Weise bietet einen besseren Schutz vor Arbeitslastunterbrechungen. Der entfernungsbasierte Knotenausgleich ist ab Version 1.29 allgemein verfügbar.Damit Knoten beim Warten auf das Beenden von Pods nicht im Wartezustand verbleiben, wird ein Zeitlimit von 20 Minuten erzwungen. Pods werden möglicherweise nicht beendet, wenn sie so konfiguriert sind, dass sie alle Markierungen tolerieren oder Finaler haben. Google Distributed Cloud versucht, alle Pods zu beenden. Wenn das Zeitlimit jedoch überschritten wird, wird der Knoten in den Wartungsmodus versetzt. Dieses Zeitlimit verhindert, dass ausgeführte Pods Upgrades blockieren.
1.28 und niedriger
Google Distributed Cloud fügt den angegebenen Knoten die Markierung
baremetal.cluster.gke.io/maintenance:NoSchedule
hinzu, um die Planung neuer Pods auf dem Knoten zu verhindern.Google Distributed Cloud fügt die Markierung
baremetal.cluster.gke.io/maintenance:NoExecute
hinzu. Durch die Wirkung der MarkierungNoExecute
stoppt Google Distributed Cloudkube-scheduler
die Pods und entleert den Knoten. Bei dieser Methode zum Ausgleichen von Knoten werden PDBs nicht berücksichtigt.Damit Knoten beim Warten auf das Beenden von Pods nicht im Wartezustand verbleiben, wird ein Zeitlimit von 20 Minuten erzwungen. Pods werden möglicherweise nicht beendet, wenn sie so konfiguriert sind, dass sie alle Markierungen tolerieren oder Finaler haben. Google Distributed Cloud versucht, alle Pods zu beenden. Wenn das Zeitlimit jedoch überschritten wird, wird der Knoten in den Wartungsmodus versetzt. Dieses Zeitlimit verhindert, dass ausgeführte Pods Upgrades blockieren.
Entfernungsbasiertes Draining
Mit dem Wechsel zum markierungsbasierten Knotenausgleich vom markierungsbasierten Ausgleich sind keine Verfahrensänderungen verbunden. Der Wechsel wirkt sich nur auf die Abgleichslogik aus.
Diese Funktion befindet sich nicht bei allen unterstützten Versionen in der Startphase:
- 1.29: GA
- 1.28: Nicht verfügbar
- 1.16: Nicht verfügbar
Draining-Reihenfolge
Vor Version 1.29 wurde beim markierungsbasierten Knotenausgleich, der von Google Distributed Cloud kube-scheduler
durchgeführt wird, kein bestimmter Algorithmus zum Entziehen von Pods aus einem Knoten verwendet. Beim entfernungsbasierten Knotenausgleich werden Pods in einer bestimmten Reihenfolge basierend auf der Priorität entfernt. Die Bereinigungspriorität ist mit bestimmten Pod-Kriterien verknüpft, wie in der folgenden Tabelle dargestellt:
Draining-Reihenfolge | Pod-Kriterien (muss mit allen übereinstimmen) und |
---|---|
1 |
Pods, die den folgenden Kriterien entsprechen, werden entfernt:
|
2 |
Pods, die den folgenden Kriterien entsprechen, werden entfernt:
|
3 |
Pods, die den folgenden Kriterien entsprechen, werden entfernt:
Die Bereinigungsreihenfolge für übereinstimmende Pods basiert auf |
4 |
Warten Sie, bis die PV/PVC-Bereitstellungen von CSI bereinigt wurden, nachdem alle Pods entfernt wurden. Geben Sie mit |
5 |
Pods, die den folgenden Kriterien entsprechen, werden entfernt:
Diese Pods müssen weiterhin per Drain beendet werden, da Kubelet keine direkte Upgradekompatibilität bietet. |
Da beim Entfernen von Knoten PDBs berücksichtigt werden, blockieren PDB-Einstellungen den Knotenausgleich unter Umständen. Informationen zur Fehlerbehebung beim Leeren von Knotenpools finden Sie unter Prüfen, warum ein Knoten lange Zeit per Drain beendet wurde.
Bereinigungsbasierter Knotenausgleich deaktivieren
Der auf Entfernungen basierende Knotenausgleich ist standardmäßig für Cluster ab Nebenversion 1.29 oder Cluster, die auf Nebenversion 1.29 aktualisiert werden, aktiviert. Wenn das Entfernen von Knoten zu Problemen mit Clusterupgrades oder Clusterwartung führt, können Sie zum markierungsbasierten Knotenausgleich zurückkehren. Fügen Sie dazu der Clusterressource die Annotation baremetal.cluster.gke.io/maintenance-mode-ignore-pdb: true
hinzu.
Knoten in den Wartungsmodus versetzen
Wählen Sie in Ihrer Cluster-Konfigurationsdatei für die unter maintenanceBlocks
ausgewählten Knoten die IP-Bereiche aus, die Sie in den Wartungsmodus versetzen möchten. Die Knoten, die Sie auswählen, müssen bereit sein und im Cluster funktionieren.
So versetzen Sie Knoten in den Wartungsmodus:
Bearbeiten Sie die Cluster-Konfigurationsdatei, um die Knoten auszuwählen, die Sie in den Wartungsmodus versetzen möchten.
Sie können die Konfigurationsdatei mit einem Editor Ihrer Wahl bearbeiten oder die benutzerdefinierte Clusterressource direkt mit folgendem Befehl bearbeiten:
kubectl -n CLUSTER_NAMESPACE edit cluster CLUSTER_NAME
Ersetzen Sie Folgendes:
CLUSTER_NAMESPACE
: den Namespace des Clusters.CLUSTER_NAME
ist der Name des Clusters.
Fügen Sie der Cluster-Konfigurationsdatei den
maintenanceBlocks
-Abschnitt hinzu, um entweder eine einzelne IP-Adresse oder einen Adressbereich für die Knoten anzugeben, die Sie in den Wartungsmodus versetzen möchten.Im folgenden Beispiel wird gezeigt, wie Sie durch die Angabe eines IP-Adressbereichs mehrere Knoten auswählen:
metadata: name: my-cluster namespace: cluster-my-cluster spec: maintenanceBlocks: cidrBlocks: - 172.16.128.1-172.16.128.64
Speichern Sie die aktualisierte Cluster-Konfiguration und wenden Sie sie an.
Google Distributed Cloud versetzt die Knoten in den Wartungsmodus.
Führen Sie folgenden Befehl aus, um den Status der Knoten in Ihrem Cluster abzurufen:
kubectl get nodes --kubeconfig=KUBECONFIG
Die Ausgabe sieht in etwa so aus:
NAME STATUS ROLES AGE VERSION user-anthos-baremetal-01 Ready control-plane 2d22h v1.27.4-gke.1600 user-anthos-baremetal-04 Ready worker 2d22h v1.27.4-gke.1600 user-anthos-baremetal-05 Ready worker 2d22h v1.27.4-gke.1600 user-anthos-baremetal-06 Ready worker 2d22h v1.27.4-gke.1600
Beachten Sie, dass die Knoten weiterhin planbar sind, aber Markierungen verhindern, dass Pods (ohne eine entsprechende Toleranz) auf dem Knoten geplant werden.
Führen Sie folgenden Befehl aus, um die Anzahl der Knoten im Wartungsmodus abzurufen:
kubectl get nodepools --kubeconfig ADMIN_KUBECONFIG
Die Antwort sollte in etwa wie im folgenden Beispiel aussehen:
NAME READY RECONCILING STALLED UNDERMAINTENANCE UNKNOWN np1 3 0 0 1 0
Die Spalte
UNDERMAINTENANCE
in diesem Beispiel zeigt, dass sich ein Knoten im Wartungsmodus befindet.Google Distributed Cloud fügt den Knoten außerdem die folgenden Markierungen hinzu, wenn sie sich im Wartungsmodus befinden:
baremetal.cluster.gke.io/maintenance:NoExecute
baremetal.cluster.gke.io/maintenance:NoSchedule
Knoten aus dem Wartungsmodus entfernen
So holen Sie Knoten aus dem Wartungsmodus:
Bearbeiten Sie die Cluster-Konfigurationsdatei, um die Knoten zu löschen, die Sie aus dem Wartungsmodus holen möchten.
Sie können die Konfigurationsdatei mit einem Editor Ihrer Wahl bearbeiten oder die benutzerdefinierte Clusterressource direkt mit folgendem Befehl bearbeiten:
kubectl -n CLUSTER_NAMESPACE edit cluster CLUSTER_NAME
Ersetzen Sie Folgendes:
CLUSTER_NAMESPACE
: den Namespace des Clusters.CLUSTER_NAME
ist der Name des Clusters.
Bearbeiten Sie entweder die IP-Adressen, um bestimmte Knoten aus dem Wartungsmodus zu holen, oder entfernen Sie den
maintenanceBlocks
-Abschnitt, um alle Knoten aus dem Wartungsmodus zu holen.Speichern Sie die aktualisierte Cluster-Konfiguration und wenden Sie sie an.
Mit
kubectl
-Befehlen können Sie den Status Ihrer Knoten prüfen.
Cluster herunterfahren und neu starten
Wenn ein vollständiger Cluster heruntergefahren werden muss, folgen Sie der Anleitung in den folgenden Abschnitten, um den Cluster herunterzufahren und sicher wieder hochzufahren.
Cluster herunterfahren
Wenn Sie einen Cluster herunterfahren, der Nutzercluster verwaltet, müssen Sie zuerst alle verwalteten Nutzercluster herunterfahren. Die folgende Anleitung gilt für alle Google Distributed Cloud-Clustertypen.
Prüfen Sie den Status aller Clusterknoten:
kubectl get nodes --kubeconfig CLUSTER_KUBECONFIG
Ersetzen Sie
CLUSTER_KUBECONFIG
durch den Pfad der kubeconfig-Datei für den Cluster.Die Ausgabe sieht in etwa so aus:
NAME STATUS ROLES AGE VERSION control-0 Ready control-plane 202d v1.27.4-gke.1600 control-1 Ready control-plane 202d v1.27.4-gke.1600 control-2 Ready control-plane 202d v1.27.4-gke.1600 worker-0 Ready worker 202d v1.27.4-gke.1600 worker-1 Ready worker 202d v1.27.4-gke.1600 worker-2 Ready worker 202d v1.27.4-gke.1600 worker-3 Ready worker 202d v1.27.4-gke.1600 worker-4 Ready worker 154d v1.27.4-gke.1600 worker-5 Ready worker 154d v1.27.4-gke.1600 worker-6 Ready worker 154d v1.27.4-gke.1600 worker-7 Ready worker 154d v1.27.4-gke.1600 worker-8 Ready worker 154d v1.27.4-gke.1600 worker-9 Ready worker 154d v1.27.4-gke.1600
Wenn
STATUS
für einen Knoten nichtReady
ist, wird dringend empfohlen, dass Sie den Knotenfehler beheben und erst fortfahren, wenn alle Knoten den StatusReady
haben.Wenn Sie einen Nutzercluster herunterfahren, prüfen Sie den Status der Knoten des Administratorclusters:
kubectl get nodes --kubeconfig ADMIN_KUBECONFIG
Ersetzen Sie
ADMIN_KUBECONFIG
durch den Pfad der kubeconfig-Datei für den Verwaltungscluster.Die nachfolgenden Schritte hängen vom Administratorcluster ab. Wenn
STATUS
für einen Knoten nichtReady
ist, wird dringend empfohlen, eine Fehlerbehebung für den Knoten durchzuführen und erst fortzufahren, wenn alle Knoten den StatusReady
haben.Prüfen Sie den Status des Clusters, den Sie herunterfahren möchten:
bmctl check cluster -c CLUSTER_NAME --kubeconfig ADMIN_KUBECONFIG
Ersetzen Sie Folgendes:
CLUSTER_NAME
: der Name des Clusters, den Sie prüfen.ADMIN_KUBECONFIG
: der Pfad der kubeconfig-Datei für den Verwaltungscluster
Beheben Sie alle gemeldeten Probleme, bevor Sie fortfahren.
Achten Sie darauf, dass für den Cluster, den Sie herunterfahren, alle
etcd
-Pods ausgeführt werden:kubectl get pods --kubeconfig CLUSTER_KUBECONFIG -A \ -l component=etcd
Ersetzen Sie
CLUSTER_KUBECONFIG
durch den Pfad der kubeconfig-Datei für den Cluster.Die Ausgabe sieht in etwa so aus:
NAMESPACE NAME READY STATUS RESTARTS AGE kube-system etcd-control-0-admin 1/1 Running 0 2d22h kube-system etcd-control-1-admin 1/1 Running 0 2d22h kube-system etcd-control-2-admin 1/1 Running 0 2d22h
Wenn
STATUS
für einen Pod nichtRunning
ist, empfehlen wir dringend, dass Sie den Fehler im Pod beheben und nur fortfahren, wenn alle Pods den StatusRunning
haben.Führen Sie eine Sicherung wie unter Cluster sichern beschrieben durch.
Es ist wichtig, vor dem Herunterfahren des Clusters eine etcd-Sicherung zu erstellen, damit er wiederhergestellt werden kann, falls beim Neustart des Clusters Probleme auftreten. Etcd-Beschädigungen, Knotenhardwarefehler, Probleme mit der Netzwerkverbindung und möglicherweise andere Bedingungen können einen ordnungsgemäßen Neustart des Clusters verhindern.
Wenn Sie einen Cluster mit Worker-Knoten herunterfahren, versetzen Sie die Worker-Knoten in den Wartungsmodus.
Dieser Schritt minimiert den Schreibumfang in etcd, was die Wahrscheinlichkeit verringert, dass eine große Anzahl von etcd-Schreibvorgängen beim Neustart des Clusters abgeglichen werden muss.
Versetzen Sie die Knoten der Steuerungsebene in den Wartungsmodus.
Dieser Schritt verhindert beschädigte Schreibvorgänge für zustandsorientierte Arbeitslasten beim Herunterfahren von Knoten.
Schalten Sie Clusterknoten in der folgenden Reihenfolge aus:
- Worker-Knoten
- Load-Balancer-Knoten der Steuerungsebene
Knoten der Steuerungsebene, beginnend mit den etcd-Followern und enden mit dem etcd-Leader
Wenn Sie einen Hochverfügbarkeitscluster haben, können Sie den etcd-Leader ermitteln, indem Sie SSH verwenden, um eine Verbindung zu jedem Knoten der Steuerungsebene herzustellen und den folgenden
etcdctl
-Befehl auszuführen:ETCDCTL_API=3 etcdctl \ --cacert /etc/kubernetes/pki/etcd/ca.crt \ --cert /etc/kubernetes/pki/etcd/server.crt \ --key /etc/kubernetes/pki/etcd/server.key \ --write-out=table endpoint status
Die Antwort enthält eine
IS LEADER
-Spalte, dietrue
zurückgibt, wenn der Knoten der etcd-Leader ist.
Zu diesem Zeitpunkt ist der Cluster vollständig heruntergefahren. Nachdem Sie die erforderliche Wartung durchgeführt haben, können Sie den Cluster wie im nächsten Abschnitt beschrieben neu starten.
Cluster neu starten
Führen Sie die folgenden Schritte aus, um einen vollständig heruntergefahrenen Cluster neu zu starten.
Schalten Sie Knotenmaschinen in umgekehrter Reihenfolge zur Abschaltungsreihenfolge ein.
Entfernen Sie die Knoten der Steuerungsebene aus dem Wartungsmodus.
Eine Anleitung finden Sie unter Knoten aus dem Wartungsmodus entfernen.
Entfernen Sie Worker-Knoten aus dem Wartungsmodus.
Führen Sie Cluster-Systemdiagnosen aus, um sicherzustellen, dass der Cluster ordnungsgemäß funktioniert:
bmctl check cluster -c CLUSTER_NAME --kubeconfig ADMIN_KUBECONFIG
Wenn ein Problem, z. B. eine etcd-Absturzschleife, dazu führt, dass der Cluster nicht ordnungsgemäß neu gestartet wird, versuchen Sie, den Cluster aus der letzten als funktionierend bekannten Sicherung wiederherzustellen. Eine Anleitung dazu finden Sie unter Cluster wiederherstellen.
Abrechnungs- und Wartungsmodus
Die Abrechnung für Google Distributed Cloud richtet sich nach der Anzahl der vCPUs Ihres Clusters für Knoten, auf denen Arbeitslasten ausgeführt werden können. Wenn Sie einen Knoten in den Wartungsmodus versetzen, werden dem Knoten die Markierungen NoExecute
und NoSchedule
hinzugefügt, die Abrechnung wird jedoch nicht deaktiviert. Nachdem Sie einen Knoten in den Wartungsmodus verlegt haben, sperren Sie den Knoten (kubectl cordon NODE_NAME
), um ihn als nicht planbar zu markieren. Sobald ein Knoten als nicht planbar markiert ist, werden der Knoten und die zugehörigen vCPUs von der Abrechnung ausgeschlossen.
Wie auf der Preisseite beschrieben, können Sie mit kubectl
die vCPU-Kapazität (zur Abrechnung) jedes Ihrer Nutzercluster sehen. Der Befehl berücksichtigt nicht, ob der Knoten planbar ist oder nicht. Er stellt nur eine vCPU-Anzahl pro Knoten bereit.
So ermitteln Sie die Anzahl der vCPUs pro Knoten für Ihren Nutzercluster:
kubectl get nodes \
--kubeconfig USER_KUBECONFIG \
-o=jsonpath="{range .items[*]}{.metadata.name}{\"\t\"} \
{.status.capacity.cpu}{\"\n\"}{end}"
Ersetzen Sie USER_KUBECONFIG durch den Pfad der kubeconfig-Datei für Ihren Nutzercluster.