Auf dieser Seite wird beschrieben, wie Sie eine Google Distributed Cloud (GDC)-Appliance mit Air Gap herunterfahren und hochfahren. Zum Beispiel, um das Gerät an einen neuen Ort zu verschieben.
Sie können die GDC Air-Gap-Appliance an vorübergehenden Einsatzorten verwenden, an denen das Gerät für den Transport ausgeschaltet werden muss, um es zwischen Standorten zu bewegen. Möglicherweise müssen Sie das Gerät nach einem Stromausfall wiederherstellen, da es in rauen Umgebungen möglicherweise von Generatoren mit Strom versorgt wird.
Hinweise
Stoppen Sie alle Arbeitslasten, bevor Sie fortfahren. Google kann nicht garantieren, was passiert, wenn Arbeitslasten während des Herunterfahrens aktiv sind.
Vorbereitung
- Sie können dieses Runbook auf einem Laptop oder einer Workstation ausführen, die mit dem Netzwerk der Air-Gap-Appliance von Google Distributed Cloud (GDC) verbunden ist. Alternativ können Sie einen Laptop oder eine Workstation mit dem Switch verbinden. Folgen Sie dazu der Anleitung unter Gerät verbinden.
- Sie benötigen Zugriff auf die kubeconfig-Datei für den Root-Administratorcluster.
- Legen Sie die richtige KUBECONFIG-Umgebungsvariable mit dem Befehl
export KUBECONFIG=PATH_TO_KUBECONFIGfest. - Achten Sie darauf, dass Sie den SSH-Schlüssel und das Zertifikat haben.
Schalte die Klingen aus
Mit
kubectl get nodes -A -o widekönnen Sie Informationen zu Knoten abrufen.Pausieren Sie die BareMetalHost-Synchronisierung, indem Sie den folgenden Befehl für alle Knoten einzeln ausführen.Ersetzen Sie
NODE_NAMEdurch die in Schritt 1 abgerufenen Knotennamen:kubectl annotate bmhost -n gpc-system NODE_NAME "baremetalhost.metal3.io/paused=true" --overwriteDie Ausgabe könnte so aussehen:
baremetalhost.metal3.io/**-**-bm01 annotated baremetalhost.metal3.io/**-**-bm02 annotated baremetalhost.metal3.io/**-**-bm03 annotatedSperren Sie alle Knoten einzeln:
kubectl cordon NODE_NAMEDie Ausgabe könnte so aussehen:
node/**-**-bm01 cordoned node/**-**-bm02 cordoned node/**-**-bm03 cordonedFühren Sie diesen Schritt für alle Knoten einzeln aus, um den etcd-Leader-Knoten und die Follower-Knoten zu ermitteln:
Suchen Sie nach Ziel-IPs für SSH, indem Sie die Werte in der Spalte
INTERNAL-IPder Ausgabe vonkubectl get nodes -A -o widenotieren. Stellen Sie eine SSH-Verbindung her:ssh root@INTERNAL-IPFühren Sie den folgenden Befehl im SSH-Terminal aus, um festzustellen, ob der aktuelle Knoten der etcd-Leader oder -Follower ist:
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 statusAchten Sie auf das Feld
IS LEADER.Die Ausgabe für den etcd-Leaderknoten könnte so aussehen:
[root@**-**-bm0* ~]# 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 +----------------+------------------+--------------+---------+-----------+------------+-----------+------------+--------------------+--------+ | ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS | +----------------+------------------+--------------+---------+-----------+------------+-----------+------------+--------------------+--------+ | ************** | **************** | 3.4.30-gke.1 | 162 MB | true | false | 3641 | 12957958 | 12957958 | | +----------------+------------------+--------------+---------+-----------+------------+-----------+------------+--------------------+--------+Die Ausgabe für die beiden etcd-Follower-Knoten könnte so aussehen:
[root@**-**-bm0* ~]# 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 +----------------+------------------+--------------+---------+-----------+------------+-----------+------------+--------------------+--------+ | ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS | +----------------+------------------+--------------+---------+-----------+------------+-----------+------------+--------------------+--------+ | ************** | **************** | 3.4.30-gke.1 | 163 MB | false | false | 3641 | 12957404 | 12957404 | | +----------------+------------------+--------------+---------+-----------+------------+-----------+------------+--------------------+--------+Notieren Sie sich den Status „etcd-leader“ und „etcd-follower“ der Knoten.
Leeren Sie die beiden etcd-Follower-Knoten. Führen Sie keinen Drain-Vorgang für den etcd-Leader-Knoten durch.
kubectl drain NODE_NAME --delete-emptydir-data --grace-period 900 --ignore-daemonsets --disable-evictionDie Ausgabe könnte so aussehen:
node/**-**-bm01 already cordoned WARNING: ignoring DaemonSet-managed Pods: kube-system/anetd-krj2z, kube-system/etcd-defrag-xh469, kube-system/ipam-controller-manager-2f4dz, kube-system/istio-cni-node-cgqv4, kube-system/kube-proxy-5mwf2, kube-system/localpv-mn2jh, kube-system/metallb-speaker-6l7sv, mon-system/mon-node-exporter-backend-nd8mp, netapp-trident/netapp-trident-node-linux-rrlmd, obs-system/anthos-audit-logs-forwarder-tpfqv, obs-system/anthos-log-forwarder-npjh4, obs-system/kube-control-plane-metrics-proxy-wp8nh, obs-system/log-failure-detector-crbnv, obs-system/oplogs-forwarder-sqwvj, vm-system/macvtap-v9pgp, vm-system/virt-handler-86khx pod/grafana-0 deleted pod/capi-kubeadm-bootstrap-controller-manager-1.30.400-gke.136lvgtf deleted pod/grafana-0 deleted pod/grafana-proxy-server-86d8fc4758-mkc4f deleted . . . node/**-**-bm02 already cordoned WARNING: ignoring DaemonSet-managed Pods: kube-system/anetd-v75jz, kube-system/etcd-defrag-t5jnc, kube-system/ipam-controller-manager-5958m, kube-system/istio-cni-node-ggv4c, kube-system/kube-proxy-r6x46, kube-system/localpv-g56xc, kube-system/metallb-speaker-tmw72, mon-system/mon-node-exporter-backend-9rs7k, netapp-trident/netapp-trident-node-linux-9jmfp, obs-system/anthos-audit-logs-forwarder-bwns9, obs-system/anthos-log-forwarder-lbskj, obs-system/kube-control-plane-metrics-proxy-grthl, obs-system/log-failure-detector-dzh4v, obs-system/oplogs-forwarder-vdn7z, vm-system/macvtap-mjwtc, vm-system/virt-handler-dlqvv pod/vai-web-plugin-backend-5dfd6d6597-nxxgn pod/vai-web-plugin-frontend-6b5468968b-mrr7g pod/grafana-proxy-server-64b759fbf6-b8pl8 pod/iam-bundledidp-backend-0 . . .Fahren Sie die beiden etcd-Follower-Knoten ordnungsgemäß herunter. Führen Sie den nächsten Schritt einzeln für beide Knoten aus.
So deaktivieren Sie
NODE_NAMEüber iLO:Rufen Sie den Nutzernamen für iLO ab:
kubectl get secret bmc-credentials-NODE_NAME -n gpc-system -o jsonpath="{.data.username}" | base64 --decodeRufen Sie das Passwort für iLO ab:
kubectl get secret bmc-credentials-NODE_NAME -n gpc-system -o jsonpath="{.data.password}" | base64 --decodeRufen Sie die
BMC-IP-Adresse fürNODE_NAMEanhand der Werte in der SpalteBMC-IPab:kubectl get servers -ARufen Sie die im vorherigen Schritt erhaltene
BMC-IP-Adresse auf und melden Sie sich mit dem erhaltenen Nutzernamen und Passwort an.Bewegen Sie den Mauszeiger auf die erste Schaltfläche in der oberen Zeile. Es sollte
Power: ONangezeigt werden. Klicken Sie darauf. Ein Drop-down-Menü wird angezeigt. Klicken Sie auf den ersten Eintrag mit der BezeichnungMomentary Press. Die Farbe der Schaltfläche ändert sich von Grün zu Orange. Das bedeutet, dass der Knoten heruntergefahren wird. Warte, bis die Taste gelb leuchtet. Das kann einige Minuten dauern.
Nachdem beide etcd-Follower-Knoten heruntergefahren wurden, wiederholen Sie Schritt 7 für den etcd-Leader-Knoten.
YubiKeys für den Transport entfernen
Wenn Sie das System nach der Installation transportieren müssen, entfernen Sie die Yubikeys und transportieren Sie sie separat. Achten Sie darauf, dass Sie die Schlüssel selbst taggen.
Einschalten und verbinden
Wenn die Stromversorgung unerwartet unterbrochen wurde, z. B. durch ein hartes Herunterfahren, wird das Gerät automatisch wieder hochgefahren. In diesem Fall sollten Sie mit Schritt 7 beginnen und die Schritte 1 bis 6 überspringen. Nach einem unerwarteten Stromausfall kann es zu Datenverlusten kommen, auch nach dem Neustart.
Maßnahmenplan
Setzen Sie die YubiKeys in jeden Knoten ein.
Schließen Sie das GDC-Air-Gap-Gerät an die Stromversorgung an und drücken Sie die Ein-/Aus-Taste auf jedem Knoten in beliebiger Reihenfolge.
Warten Sie nach dem Hochfahren der Knoten einige Minuten, bis die Steuerungsebene eine Verbindung herstellt.
kubectlkann innerhalb von 30 Minuten eine Verbindung zur Steuerungsebene herstellen.Sie ermitteln die Namen der Knoten durch Ausführen von
kubectl get nodes -A.Heben Sie die Sperrung jedes Knotens auf, um die Planung zu aktivieren:
kubectl uncordon `NODE_NAME`Synchronisierung der Bare-Metal-Hosts für jeden Knoten fortsetzen:
kubectl annotate bmhost -n gpc-system NODE_NAME "baremetalhost.metal3.io/paused=false" --overwritePrüfen Sie den Status der Knoten mit
kubectl get nodes -A.Wenn alle Knoten den Status
Readyhaben, warten Sie zwei Stunden, bis der Abgleich abgeschlossen ist. Die Ausgabe könnte so aussehen:NAME STATUS ROLES AGE VERSION **-**-bm01 Ready control-plane 4d13h v1.30.6-gke.300 **-**-bm02 Ready control-plane 4d13h v1.30.6-gke.300 **-**-bm03 Ready control-plane 4d13h v1.30.6-gke.300In diesem Fall sind keine weiteren Maßnahmen erforderlich.
Wenn ein oder mehrere Knoten den Status „NotReady“ haben, starten Sie einige Dienste neu, um den Cluster vorzubereiten. Die Ausgabe könnte so aussehen:
NAME STATUS ROLES AGE VERSION **-**-bm01 Ready control-plane 4d13h v1.30.6-gke.300 **-**-bm02 Ready control-plane 4d13h v1.30.6-gke.300 **-**-bm03 NotReady control-plane 4d13h v1.30.6-gke.300Notieren Sie sich in diesem Fall den Namen des Knotens, der nicht bereit ist, und fahren Sie mit den nächsten Schritten fort.
Stellen Sie eine SSH-Verbindung zum Knoten
NotReadyher. Die Ziel-IP-Adressen von SSH sind Werte in der SpalteINTERNAL-IPder Ausgabe vonkubectl get nodes -A -o wide:ssh root@INTERNAL-IPStarten Sie die Dienste
containerdundkubeletauf dem KnotenNotReadyneu. Die folgenden Befehle müssen auf Knoten und nicht auf dem Laptop oder der Workstation des Kunden ausgeführt werden, die mit der Air-Gap-Appliance von Google Distributed Cloud (GDC) verbunden sind:systemctl stop containerd systemctl daemon-reload systemctl restart containerd systemctl stop kubelet systemctl start kubeletFühren Sie die folgenden Befehle auf dem
NotReady-Knoten aus, um den Status der Dienstecontainerdundkubeletzu prüfen:systemctl status kubelet systemctl status containerdDie Ausgabe könnte so aussehen:
# systemctl status kubelet ● kubelet.service - kubelet: The Kubernetes Node Agent Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled) Drop-In: /etc/systemd/system/kubelet.service.d └─00-standalone_containerd.conf, 10-kubeadm.conf Active: active (running) since Thu 2025-03-27 07:58:27 UTC; 34s ago . . . # systemctl status containerd ● containerd.service - containerd container runtime Loaded: loaded (/etc/systemd/system/containerd.service; disabled; vendor preset: disabled) Active: active (running) since Thu 2025-03-27 07:58:17 UTC; 52s ago . . .Wenn die Dienste
containerdundkubeletnach dem Neustart ordnungsgemäß ausgeführt werden, warten Sie zwei Stunden, bis die Abstimmung abgeschlossen ist.