針對 AKS Arc 中的 Kubernetes 管理和工作負載叢集問題進行疑難解答

適用於:Azure Stack HCI 上的 AKS、Windows Server 上的 AKS 使用本文可協助您針對 AKS Arc 中的 Kubernetes 管理和工作負載叢集問題進行疑難解答和解決。

執行 Remove-ClusterNode 命令收回容錯移轉叢集中的節點,但該節點仍存在

執行 Remove-ClusterNode 命令時,系統會從容錯移轉叢集收回節點,但如果之後未執行 Remove-AksHciNode,則節點仍會存在於 CloudAgent 中。

由於節點已從叢集中移除,但不是從 CloudAgent 移除,如果您使用 VHD 來建立新的節點,則會出現「找不到檔案」錯誤。 發生此問題的原因是 VHD 位於共享記憶體中,且已移除的節點無法存取它。

若要解決此問題,請從叢集移除實體節點,然後遵循下列步驟:

  1. 執行 Remove-AksHciNode 以從 CloudAgent 取消註冊節點。
  2. 執行例行維護,例如重新製作電腦映像。
  3. 將節點新增回叢集。
  4. 執行 Add-AksHciNode 以透過 CloudAgent 註冊節點。

使用大型叢集時,Get-AksHciLogs 命令會失敗,但發生例外狀況

使用大型叢集時,Get-AksHciLogs 可能會擲回例外狀況 如無法列舉節點,或無法產生 c:\wssd\wssdlogs.zip 輸出檔案。

這是因為 PowerShell 命令會壓縮檔案 'Compress-Archive',輸出檔案大小限制為 2 GB。

憑證更新 pod 處於損毀迴圈狀態

升級或調整增加工作負載叢集後,憑證更新 pod 目前為損毀迴圈狀態,因為 pod 預期會有來自檔案位置 /etc/Kubernetes/pki 的憑證 tattoo YAML 檔案。

此問題可能是因為控制平面 VM 中顯示的設定檔,而非背景工作節點 VM。

若要解決此問題,請將憑證 tattoo YAML 檔案從控制平面節點手動複製到所有背景工作節點上。

  1. 將 YAML 檔案從工作負載叢集的控制平面 VM 複製到主機電腦的目前目錄上:
ssh clouduser@<comtrol-plane-vm-ip> -i (get-mocconfig).sshprivatekey
sudo cp /etc/kubernetes/pki/cert-tattoo-kubelet.yaml ~/
sudo chown clouduser cert-tattoo-kubelet.yaml
sudo chgrp clouduser cert-tattoo-kubelet.yaml
(Change file permissions here, so that `scp` will work)
scp -i (get-mocconfig).sshprivatekey clouduser@<comtrol-plane-vm-ip>:~/cert*.yaml .\
  1. 將 YAML 檔案從主機電腦複製到背景工作節點 VM。 複製檔案之前,您必須將 YAML 檔案中的電腦名稱稱變更為您要複製的節點名稱 (即工作負載叢集控制平面的節點名稱)。
scp -i (get-mocconfig).sshprivatekey .\cert-tattoo-kubelet.yaml clouduser@<workernode-vm-ip>:~/cert-tattoo-kubelet.yaml
  1. 如果 YAML 檔案中的擁有者和群組資訊尚未設定為根目錄,請將資訊設定為根目錄:
ssh clouduser@<workernode-vm-ip> -i (get-mocconfig).sshprivatekey
sudo cp ~/cert-tattoo-kubelet.yaml /etc/kubernetes/pki/cert-tattoo-kubelet.yaml (copies the certificate file to the correct location)
sudo chown root cert-tattoo-kubelet.yaml
sudo chgrp root cert-tattoo-kubelet.yaml
  1. 針對所有背景工作節點重複步驟 2 和 3。

PowerShell 部署在建立新的工作負載叢集前,不會檢查是否有可用的記憶體

Aks-Hci PowerShell 命令在建立 Kubernetes 節點前,不會驗證主機伺服器上可用的記憶體。 此問題可能會導致記憶體耗盡,且虛擬機器無法啟動。

此失敗目前未妥善處理,部署將會停止回應,且不會有明確的錯誤訊息。 如果您有停止回應的部署,請開啟事件檢視器,並檢查 Hyper-V 相關的錯誤訊息,是否指出沒有足夠記憶體可啟動 VM。

執行 Get-AksHciCluster 時,會發生「找不到發行版本」錯誤

執行 Get-AksHciCluster 以驗證 Windows Admin Center 中 AKS Arc 安裝的狀態時,輸出會顯示錯誤:「找不到版本 1.0.3.10818」。不過,在執行 Get-AksHciVersion 時,它會顯示已安裝相同的版本。 此錯誤表示組建已過期。

若要解決此問題,請執行 Uninstall-AksHci,然後執行新的 AKS Arc 組建。

在 Azure Stack HCI 叢集節點之間快速移動虛擬機器,會導致 VM 啟動失敗

當您使用叢集管理工具將 VM 從一個節點移 (節點 A) 至 Azure Stack HCI 叢集中的另一個節點 (節點 B) 時,VM 可能無法在新節點上啟動。 將 VM 移回原始節點之後,此 VM 也無法在該處啟動。

發生此問題的原因是,用於清除首次移轉的邏輯並非以同步方式執行。 因此,Azure Kubernetes Service 的「更新 VM 位置」邏輯,會在節點 A 上的原始 Hyper-V 尋找 VM 並將其刪除,而不是將其取消註冊。

若要解決此問題,請確定新節點上已成功啟動 VM,再將其移回原始節點。

嘗試增加背景工作節點的數量失敗

使用 PowerShell 建立具有靜態 IP 位址的叢集,然後嘗試增加工作負載叢集中的背景工作節點數目時,安裝會停滯在「控制平面計數為 2,仍在等候所需的狀態:3」之後,會出現另一則錯誤訊息:「錯誤:等候條件逾時」。

Get-AksHciCluster 執行時,則此命令會顯示已建立並佈建控制平面節點,而此節點為就緒狀態。 然而,當執行 kubectl get nodes 時,其會顯示已建立控制平面節點,但該節點尚未進行佈建,且未處於就緒狀態。

如果您收到此錯誤,請確認已使用 Hyper-V 管理員或 PowerShell 將 IP 位址指派給已建立的節點:

(Get-VM |Get-VMNetworkAdapter).IPAddresses |fl

然後,確認網路設定,以確保集區中有足夠的 IP 位址以建立更多 VM。

錯誤:您必須登入伺服器 (未經授權的)

Update-AksHciUpdate-AksHciCertificatesUpdate-AksHciClusterCertificates和管理叢集等所有互動的命令都可以傳回「錯誤:您必須登入伺服器 (未經授權) 」。

當 kubeconfig 檔案過期時,就會發生此錯誤。 若要檢查是否已過期,請執行下列腳本:

$kubeconfig= $(get-kvaconfig).kubeconfig
$certDataRegex = '(?ms).*client-certificate-data:\s*(?<CertData>[^\n\r]+)'
$certDataMatch = Select-String -Path $kubeconfig -Pattern $certDataRegex
$certData = $certDataMatch.Matches[0].Groups['CertData'].Value
$certObject = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
$certObject.Import([System.Convert]::FromBase64String($certData))
$expiryDate = $certObject.GetExpirationDateString()
$expiryDate

如果此腳本顯示早於目前日期的日期, 則 kubeconfig 檔案已過期。

若要減輕此問題,請將管理控制平面 VM 內的 admin.conf 檔案複製到 HCI 主機:

  • 透過 SSH 連線至管理控制平面 VM:

    • 取得管理控制平面 VM IP:

      get-clusternode | % {Get-vm -computerName $_ } | get-vmnetworkadapter | select Name, IPAddresses
      
    • SSH 連線到其中:

      ssh -o StrictHostKeyChecking=no -i (Get-MocConfig).sshPrivateKey clouduser@<mgmt-control-plane-ip>
      
  • 將檔案複製到 clouduser 位置:

    cp /etc/kubernetes/admin.conf /home/clouduser/admin.conf
    
  • 授與 clouduser 的存取權:

    sudo chown clouduser:clouduser admin.conf
    
  • [選擇性]建立 kubeconfig 檔案的備份:

    mv $(Get-KvaConfig).kubeconfig "$((Get-KvaConfig).kubeconfig).backup"
    
  • 複製檔案:

    scp -i (get-mocconfig).sshPrivateKey clouduser@10.64.92.14:~/admin.conf $(Get-KvaConfig).kubeconfig
    

Hyper-V 管理員會針對管理叢集 (AKS 主機) 顯示高 CPU 和/或記憶體需求

當您檢查 Hyper-V 管理員時,可以安全地忽略管理叢集的高 CPU 和記憶體需求。 此需求與佈建工作負載叢集時,計算資源使用量的尖峰相關。

增加管理叢集的記憶體或 CPU 大小不會顯著提升效能,因此可安全忽略。

使用 kubectl 刪除節點時,相關聯的 VM 可能不會刪除

如果您遵循下列步驟,就會看到此問題:

  1. 建立 Kubernetes 叢集。
  2. 將叢集擴充為兩個以上的節點。
  3. 執行下列命令來刪除節點:
kubectl delete node <node-name>
  1. 執行下列命令來傳回節點清單:
kubectl get nodes

已移除的節點不會列於輸出中。 5.以系統管理許可權開啟 PowerShell 視窗,然後執行下列命令:

get-vm

系統仍會列出已移除的節點。

此失敗會導致系統無法辨識遺失節點,因此新節點將無法啟動。

如果超過 60 天未使用管理或工作負載叢集,憑證就會到期

如果您未使用管理或工作負載叢集超過 60 天,憑證就會過期,而且您必須更新這些憑證,才能升級 AKS Arc。當 AKS 叢集未在 60 天內升級時,KMS 外掛程式令牌和憑證都會在 60 天內到期。 叢集仍然正常運作。 不過,由於超過 60 天,因此您必須呼叫 Microsoft 支援服務進行升級。 如果叢集在這段期間後重新啟動,它將會維持在非功能狀態。

若要解決此問題,請執行下列步驟:

  1. 手動輪替令牌以修復管理叢集憑證,然後重新啟動 KMS 外掛程式和容器
  2. 執行 Repair-MocLogin 以修復 mocctl 憑證。
  3. 手動輪替令牌來修復工作負載叢集憑證,然後重新啟動 KMS 外掛程式和容器

找不到工作負載叢集

如果兩個 Azure Stack HCI 上的 AKS 部署 IP 位址集區相同或重疊,則系統可能會找不到工作負載叢集。 如果您部署兩個 AKS 主機,並對兩者使用相同 AksHciNetworkSetting 的設定,則 PowerShell 和 Windows Admin Center 可能會找不到工作負載叢集,因為 API 伺服器將在這兩個叢集中指派相同的 IP 位址,而這會導致衝突。

您收到的錯誤訊息看起來會類似下面所示的範例。

A workload cluster with the name 'clustergroup-management' was not found.
At C:\Program Files\WindowsPowerShell\Modules\Kva\0.2.23\Common.psm1:3083 char:9
+         throw $("A workload cluster with the name '$Name' was not fou ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (A workload clus... was not found.:String) [], RuntimeException
    + FullyQualifiedErrorId : A workload cluster with the name 'clustergroup-management' was not found.

注意

您的叢集名稱將不同。

建立具備 200 個節點的 AKS 叢集時 New-AksHciCluster 逾時

大型叢集的部署可能會在兩小時後逾時。 不過,這是靜態逾時。

當作業在背景中執行時,您可以忽略這個逾時專案。 使用 kubectl get nodes 命令存取您的叢集並監視進度。

API 伺服器在數日後沒有回應

數日後嘗試啟動 Azure Stack HCI 部署上的 AKS 時,Kubectl 無法執行其命令的任意項目。 金鑰管理服務 (KMS) 外掛程式記錄顯示錯誤訊息 rpc error:code = Unauthenticated desc = Valid Token Required_. After running [Repair-AksHciCerts](./reference/ps/repair-akshcicerts.md) to try to fix the issue, a different error appeared: _failed to repair cluster certificates

如果 API 伺服器已關閉,則 Repair-AksHciClusterCerts Cmdlet 會失敗。 如果 Azure Stack HCI 上的 AKS 超過 60 天未進行升級,則當您嘗試重新啟動 KMS 外掛程式時,此外掛程式將無法啟動。 此失敗也會導致 API 伺服器失敗。

若要修正此問題,您需要手動輪替權杖,然後重新開啟 KMS 外掛程式和容器,以便讓 API 伺服器進行備份。 若要達成此目標,請執行下列步驟:

  1. 執行下列命令來輪替權杖:

    $ mocctl.exe security identity rotate --name "KMSPlugin-<cluster-name>-moc-kms-plugin" --encode=false --cloudFqdn (Get-AksHciConfig).Moc.cloudfqdn > cloudlogin.yaml
    
  2. 使用下列命令將權杖複製到 VM 中。 下列命令中的 ip 設定是指 AKS 主機控制平面的 IP 位址。

    $ scp -i (Get-AksHciConfig).Moc.sshPrivateKey .\cloudlogin.yaml clouduser@<ip>:~/cloudlogin.yaml $ ssh -i (Get-AksHciConfig).Moc.sshPrivateKey clouduser@<ip> sudo mv cloudlogin.yaml /opt/wssd/k8s/cloudlogin.yaml
    
  3. 重新啟動 KMS 外掛程式和容器。

    若要取得容器識別碼,請執行下列命令:

    $ ssh -i (Get-AksHciConfig).Moc.sshPrivateKey clouduser@<ip> "sudo docker container ls | grep 'kms'"
    

    輸出應顯示於下列欄位:

    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    

    輸出應看似此範例:

    4169c10c9712 f111078dbbe1 "/kms-plugin" 22 minutes ago Up 22 minutes k8s_kms-plugin_kms-plugin-moc-lll6bm1plaa_kube-system_d4544572743e024431874e6ba7a9203b_1
    
  4. 最後,執行下列命令來將容器重新啟動:

    $ ssh -i (Get-AksHciConfig).Moc.sshPrivateKey clouduser@<ip> "sudo docker container kill <Container ID>"
    

建立工作負載叢集失敗,並出現錯誤「找不到符合參數名稱 nodePoolName 的參數」

在透過 Windows Admin Center 擴充功能版本 1.82.0 進行 Azure Stack HCI 上的 AKS 安裝程序時,管理叢集是使用 PowerShell 進行設定,並嘗試使用 Windows Admin Center 來部署工作負載叢集。 其中一部電腦會安裝 PowerShell 模組版本 1.0.2,而在其他電腦會安裝 PowerShell 模組 1.1.3。 嘗試部署工作負載叢集失敗,並出現「找不到符合參數名稱 』nodePoolName' 的參數」錯誤。此錯誤可能是因為版本不符而發生。 從 PowerShell 版本 1.1.0 開始,-nodePoolName <String> 參數已新增至 New-AksHciCluster Cmdlet,且根據設計,當使用 Windows Admin Center 擴充功能版本 1.82.0 時,此參數現為必要。

若要解決這個問題,請執行下列其中一項:

  • 使用 PowerShell 以手動將工作負載叢集將版本更新至版本 1.1.0 或更新版本。
  • 使用 Windows Admin Center 來將叢集更新至版本 1.1.0 會最新版 PowerShell。

如果使用 Windows Admin Center 部署管理叢集,且已安裝最新的 PowerShell 模組,則不會發生此問題。

執行 'kubectl get pods' 時,Pod 停滯在「終止」狀態

當您在 Azure Stack HCI 上部署 AKS,然後執行 kubectl get pods時,相同節點上的 Pod 會卡在 終止 狀態。 計算機會拒絕 SSH 連線,因為節點可能遇到高記憶體需求。 發生此問題的原因是 Windows 節點已過度佈建,且並未針對核心元件進行保留。

若要避免此情況,請將 CPU 和記憶體的資源限制和資源要求新增至 pod 規格,以確保節點不會過度佈建。 Windows 節點不支援根據資源限制進行收回,因此您應該估計容器將使用的數量,然後確保節點有足夠的 CPU 和記憶體量。 您可以在系統需求中找到詳細資訊。

叢集自動調整失敗

當您在 AKS 主機管理叢集上使用下列 Azure 原則時,叢集自動調整可能會失敗:「Kubernetes 叢集不應該使用預設命名空間」。這是因為在 AKS 主機管理叢集上實作原則時,會封鎖在預設命名空間中建立自動調整程式配置檔。 若要修正此問題,請選擇下列其中一個選項:

建立新的工作負載叢集時,會發生「錯誤:rpc 錯誤:代碼 = DeadlineExceeded desc = 內容期限已超過」錯誤

此為 Azure Stack HCI 上的 AKS 七月更新 (版本 1.0.2.10723) 的已知問題。 發生此錯誤是因為 CloudAgent 服務在系統中將虛擬機器分佈至多個叢集共用磁碟區期間逾時。

若要解決此問題,您應該升級至最新 Azure Stack HCI 上的 AKS 版本

執行 Get-AksHciCluster 時,看不到 Windows 或 Linux 節點計數

如果您在具有零 Linux 或 Windows 節點的 Azure Stack HCI 上佈建 AKS 叢集,當您執行 Get-AksHciCluster 時,輸出會是空字元串或 Null 值。

Null 是零個節點的預期傳回。

如果叢集關機超過四天,將無法與叢集連線

當您將管理或工作負載叢集關機超過四天,則憑證將過期而無法與叢集連線。 基於安全性原因,憑證將每 3-4 天進行輪替,因此憑證過期。

若要將叢集重新啟動,您需要手動修復憑證,才能執行任何的叢集作業。 若要修復憑證,請執行下列 Repair-AksHciClusterCerts 命令:

Repair-AksHciClusterCerts -Name <cluster-name> -fixKubeletCredentials

調整工作負載叢集時,Linux 和 Windows VM 未設定為高可用性 VM

向外擴充工作負載叢集時,對應的 Linux 和 Windows VM 已新增為背景工作節點,但未設定為高可用性 VM。 執行 Get-ClusterGroup 命令時,新建立的 Linux VM 不會設定為叢集群組。

這是已知的問題。 重新開機後,有時會失去將 VM 設定為高可用性的功能。 目前的解決方法是在每個 Azure Stack HCI 節點上重新啟動 wssdagent。 這隻適用於在執行向外延展作業時建立節點集區所產生的新 VM,或是在節點上重新啟動 wssdagent 之後建立新的 Kubernetes 叢集時產生。 然而,您必須手動將現有的 VM 新增至容錯移轉叢集。

當您相應減少叢集時,高可用性叢集資源在 VM 移除時處於失敗狀態。 解決此問題的因應措施是手動移除失敗的資源。

由於 AKS 主機已關閉數日,因此嘗試建立新的工作負載從集失敗

部署在 Azure VM 中的 AKS 叢集先前正常運作,但在 AKS 主機關閉數天之後, Kubectl 命令無法運作。 執行 Kubectl get nodesKubectl get services 命令均顯示下列錯誤訊息:Error from server (InternalError): an error on the server ("") has prevented the request from succeeding

發生此問題是因為 AKS 主機關閉超過四天,因此導致憑證到期。 憑證常態性以四天的週期輪替。 執行 Repair-AksHciClusterCerts 以修正憑證到期問題。

在具有靜態 IP 位址的工作負載叢集中,節點中的所有 Pod 都會卡在 _ContainerCreating_ 狀態

在具有靜態 IP 位址和 Windows 節點的工作負載叢集中,節點中的所有 Pod (包括 daemonset Pod) 都會卡在 ContainerCreating 狀態中。 嘗試使用 SSH 連線到該節點時,連線失敗並出現 Connection timed out 錯誤。

若要解決此問題,請使用 Hyper-V 管理員或故障轉移叢集管理員來關閉該節點的 VM。 在 5 到 10 分鐘之後,應該已重新建立節點,並執行所有 Pod。

ContainerD 無法提取暫停映像,因為 『kubelet』 錯誤地收集映像

kubelet 處於磁碟壓力時,它會收集未使用的容器映射,其中可能包含暫停映像,而且發生這種情況時,ContainerD 無法提取映像。

若要解決此問題,請執行下列步驟:

  1. 使用 SSH 連線到受影響的節點,然後執行下列命令:
sudo su
  1. 若要提取映像,請執行下列命令:
crictl pull ecpacr.azurecr.io/kube-proxy:<Kubernetes version>