自動修復節點和健康狀態檢查

在 Google Distributed Cloud 中,系統預設會啟用定期健康狀態檢查和節點自動修復功能。

節點自動修復功能會持續偵測及修復叢集中健康狀態不良的節點。

系統每 15 分鐘會執行一次定期健康狀態檢查。這些檢查與 gkectl diagnose cluster 執行的檢查相同。結果會以記錄和事件的形式,顯示在管理叢集的叢集物件中。

請確保管理員和使用者叢集各有額外的 IP 位址,可用於自動修復節點。

如果啟用進階叢集,系統不會在自動修復程序中執行定期健康狀態檢查。

未啟用進階叢集時,節點健康狀態不良的條件

下列情況表示節點健康狀態不良:enableAdvanceClusterfalse

  • 節點狀況 NotReady 大約 10 分鐘內為 true

  • 機器狀態會在成功建立後約 10 分鐘內處於 Unavailable 狀態。

  • VM 建立後約 30 分鐘內,機器狀態不會是 Available

  • 機器處於 Available 狀態約 10 分鐘後,系統仍找不到對應的節點物件 (nodeRef 為 nil)。

  • 節點條件 DiskPressure 大約 30 分鐘內為 true

啟用進階叢集時,節點健康狀態不良的條件

下列情況表示節點健康狀態不良 (enableAdvanceClustertrue)。

  • 節點狀況 NotReady 大約 10 分鐘內為 true

  • 節點條件 DiskPressure 大約 30 分鐘內為 true

節點修復策略

如果節點符合上述清單中的至少一項條件,Google Distributed Cloud 就會啟動節點修復程序。

修復作業會排空健康狀態不良的節點,並建立新的 VM。如果節點排空作業在一小時內失敗,修復程序會強制排空節點,並安全地分離所連結的 Kubernetes 受管理磁碟。

如果同一個 MachineDeployment 中有多個狀況不良的節點,系統一次只會修復其中一個節點。

節點集區每小時的修復次數上限為:

  • 節點集區中節點數量的 10%

為新叢集啟用節點修復和健康狀態檢查

管理員使用者叢集設定檔中,將 autoRepair.enabled 設為 true

autoRepair:
  enabled: true

繼續執行建立管理員使用者叢集的步驟。

為現有使用者叢集啟用節點修復和健康狀態檢查

使用者叢集設定檔中,將 autoRepair.enabled 設為 true

更新叢集:

gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config USER_CLUSTER_CONFIG

更改下列內容:

  • ADMIN_CLUSTER_KUBECONFIG:管理員叢集 kubeconfig 檔案的路徑

  • USER_CLUSTER_CONFIG:使用者叢集設定檔的路徑

為現有管理員叢集啟用節點修復和健康狀態檢查

管理員叢集設定檔中,將 autoRepair.enabled 設為 true

更新叢集:

gkectl update admin --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config ADMIN_CLUSTER_CONFIG

ADMIN_CLUSTER_CONFIG 替換為管理員叢集設定檔的路徑。

查看健康狀態檢查程式的記錄

列出管理員叢集中的所有健康檢查程式 Pod:

kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get pods --all-namespaces | grep cluster-health-controller

輸出結果會與下列內容相似:

kube-system       cluster-health-controller-6c7df455cf-zlfh7   2/2   Running
my-user-cluster   cluster-health-controller-5d5545bb75-rtz7c   2/2   Running

如要查看特定健康狀態檢查程式的記錄,請取得其中一個 Pod 中 cluster-health-controller 容器的記錄。舉例來說,如要取得前述輸出內容中顯示的 my-user-cluster 記錄,請執行下列指令:

kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG --namespace my-user-cluster logs \
    cluster-health-controller-5d5545bb75-rtz7c cluster-health-controller

查看健康狀態檢查程式的事件

列出管理員叢集中的所有叢集物件:

kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get clusters --all-namespaces

輸出結果會與下列內容相似:

default            gke-admin-ldxh7   2d15h
my-user-cluster    my-user-cluster   2d12h

如要查看特定叢集的事件,請執行 kubectl describe cluster 指令並加上 --show-events 標記。舉例來說,如要查看先前輸出內容中顯示的 my-user-cluster 事件,請執行下列指令:

kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG --namespace my-user-cluster \
    describe --show-events cluster my-user-cluster

輸出內容範例:

Events:
  Type     Reason             Age   From                                 Message
  ----     ------             ----  ----                                 -------
  Warning  ValidationFailure  17s   cluster-health-periodics-controller  validator for Pod returned with status: FAILURE, reason: 1 pod error(s).

停用使用者叢集的節點修復和健康狀態檢查

使用者叢集設定檔中,將 autoRepair.enabled 設為 false

更新叢集:

gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config USER_CLUSTER_CONFIG

停用管理員叢集的節點修復和健康狀態檢查

管理員叢集設定檔中,將 autoRepair.enabled 設為 false

更新叢集:

gkectl update admin --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config ADMIN_CLUSTER_CONFIG

在未啟用進階叢集的情況下,偵錯節點自動修復功能

如要調查節點自動修復功能的問題,請在管理員叢集中描述 Machine 和 Node 物件。範例如下:

列出機器物件:

kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG  get machines

輸出內容範例:

default     gke-admin-master-wcbrj
default     gke-admin-node-7458969ff8-5cg8d
default     gke-admin-node-7458969ff8-svqj7
default     xxxxxx-user-cluster-41-25j8d-567f9c848f-fwjqt

說明其中一個 Machine 物件:

kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG describe machine gke-admin-master-wcbrj

在輸出內容中,找出 cluster-health-controller 的事件。

同樣地,您也可以列出及說明節點物件。例如:

kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get nodes
...
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG describe node gke-admin-master-wcbrj

啟用進階叢集時,偵錯節點自動修復功能

如要調查節點自動修復問題,請分別說明管理員叢集和對應叢集中的機器和節點物件。範例如下:

列出機器物件:

kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG  get machines

輸出內容範例:

NAMESPACE                            NAME          NODEPOOL
ci-1f6861fe28cac8fb390bc798927c717b  10.251.172.47 ci-1f6861fe28cac8fb390bc798927c717b-np
ci-1f6861fe28cac8fb390bc798927c717b  10.251.173.64 ci-1f6861fe28cac8fb390bc798927c717b-cp
ci-1f6861fe28cac8fb390bc798927c717b  10.251.173.66 ci-1f6861fe28cac8fb390bc798927c717b-cp
ci-1f6861fe28cac8fb390bc798927c717b  10.251.174.19 ci-1f6861fe28cac8fb390bc798927c717b-np
ci-1f6861fe28cac8fb390bc798927c717b  10.251.175.15 ci-1f6861fe28cac8fb390bc798927c717b-np
ci-1f6861fe28cac8fb390bc798927c717b  10.251.175.30 ci-1f6861fe28cac8fb390bc798927c717b-cp
kube-system                          10.251.172.239   gke-admin-bnbp9-cp
kube-system                          10.251.173.39    gke-admin-bnbp9-cp
kube-system                          10.251.173.6     gke-admin-bnbp9-cp

說明與 Machine 物件對應的機器:

kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG describe machine -n ci-1f6861fe28cac8fb390bc798927c717b 10.251.172.47

在輸出內容中,找出 auto-repair-controller 的事件。

同樣地,您也可以列出及說明節點物件。例如:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get nodes
...
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG describe node ci-1f6861fe28cac8fb390bc798927c717b-np

未啟用進階叢集時的手動節點修復

管理員控制層節點

管理控制層節點有專用的修復指令,因為一般的手動修復不適用於此節點。

使用 gkectl repair admin-master 修復管理員控制層節點。

Controlplane V2 使用者叢集控制層節點

Controlplane V2 使用者叢集控制層節點的管理方式與其他節點不同。

與 kubeception 使用者叢集類似,Controlplane V2 使用者叢集的控制層 Machine 物件位於管理員叢集。節點自動修復功能則由管理員叢集節點自動修復功能負責。

如果節點問題不在管理員叢集節點自動修復邏輯的涵蓋範圍內,或是您未啟用管理員叢集節點自動修復功能,可以手動修復。這項操作會刪除並重新建立節點。

  1. 取得與節點對應的 Machine 物件名稱:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME get machines
    

    更改下列內容:

    • ADMIN_CLUSTER_KUBECONFIG:管理員叢集 kubeconfig 檔案的路徑。
    • USER_CLUSTER_NAME:目標使用者叢集名稱。
  2. repair 註解新增至 Machine 物件:

    kubectl annotate --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME machine MACHINE_NAME onprem.cluster.gke.io/repair-machine=true
    

    MACHINE_NAME 替換為 Machine 物件的名稱。

  3. 刪除 Machine 物件:

    kubectl delete --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME machine MACHINE_NAME
    

如果是高可用性控制層,請逐一重新建立節點,否則可能會導致控制層意外停止運作。

其他節點

如果節點問題不在自動修復邏輯的涵蓋範圍內,或是您未啟用節點自動修復功能,可以手動修復。這項操作會刪除並重新建立節點。

取得與節點對應的 Machine 物件名稱:

kubectl --kubeconfig CLUSTER_KUBECONFIG get machines

CLUSTER_KUBECONFIG 替換為管理員或使用者叢集 kubeconfig 檔案的路徑。

repair 註解新增至 Machine 物件:

kubectl annotate --kubeconfig CLUSTER_KUBECONFIG machine MACHINE_NAME onprem.cluster.gke.io/repair-machine=true

MACHINE_NAME 替換為 Machine 物件的名稱。

刪除 Machine 物件:

kubectl delete --kubeconfig CLUSTER_KUBECONFIG machine MACHINE_NAME

啟用進階叢集時手動修復節點

管理員控制層節點

不支援手動修復管理員控制層節點

使用者叢集控制層節點 / 工作站節點

使用節點的 IP 比對物件,取得與節點對應的 Inventory Machine 物件名稱:

kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME get inventorymachines

請替換下列項目: ADMIN_CLUSTER_KUBECONFIG:管理員 kubeconfig 檔案的路徑。 USER_CLUSTER_NAME:目標使用者叢集名稱。

force-remove 註解新增至 Inventory Machine 物件:

kubectl annotate --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME inventorymachine MACHINE_NAME baremetal.cluster.gke.io/force-remove=true

MACHINE_NAME 替換為 Machine 物件的名稱。

刪除 Inventory Machine 物件:

kubectl delete --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME inventorymachine MACHINE_NAME

如果是高可用性控制層,請逐一重新建立節點,否則可能會導致控制層意外停止運作。