關閉裝置並重新啟動

本頁說明如何關閉及啟動 Google Distributed Cloud (GDC) 氣隙裝置。例如:將裝置移至新位置。

您可能會在臨時作業地點使用 GDC 實體隔離裝置,因此必須關閉裝置以利運輸,才能在不同地點之間移動裝置。在惡劣環境中,發電機可能會為裝置供電,因此您可能也需要從電源故障中還原裝置。

事前準備

請務必先停止所有工作負載,再繼續操作。如果工作負載在關機期間處於啟用狀態,Google 無法保證會發生什麼情況。

必要條件

  1. 您可以在連線至 Google Distributed Cloud (GDC) 氣隙裝置網路的筆電或工作站上執行這本 Runbook。或者,你也可以按照「連線裝置」一節的說明,將筆電或工作站連線至交換器。
  2. 請確認您有根管理員叢集的 kubeconfig 存取權。
  3. 執行 export KUBECONFIG=PATH_TO_KUBECONFIG,設定正確的 KUBECONFIG 環境變數。
  4. 確認您有 SSH 金鑰和憑證

關閉刀片

  1. 執行 kubectl get nodes -A -o wide 即可取得節點資訊。

  2. 逐一對所有節點執行下列指令,暫停 BareMetalHost 同步作業。將 NODE_NAME 替換為步驟 1 中取得的節點名稱:

    kubectl annotate bmhost -n gpc-system NODE_NAME "baremetalhost.metal3.io/paused=true" --overwrite
    

    輸出內容可能如下所示:

    baremetalhost.metal3.io/**-**-bm01 annotated
    baremetalhost.metal3.io/**-**-bm02 annotated
    baremetalhost.metal3.io/**-**-bm03 annotated
    
  3. 逐一限制所有節點:

    kubectl cordon NODE_NAME
    

    輸出內容可能如下所示:

    node/**-**-bm01 cordoned
    node/**-**-bm02 cordoned
    node/**-**-bm03 cordoned
    
  4. 如要判斷 etcd 領導者節點和追隨者節點,請針對所有節點逐一執行下列步驟:

    1. 記下 kubectl get nodes -A -o wide 輸出內容的 INTERNAL-IP 欄下方的值,找出用於 SSH 的目標 IP。建立 SSH 連線:

      ssh root@INTERNAL-IP
      
    2. 如要判斷目前節點是 etcd 領導者還是追隨者,請在 SSH 終端機中執行下列指令:

      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
      

      請注意 IS LEADER 欄位。

      etcd 領導者節點的輸出內容可能如下所示:

      [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 |        |
      +----------------+------------------+--------------+---------+-----------+------------+-----------+------------+--------------------+--------+
      

      兩個 etcd follower 節點的輸出內容可能如下列範例所示:

      [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 |        |
      +----------------+------------------+--------------+---------+-----------+------------+-----------+------------+--------------------+--------+
      

      記下節點的 etcd 領導者和 etcd 追隨者狀態。

  5. 排空兩個 etcd follower 節點。請勿排空 etcd 領導者節點。

    kubectl drain NODE_NAME --delete-emptydir-data --grace-period 900 --ignore-daemonsets --disable-eviction
    

    輸出內容可能如下所示:

    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
    .
    .
    .
    
  6. 按適當流程關閉兩個 etcd follower 節點。請為兩個節點逐一完成後續步驟。

  7. 使用 iLO 關閉 NODE_NAME

    1. 擷取 iLO 的使用者名稱:

      kubectl get secret bmc-credentials-NODE_NAME -n gpc-system -o jsonpath="{.data.username}" | base64 --decode
      
    2. 擷取 iLO 的密碼:

      kubectl get secret bmc-credentials-NODE_NAME -n gpc-system -o jsonpath="{.data.password}" | base64 --decode
      
    3. BMC-IP 欄中的值擷取 NODE_NAMEBMC-IP 位址:

      kubectl get servers -A
      
    4. 前往上一個步驟取得的 BMC-IP 位址,然後輸入取得的使用者名稱和密碼登入。

    5. 將游標懸停在第一列的第一個按鈕上。應該會顯示 Power: ON。按一下該圖示。系統會顯示下拉式選單,請點選標示為 Momentary Press 的第一個項目。按鈕顏色會從綠色變為橘色,表示節點正在關機。等待按鈕變為黃色,表示裝置已關機。這需要幾分鐘的時間。

  8. 兩個 etcd follower 節點都關機後,最後請針對 etcd leader 節點重複步驟 7。

移除 YubiKey 以利運送

安裝完成後,如需運送系統,請移除 YubiKey 並分開運送。請務必自行標記鑰匙。

啟動電源並連線

如果裝置意外斷電 (例如強制關機),裝置會自動重新啟動。在這種情況下,請從步驟 7 開始,略過步驟 1 到 6。如果發生未預期的斷電情況,您可能會遺失部分資料,且這些資料不會保留。

行動計畫

  1. 在每個節點中插入 YubiKey。

  2. 將 GDC 氣隙裝置機器接上電源,然後依任意順序按下每個節點的電源按鈕。

  3. 節點啟動電源後,請等待幾分鐘,讓控制層連線。kubectl 可以在 30 分鐘內連線至控制層。

  4. 執行 kubectl get nodes -A 即可取得節點名稱。

  5. 取消每個節點的封鎖,以啟用排程:

    kubectl uncordon `NODE_NAME`
    
  6. 針對每個節點,繼續同步處理裸機主機:

    kubectl annotate bmhost -n gpc-system NODE_NAME "baremetalhost.metal3.io/paused=false" --overwrite
    
  7. 使用 kubectl get nodes -A 檢查節點狀態。

    • 如果所有節點都處於 Ready 狀態,請等待兩小時,讓系統完成調解程序。輸出內容可能如下所示:

      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
      

      在這種情況下,你無須採取其他行動。

    • 否則,如果有一或多個節點處於「NotReady」狀態,請重新啟動部分服務,讓叢集準備就緒。輸出內容可能如下所示:

      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
      

      在本例中,請記下未就緒的節點名稱,然後繼續執行後續步驟。

  8. 建立與 NotReady 節點的 SSH 連線。SSH 的目標 IP 位址是 kubectl get nodes -A -o wide 輸出內容的 INTERNAL-IP 欄下方的值:

    ssh root@INTERNAL-IP
    
  9. NotReady 節點上重新啟動 containerdkubelet 服務。下列指令會在節點上執行,不會在連線至 Google Distributed Cloud (GDC) 實體隔離裝置的客戶筆電或工作站上執行:

    systemctl stop containerd
    systemctl daemon-reload
    systemctl restart containerd
    systemctl stop kubelet
    systemctl start kubelet
    
  10. 如要驗證 containerdkubelet 服務的狀態,請在 NotReady 節點上執行下列指令:

    systemctl status kubelet
    systemctl status containerd
    

    輸出內容可能如下所示:

    # 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
    .
    .
    .
    

    如果 containerdkubelet 服務在重新啟動後運作正常,請等待兩小時,讓系統完成對帳。