Auf dieser Seite wird beschrieben, wie Sie eine Google Distributed Cloud-Appliance (GDC) ohne Internetverbindung 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_KUBECONFIG
fest. - Achten Sie darauf, dass Sie den SSH-Schlüssel und das Zertifikat haben.
Schalte die Klingen aus
Mit
kubectl get nodes -A -o wide
kö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_NAME
durch 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-IP
der Ausgabe vonkubectl get nodes -A -o wide
notieren. 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 ein 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 etcd-Leader- und etcd-Follower-Status der Knoten.
Leeren Sie die beiden etcd-Follower-Knoten. Führen Sie keinen Drain-Vorgang für den etcd-Leader-Knoten aus.
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ürNODE_NAME
anhand der Werte in der SpalteBMC-IP
ab: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: ON
angezeigt 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. Es kann zu einem Datenverlust kommen, der nach einem unerwarteten Stromausfall nicht bestehen bleibt.
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.
kubectl
kann 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
Ready
haben, 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
NotReady
her. Die Ziel-IP-Adressen von SSH sind Werte in der SpalteINTERNAL-IP
der Ausgabe vonkubectl get nodes -A -o wide
:ssh root@INTERNAL-IP
Starten Sie die Dienste
containerd
undkubelet
auf dem KnotenNotReady
neu. 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 auf dem
NotReady
-Knoten die folgenden Befehle aus, um den Status der Dienstecontainerd
undkubelet
zu 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
containerd
undkubelet
nach dem Neustart ordnungsgemäß ausgeführt werden, warten Sie zwei Stunden, bis der Abgleich abgeschlossen ist.