編輯

共用方式為


修正 AKS Arc 中的安全性和身分識別已知問題和錯誤

使用本主題可協助您針對 AKS Arc 中的安全性和身分識別相關問題進行疑難解答和解決。

Get-AksHciCredential 失敗,並出現「找不到指定的路徑」錯誤

Get-AksHciCredential當與安裝 AksHci 所使用的系統管理員用戶執行時,PowerShell Cmdlet 會失敗。 命令會 建立 .kube 目錄,並將組態檔放在其中。 不過,命令失敗,並出現下列錯誤:

Error: open C:\Users\<user>\.kube\config: The system cannot find the path specified.

若要重現

  1. 安裝 AksHci。
  2. 建立目標叢集。
  3. 以不同的系統管理員使用者身分登入計算機(多重系統管理員功能)。
  4. 執行 Get-AksHciCredential -Name $clusterName

預期的行為

Get-AksHciCredential 應該能夠在使用者的主目錄中建立 .kube 目錄,並將配置檔放在該目錄中。

若要解決此問題,請在使用者的主目錄中建立 .kube 目錄。 使用下列命令來建立目錄:

mkdir "$HOME/.kube"

在此步驟之後, Get-AksHciCredential 不應該失敗。

錯誤「憑證已過期 - 無法連線到伺服器:x509」

當控制平面憑證無法更新時,無法存取目標叢集。 嘗試連線到叢集時, kubectl 命令會顯示下列錯誤:

certificate expired - Unable to connect to the server: x509: certificate has expired or is not yet valid: current time 2022-07-26T12:24:15-04:00 is after 2022-07-15T15:01:07Z

注意

此問題已在 2022 年 9 月版本和更新版本中修正。

若要重現

  1. 安裝 AksHci。
  2. 安裝目標叢集。 3. 關閉叢集 (VM) 超過 4 天。
  3. 再次開啟叢集。

徵兆和緩和措施

無法連線到目標叢集。 針對目標叢集執行的任何 kubectl 命令,會傳回類似下列錯誤訊息:

certificate expired - Unable to connect to the server: x509: certificate has expired or is not yet valid: current time 2022-07-26T12:24:15-04:00 is after 2022-07-15T15:01:07Z

若要修正此問題:

  1. 執行下列命令以手動更新產生的憑證:

    Update-AksHciClusterCertificates  -Name my-workload -cluster -fixKubeletCredentials
    
  2. 產生新的認證:

    Get-AksHciCredential -name <clustername>
    

幾分鐘后,請再試 kubectl 一次命令,以查看叢集現在是否可供使用。

注意

AksHci 1.0.14.x 版和更早版本中有已知的 Bug。 如果控制平面 VM 的名稱模式不是 -control-plane-,命令 Update-AksHciClusterCertificates 可能無法運作。 您必須登入控制平面 VM 來更新憑證:

  1. 尋找目標叢集控制平面 VM 的IP位址。
  2. 執行下列命令:ssh -i (get-mocconfig).sshPrivateKey clouduser@<ip>
  3. 列出憑證紋身檔案: sudo ls /etc/kubernetes/pki/cert-tattoo-*
  4. 使用上一個命令所列的每個檔案產生憑證: sudo /usr/bin/cert-tattoo-provision CreateCertsWithAltNames <absolute-path-of-cert-tattoo-file>

驗證交握失敗:x509:由未知授權單位簽署的憑證

部署新的 AKS 叢集或將節點集區新增至現有叢集時,您可能會看到此錯誤。

  1. 檢查執行 命令的使用者是否與在 Azure Stack 或 Windows Server 上安裝 AKS 的使用者相同。 如需授與多個使用者存取權的詳細資訊,請參閱 設定多個系統管理員
  2. 如果使用者相同且錯誤持續發生,請遵循下列步驟來解決問題:
  • 拿掉 以刪除 $env:UserProfile.wssd\kvactl\cloudconfig舊的管理設備憑證。
  • 執行 Repair-AksHciCerts
  • 執行 Get-AksHciCluster 以檢查是否已修正。

無法存取目標叢集 Pod 記錄 - 遠端錯誤:tls:內部錯誤

無法存取目標叢集記錄。 當您試著存取目標叢集中的 Pod 記錄時,會顯示下列 TLS 錯誤:

Error from server: Get "[https://10.0.0.0:10250/containerLogs/kube-system/kube-apiserver-moc-l9iv8xjn3av/kube-apiserver":](https://10.0.0.0:10250/containerLogs/kube-system/kube-apiserver-moc-l9iv8xjn3av/kube-apiserver%22:) remote error: tls: internal error

注意

這是 AksHci 1.0.14.x 版和更早版本中的已知問題。 它已修正為 1.0.14.x 版本的一部分(9 月版本和更新版本)。 更新至此版本的目標叢集不應該遇到此問題。

若要重現

  1. 安裝 AksHci。
  2. 安裝目標叢集。
  3. 請勿升級叢集 60 天。
  4. 重新啟動叢集。

徵兆和緩和措施

不應存取目標 Pod 記錄。 針對目標叢集執行的任何 kubectl 記錄命令都應該傳回錯誤訊息,如下所示:

Error from server: Get "[https://10.0.0.0:10250/containerLogs/kube-system/kube-apiserver-moc-l9iv8xjn3av/kube-apiserver":](https://10.0.0.0:10250/containerLogs/kube-system/kube-apiserver-moc-l9iv8xjn3av/kube-apiserver%22:) remote error: tls: internal error

若要修正此問題:

  1. 執行下列命令以手動更新產生的憑證:

    Update-AksHciClusterCertificates  -Name my-workload -fixKubeletCredentials
    
  2. 產生新的認證:

    Get-AksHciCredential -name <clustername>
    

叢集控制平面 - 憑證已過期 - 無法連線到伺服器:x509

當控制平面憑證無法更新時,無法存取目標叢集。 嘗試連線到叢集時, kubectl 命令會產生下列錯誤:

certificate expired - Unable to connect to the server: x509: certificate has expired or is not yet valid: current time 2022-07-26T12:24:15-04:00 is after 2022-07-15T15:01:07Z

注意

此問題已在 2022 年 9 月版本和更新版本中修正。

若要重現

  1. 安裝 AksHci。
  2. 安裝目標叢集。
  3. 關閉叢集(vms)超過 4 天。
  4. 再次開啟叢集。

徵兆和緩和措施

目標叢集應該無法連線。 針對目標叢集執行的任何 kubectl 命令都應該傳回,並出現類似下列的錯誤訊息:

certificate expired - Unable to connect to the server: x509: certificate has expired or is not yet valid: current time 2022-07-26T12:24:15-04:00 is after 2022-07-15T15:01:07Z

若要修正此問題:

  1. 執行下列命令以手動更新產生的憑證:

    Update-AksHciClusterCertificates  -Name my-workload -cluster -fixKubeletCredentials
    
  2. 產生新的認證:

    Get-AksHciCredential -name <clustername>
    

幾分鐘后,請再試 kubectl 一次命令,以查看叢集現在是否可供使用。

KMS Pod 失敗,KMS Pod 記錄包含錯誤

此問題的一些可能徵兆如下:

  • kubectl get secrets 失敗並出現內部錯誤。
  • kubectl logs <kmspod-name> -n kube-system 包含錯誤。
  • 當您嘗試建立 Pod 時,掛接秘密會在磁碟區中失敗。
  • apiserver 無法啟動。

執行下列命令來檢視 KMS Pod 記錄中是否有錯誤:

kubectl logs <kmspod-name> -n kube-system

如果記錄傳回管理叢集 KMS Pod 中無效令牌的錯誤,請執行下列命令:

Update-AksHciCertificates

如果目標叢集 KMS Pod 中有無效令牌的錯誤,請執行下列命令:

UpdateAksHciClusterCertificates -name <cluster-name> -fixcloudcredential

錯誤 'System.Collections.Hashtable.generic_non_zero 1 [錯誤: 憑證已過期: 已過期]'

如果mocctl憑證未使用超過60天,則會過期。 AKS Arc 會 mocctl 使用命令行工具來與 MocStack 通訊,以執行 Moc 相關作業。 命令用來與 cloudagent 通訊的憑證 mocclt 會在 60 天內到期。 mocctl當憑證接近到期日時,命令會自動更新憑證(在 ~42 天后)。 如果命令未經常使用,憑證就會過期。

若要重現行為,請安裝 AKS Arc,且不會執行任何涉及 mocctl 命令的作業 60 天。

若要修正此問題,請再次登入憑證到期。 執行下列 PowerShell 命令來登入:

Repair-MocLogin

如果在 60 天后過期,請刪除 KVA 憑證

如果未執行升級,KVA 憑證會在 60 天后到期。

Update-AksHci 和任何涉及的 kvactl 命令都會擲回下列錯誤。

Error: failed to get new provider: failed to create azurestackhci session: Certificate has expired: Expired

若要解決此錯誤,請刪除的 \kvactl\cloudconfig 過期憑證檔案,然後在看到憑證到期問題的節點上再試 Update-AksHci 一次。 您可以使用下列命令:

$env:UserProfile.wssd\kvactl\cloudconfig

如果 KVA 憑證在 60 天后過期,您可以在 KVA 憑證中找到有關此問題 的討論

已加入網域的 Azure 本機節點需要特殊 Active Directory 許可權

在 Azure 本機上部署和設定 Azure Kubernetes Service 的用戶必須具有 在建立伺服器和服務物件之 Active Directory 容器中建立 AD 物件的完全控制 許可權。

提高用戶的許可權。

Uninstall-AksHciAdAuth 失敗,錯誤為 '[Error from server (NotFound): secrets “keytab-akshci-scale-reliability” 找不到]'

如果 Uninstall-AksHciAdAuth 顯示此錯誤,您現在應該忽略它,因為此問題將會修正。

This issue will be fixed.

kubectl 記錄會傳回「錯誤:您必須登入伺服器(伺服器已要求用戶端提供認證)」

AKS Arc 發生問題,叢集可以停止傳回記錄。 發生這種情況時,執行 kubectl logs <pod_name> 會傳回「錯誤:您必須登入伺服器(伺服器已要求用戶端提供認證)」。 AKS Arc 每隔 4 天輪替核心 Kubernetes 憑證,但有時候 Kubernetes API 伺服器不會立即重載其用戶端憑證,以在憑證更新時與 kubelet 通訊。

若要減輕此問題,有數個選項:

  • 重新執行 kubectl logs。 例如,執行下列 PowerShell 命令:

    while (1) {kubectl logs <POD_NAME>; sleep 1}
    
  • kube-apiserver在叢集的每個控制平面上重新啟動容器。 重新啟動 API 伺服器不會影響執行中的工作負載。 若要重新啟動 API 伺服器,請遵循下列步驟:

    1. 取得叢集中每個控制平面的IP位址:

      kubectl get nodes -o wide
      
    2. 執行以下命令:

      ssh -i (get-akshciconfig).Moc.sshPrivateKey clouduser@<CONTROL_PLANE_IP> 'sudo crictl stop $(sudo crictl ps --name kube-apiserver -o json | jq -r .containers[0].id)'
      
  • 您可以選擇性地要求 kube-apiserver 不要驗證 kubelet 的伺服器證書,但不建議用於生產工作負載:

    kubectl logs <POD_NAME> --insecure-skip-tls-verify-backend=true