針對 CSE 錯誤所造成的節點未就緒失敗進行疑難解答

本文可協助您針對 Microsoft Azure Kubernetes Service (AKS) 叢集未處於Succeeded狀態,且 AKS 節點因為自定義腳本擴充功能 (CSE) 錯誤而無法在節點集區內就緒的案例進行疑難解答。

必要條件

徵狀

由於 CSE 錯誤,AKS 叢集節點未在節點集區內就緒,且 AKS 叢集未處於 Succeeded 狀態。

原因

當您布建 kubelet 和其他元件時,節點擴充功能部署會失敗並傳回多個錯誤碼。 這是最常見的錯誤原因。 若要在布建 kubelet 時確認節點擴充功能部署失敗,請遵循下列步驟:

  1. 若要進一步瞭解叢集上目前的失敗,請執行 az aks showaz resource update 命令來設定偵錯:

    clusterResourceId=$(az aks show \
        --resource-group <resource-group-name> --name <cluster-name> --output tsv --query id)
    az resource update --debug --verbose --ids $clusterResourceId
    
  2. 針對 GitHub 上 CSE 協助程式可執行檔中的錯誤清單,檢查您從az resource update命令收到的偵錯輸出和錯誤訊息。

如果有任何錯誤涉及 kubelet 的 CSE 部署,則您已確認此處所述的案例是節點未就緒失敗的原因。

一般而言,結束代碼會識別造成失敗的特定問題。 例如,您會看到「無法與 API 伺服器通訊」或「無法連線到因特網」等訊息。或者,結束代碼可能會警示您 API 網路逾時,或是需要取代的節點錯誤。

解決方案 1:確定您的自訂 DNS 伺服器已正確設定

設定自定義功能變數名稱系統 (DNS) 伺服器,使其可以正確地進行名稱解析。 設定伺服器以符合下列需求:

  • 如果您使用自定義 DNS 伺服器,請確定伺服器狀況良好且可透過網路連線。

  • 請確定自定義 DNS 伺服器具有 Azure DNS IP 位址的必要條件式轉寄站 (或該位址) 的轉寄站。

  • 如果您的私人 AKS DNS 區域裝載於 Azure 上,請確定其已連結至您的自定義 DNS 虛擬網路。

  • 請勿將 Azure DNS IP 位址與自定義 DNS 伺服器的 IP 位址搭配使用。 不建議這麼做。

  • 避免在 DNS 設定中使用 IP 位址,而不是 DNS 伺服器。 您可以使用 Azure CLI 命令,在虛擬機 (VM) 擴展集或可用性設定組上檢查這種情況。

    • 針對 VM 擴展集節點,請使用 az vmss run-command invoke 命令:

      az vmss run-command invoke \
          --resource-group <resource-group-name> \
          --name <vm-scale-set-name> \
          --command-id RunShellScript \
          --instance-id 0 \
          --output tsv \
          --query "value[0].message" \
          --scripts "telnet <dns-ip-address> 53"
      az vmss run-command invoke \
          --resource-group <resource-group-name> \
          --name <vm-scale-set-name> \
          --instance-id 0 \
          --command-id RunShellScript \
          --output tsv \
          --query "value[0].message" \
          --scripts "nslookup <api-fqdn> <dns-ip-address>"
      
    • 針對 VM 可用性設定組節點,請使用 az vm run-command invoke 命令:

      az vm run-command invoke \
          --resource-group <resource-group-name> \
          --name <vm-availability-set-name> \
          --command-id RunShellScript \
          --output tsv \
          --query "value[0].message" \
          --scripts "telnet <dns-ip-address> 53"
      az vm run-command invoke \
          --resource-group <resource-group-name> \
          --name <vm-availability-set-name> \
          --command-id RunShellScript \
          --output tsv \
          --query "value[0].message" \
          --scripts "nslookup <api-fqdn> <dns-ip-address>"
      

如需詳細資訊,請參閱 Azure 虛擬網路中資源的名稱解析具有自定義 DNS 的中樞和輪輻

解決方案 2:修正 API 網路逾時

請確定可以連線到 API 伺服器,且不受延遲限制。 如果要執行這項操作,請依照下列步驟執行:

  • 檢查 AKS 子網,以查看指派的網路安全組是否 (NSG) 封鎖輸出流量埠 443 至 API 伺服器。

  • 檢查節點本身,以查看節點是否有另一個NSG 封鎖流量。

  • 檢查 AKS 子網是否有任何指派的路由表。 如果路由表有網路虛擬設備 (NVA) 或防火牆,請確定埠 443 可供輸出流量使用。 如需詳細資訊,請參閱 控制 AKS 中叢集節點的輸出流量

  • 如果 DNS 成功解析名稱且可連線到 API,但節點 CSE 因為 API 逾時而失敗,請採取適當的動作,如下表所示。

    設定類型 動作
    VM 可用性設定組 使用 kubectl delete node 命令從 Azure 入口網站 和 AKS API 中刪除節點,然後再次相應增加叢集。
    VM 擴展集 重新安裝節點的映像,或刪除節點,然後再次相應增加叢集。
  • 如果 AKS API 伺服器正在節流要求,請升級至較高的服務層級。 如需詳細資訊,請參閱 AKS 運行時間 SLA

其他相關資訊