共用方式為


解決 「az aks command invoke」 失敗

本文說明如何在 Microsoft Azure CLI 中解析 az aks 命令 叫用失敗,以便您成功連線到任何 Azure Kubernetes Service (AKS) 叢集,尤其是私人 AKS 叢集

其他連接方法需要使用額外的元件,如下表所示。

連接方法 額外的元件
虛擬網路 虛擬私人網路 (VPN)
對等互連網路 Azure ExpressRoute
私人端點 Jumpbox

az aks command invoke Azure CLI 命令是連線到不需要額外設定元件的叢集的替代方式。

當您執行az aks command invoke命令時,Azure CLI 會自動在命名空間中aks-command建立 command-<ID> Pod,以存取 AKS 叢集並擷取所需的資訊。

必要條件

徵兆

下表列出常見的 az aks command invoke 錯誤訊息。 每個錯誤訊息都有區段的連結,描述錯誤發生的原因,以及如何修正錯誤。

錯誤訊息 連結
作業傳回無效的狀態 「找不到」 原因 1:無法建立 Pod,因為節點或資源條件約束
由於 kubernetes 失敗,無法在受控叢集中執行命令。 詳細數據:許可 Webhook “validation.gatekeeper.sh” 拒絕要求: <policy-specific-message> 原因 2:Azure 原則 不允許建立 Pod
伺服器錯誤(禁止):命名空間被禁止:使用者「<標識符>」無法在叢集範圍中的 API 群組 「中列出資源」<資源>」 原因 3:未授與必要角色
無法連線到 MSI。 請確定 MSI 已正確設定。

傳回令牌要求:回應 [400];
原因 4:Cloud Shell 發生問題

原因 1:無法建立 Pod,因為節點或資源條件約束

作業會傳 Not Found 回狀態,因為 command-<ID> Pod 無法達到成功狀態,例如 Running。 (在許多情況下,Pod 會留在 Pending 該州。在此情況下,節點無法排程Pod。 此案例可能會有不同的原因,例如下列原因:

  • 資源限制
  • 具有 NotReadySchedulingDisabled 狀態的節點
  • 具有 Pod 無法容忍污點的節點
  • 其他原因

解決方案 1:變更設定,讓您可以排程和執行 Pod

藉由調整組態, command-<ID> 確定Pod可以排程並執行。 例如:

  • 增加節點集區大小,並確定它沒有Pod隔離條件約束,例如污點,以便 command-<ID> 部署Pod。
  • 調整 Pod 規格中的資源要求和限制。

原因 2:Azure 原則 不允許建立 Pod

如果您有特定的 Azure 原則, az aks command invoke 命令可能會因為 Pod 中不允許的 command-<ID> 設定而失敗。 例如,您可能有需要只讀根文件系統或其他特定組態的 Azure 原則。

解決方案 2:針對禁止建立 Pod 的原則豁免命名空間

建議您豁免 aks-command 不允許建立 Pod 之相關聯 Azure 原則的命名空間。 如需豁免的詳細資訊,請參閱瞭解 Azure 原則 中的範圍

若要豁免 Azure 原則:

  1. Azure 入口網站 中,搜尋並選取 [原則]。

  2. 在 [原則] 瀏覽窗格中,找出 [撰寫] 區段,然後選取 [指派]。

  3. 在指派的數據表中,尋找包含 您要變更之指派名稱 的數據列,然後選取指派的名稱。

  4. 在該指派的原則指派頁面中,選取 [ 編輯指派]。

  5. 選取參數索引標籤。

  6. 清除 [ 僅顯示需要輸入或檢閱 ] 選項的參數。

  7. 在 [ 命名空間排除] 方塊中 ,將 aks-command 命名空間新增至要排除的命名空間清單。

或者,如果原則不是內建原則,您可以檢查 Pod 的 command-<ID> 設定,並視需要調整原則。 若要探索 Pod 的 YAML 組態,請執行下列命令:

kubectl get pods command-<ID> --namespace aks-command --output yaml

您可以執行下列命令來豁免 aks-command 命名空間不受限制的原則:

az policy exemption create --name ExemptAksCommand --scope /subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.ContainerService/managedClusters/{aks-cluster} --policyAssignment /subscriptions/{subscription-id}/providers/Microsoft.Authorization/policyAssignments/{policy-assignment-id}

原因 3:未授與必要角色

若要使用 az aks command invoke 命令,您必須能夠存取叢集上的下列角色:

  • Microsoft.ContainerService/managedClusters/runCommand/action
  • Microsoft.ContainerService/managedClusters/commandResults/read

如果您沒有這些角色, az aks command invoke 命令就無法擷取必要的資訊。

解決方案3:新增必要的角色

若要解決此問題,請依照下列步驟執行︰

  1. Microsoft.ContainerService/managedClusters/runCommand/action新增和 Microsoft.ContainerService/managedClusters/commandResults/read 角色。

  2. 將必要的角色指派給使用者:

    az role assignment create --assignee {user-principal-name} --role "Azure Kubernetes Service Cluster User Role" --scope /subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.ContainerService/managedClusters/{aks-cluster}
    

原因 4:Cloud Shell 發生問題

az aks command invoke 命令直接在 Azure Cloud Shell 環境中執行時,不會如預期般處理。 這是 Cloud Shell 中的已知問題。

解決方案 4a:先執行 az login 命令

在 Cloud Shell 中,執行 az login 命令,再執行 az aks command invoke 命令。 例如:

az login
az aks command invoke --resource-group {resource-group} --name {aks-cluster} --command "kubectl get pods"

解決方案 4b:在本機電腦或虛擬機上執行命令

az aks command invoke 已安裝 Azure CLI 的本機電腦或任何虛擬機 (VM) 上執行 命令。

協力廠商資訊免責聲明

本文提及的協力廠商產品是由與 Microsoft 無關的獨立廠商所製造。 Microsoft 不以默示或其他方式,提供與這些產品的效能或可靠性有關的擔保。

與我們連絡,以取得說明

如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以向 Azure 意見反應社群提交產品意見反應。