共用方式為


針對因電源失敗而導致 Nexus Kubernetes 叢集中的工作負載停滯(無法重新排程)進行疑難解答

什麼是停滯的工作負載?

停滯的工作負載是 Pod,由於節點尚未就緒,無法重新排程至 Kubernetes 叢集中的另一個節點。 此問題可能會因為許多原因而發生,包括節點電源故障。

根據設計,Kubernetes 不會移動具狀態的工作負載,如果它們正在執行的節點變得尚未就緒(例如,因為電源故障)。 如需詳細資訊,請參閱 Kubernetes 檔

本指南詳細說明 Nexus Kubernetes 叢集上的工作負載因裸機計算機電源故障而卡住的情況疑難解答步驟。 它也會說明如何重新啟動停滯的 Pod,以便在不同的節點上重新排程。

必要條件

  • 在部署 Nexus Kubernetes 叢集的訂用帳戶中檢視 Azure 資源的許可權
  • 在 Nexus Kubernetes 叢集中使用 kubectl 命令進行變更的必要許可權(例如,刪除節點)

診斷停滯的工作負載

如果您發現應用程式未如預期般回應,您的工作負載可能會卡在尚未就緒的節點上。 若要診斷 Nexus Kubernetes 叢集未就緒節點上停滯的工作負載,請尋找下列徵兆:

  • 若要檢查 Nexus Kubernetes 叢集節點是否尚未就緒,請在 Nexus Kubernetes 叢集中執行下列 kubectl 命令:

    kubectl get nodes | awk '$2 != "Ready" {print $1, $2}' | column -t
    

    kubectl 取得節點輸出

    如果命令沒有傳回任何結果,則所有節點都已就緒。 有時候,節點在電源故障后需要幾分鐘的時間才會變成未就緒,因此您可能需要在幾分鐘后再次執行命令。 如果節點在合理的時間 (5-10 分鐘) 之後仍顯示為就緒,且您的應用程式仍未回應,則問題可能會有所不同,請連絡支持人員以取得進一步的協助。

  • 若要列出停滯在未就緒節點上的 Pod,請在 Nexus Kubernetes 叢集中執行下列 kubectl 命令:

    kubectl get nodes -o json | jq -r '.items[]
    | select(.status.conditions[] | select(.type=="Ready") | .status != "True")
    | .metadata.name' | xargs -I {} sh -c 'kubectl get pods --all-namespaces --field-selector spec.nodeName={} --no-headers | awk -v node={} "{print \$1, \$2, \$4, node}"' | sort -k1,1 | column -t -N "NAMESPACE,NAME,STATUS,NODE"
    

    此命令會傳回停滯在未就緒節點上的 Pod(具狀態和精靈集)。 Pod 狀態可能會顯示 PendingTerminatingRunning

    未就緒節點上的工作負載停滯

診斷電源故障

一旦確認工作負載卡在尚未就緒的節點上,下一個步驟將協助您診斷 Nexus Kubernetes 叢集節點是否因為一或多部裸機機器的電源故障而無法就緒。

若要診斷裸機電腦上的電源故障,請尋找下列徵兆:

  • 若要列出未就緒 Nexus Kubernetes 叢集節點正在執行的裸機機器,請在 Nexus Kubernetes 叢集中執行下列 kubectl 命令:

    kubectl get nodes -o json | jq -r '.items[]
    | select(.status.conditions[] | select(.type=="Ready") | .status != "True")
    | [.metadata.name, .metadata.labels["topology.kubernetes.io/baremetalmachine"]]
    | @tsv' | column -t -s $'\t' -N "Node Name,BMM Name"
    

    此命令會傳回節點清單,以及執行節點的裸機計算機名稱。

    節點就緒節點所在的 bmm 名稱

  • 若要列出叢集中已關閉電源的裸機機器,請在叢集受控資源群組層級執行下列命令:

    az networkcloud baremetalmachine list \
    --subscription <subscription-id> \
    --resource-group <managed-resource-group> \
    --query "[? powerState == 'Off' && detailedStatus != 'Available'].{BMMName: name, ResourceGroup: resourceGroup, PowerState: powerState, DetailedStatus: detailedStatus}" \
    -o table
    

    取代為訂用帳戶識別碼,並以<managed-resource-group>裸機資源所在的叢集受控資源群組取代 <subscription-id>

    例如:

    az networkcloud baremetalmachine list \
    --subscription 00000000-0000-0000-0000-000000000000 \
    --resource-group poc02-19cf0b39e1e5-HostedResources-540F8D4E \
    --query "[? powerState == 'Off' && detailedStatus != 'Available'].{BMMName: name, ResourceGroup: resourceGroup, PowerState: powerState, DetailedStatus: detailedStatus}" \
    -o table
    

    關閉裸機電腦電源 注意: 此螢幕快照不會顯示訂用帳戶標識碼,因為它已在 Azure CLI 工作階段中使用 az account set --subscription <subscription-id> 命令進行設定。

    如果命令沒有傳回任何結果,請在幾分鐘后重新執行命令。 如果命令在合理的時間 (5-10 分鐘) 後仍然傳回任何結果,且您的工作負載仍然停滯,則問題可能不同,請連絡支持人員以取得進一步的協助。

使用未就緒節點執行所在的裸機計算機清單,交叉檢查已關閉的裸機機器名稱。 如果未就緒節點執行所在的裸機機器已關閉電源,則問題是因為電源故障。 現在,您可以繼續進行下一節來解決問題。

警告

Nexus Kubernetes 叢集虛擬機 (VM) 放置

本指南需要從 Nexus Kubernetes 叢集刪除節點。 此動作可能會導致 Nexus Kubernetes 叢集 VM 機架放置受到影響。 如需詳細資訊,請參閱 Nexus 平臺如何排程 Nexus Kubernetes 叢集 VM

主機路徑記憶體

如果 Pod 設定為在節點上使用主機路徑記憶體,則刪除節點也會刪除資料。

解決方案

若要將停滯的工作負載移至 Nexus Kubernetes 叢集中的其他節點,您需要刪除因電源故障而尚未就緒的 Nexus Kubernetes 叢集節點。 停滯在未就緒節點上的工作負載將會重新排程到 Nexus Kubernetes 叢集中的其他節點。 此外,系統會建立新的節點,以在叢集中有足夠的容量時自動取代已刪除的節點。

  • 從先前的步驟中,記下未就緒節點正在執行之已關閉裸機機器的名稱。

  • 若要刪除尚未就緒的節點,請在每個已關閉的裸機機器的 Nexus Kubernetes 叢集中執行下列kubectl命令:

    kubectl delete node -l topology.kubernetes.io/baremetalmachine=<powered-off-baremetal-machine-name>
    

    將取代 <powered-off-baremetal-machine-name> 為先前記下電源關閉裸機計算機的名稱。

    例如:

    kubectl delete node -l topology.kubernetes.io/baremetalmachine=b37100gipc1co01
    
  • 刪除節點之後,停滯在未就緒節點上的工作負載應該重新排程到 Nexus Kubernetes 叢集中的其他節點。 針對先前所述的所有剩餘電源關閉裸機電腦執行先前 kubectl 的命令。