在 Google Distributed Cloud 中,系統預設會啟用定期健康狀態檢查和節點自動修復功能。
節點自動修復功能會持續偵測及修復叢集中健康狀態不良的節點。
系統每 15 分鐘會執行一次定期健康狀態檢查。這些檢查與 gkectl diagnose cluster
執行的檢查相同。結果會以記錄和事件的形式,顯示在管理叢集的叢集物件中。
請確保管理員和使用者叢集各有額外的 IP 位址,可用於自動修復節點。
如果啟用進階叢集,系統不會在自動修復程序中執行定期健康狀態檢查。
未啟用進階叢集時,節點健康狀態不良的條件
下列情況表示節點健康狀態不良:enableAdvanceCluster
false
。
節點狀況
NotReady
大約 10 分鐘內為true
。機器狀態會在成功建立後約 10 分鐘內處於
Unavailable
狀態。VM 建立後約 30 分鐘內,機器狀態不會是
Available
。機器處於
Available
狀態約 10 分鐘後,系統仍找不到對應的節點物件 (nodeRef 為nil
)。節點條件
DiskPressure
大約 30 分鐘內為true
。
啟用進階叢集時,節點健康狀態不良的條件
下列情況表示節點健康狀態不良 (enableAdvanceCluster
為 true
)。
節點狀況
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 物件位於管理員叢集。節點自動修復功能則由管理員叢集節點自動修復功能負責。
如果節點問題不在管理員叢集節點自動修復邏輯的涵蓋範圍內,或是您未啟用管理員叢集節點自動修復功能,可以手動修復。這項操作會刪除並重新建立節點。
取得與節點對應的 Machine 物件名稱:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME get machines
更改下列內容:
ADMIN_CLUSTER_KUBECONFIG
:管理員叢集 kubeconfig 檔案的路徑。USER_CLUSTER_NAME
:目標使用者叢集名稱。
將
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 物件的名稱。刪除 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
如果是高可用性控制層,請逐一重新建立節點,否則可能會導致控制層意外停止運作。