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" --overwrite- Die Ausgabe könnte so aussehen: - baremetalhost.metal3.io/**-**-bm01 annotated baremetalhost.metal3.io/**-**-bm02 annotated baremetalhost.metal3.io/**-**-bm03 annotated
- Sperren Sie alle Knoten einzeln: - kubectl cordon NODE_NAME- Die Ausgabe könnte so aussehen: - node/**-**-bm01 cordoned node/**-**-bm02 cordoned node/**-**-bm03 cordoned
- Fü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 von- kubectl get nodes -A -o widenotieren. Stellen Sie eine SSH-Verbindung her:- ssh root@INTERNAL-IP
- Fü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 status- Achten 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-eviction- Die 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 --decode
- Rufen Sie das Passwort für iLO ab: - kubectl get secret bmc-credentials-NODE_NAME -n gpc-system -o jsonpath="{.data.password}" | base64 --decode
- Rufen Sie die - BMC-IP-Adresse für- NODE_NAMEanhand der Werte in der Spalte- BMC-IPab:- kubectl get servers -A
- Rufen 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 Bezeichnung- Momentary 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" --overwrite
- Prü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.300- In 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.300- Notieren 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 Spalte- INTERNAL-IPder Ausgabe von- kubectl get nodes -A -o wide:- ssh root@INTERNAL-IP
- Starten Sie die Dienste - containerdund- kubeletauf dem Knoten- NotReadyneu. 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 kubelet
- Führen Sie die folgenden Befehle auf dem - NotReady-Knoten aus, um den Status der Dienste- containerdund- kubeletzu prüfen:- systemctl status kubelet systemctl status containerd- Die 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 - containerdund- kubeletnach dem Neustart ordnungsgemäß ausgeführt werden, warten Sie zwei Stunden, bis die Abstimmung abgeschlossen ist.