解決 「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 叢集並擷取所需的資訊。
必要條件
Kubernetes kubectl 工具。 若要使用 Azure CLI 安裝 kubectl,請執行 az aks install-cli 命令。
徵兆
下表列出常見的 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。 此案例可能會有不同的原因,例如下列原因:
- 資源限制
- 具有
NotReady
或SchedulingDisabled
狀態的節點 - 具有 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 原則:
在 Azure 入口網站 中,搜尋並選取 [原則]。
在 [原則] 瀏覽窗格中,找出 [撰寫] 區段,然後選取 [指派]。
在指派的數據表中,尋找包含 您要變更之指派名稱 的數據列,然後選取指派的名稱。
在該指派的原則指派頁面中,選取 [ 編輯指派]。
選取參數索引標籤。
清除 [ 僅顯示需要輸入或檢閱 ] 選項的參數。
在 [ 命名空間排除] 方塊中 ,將 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:新增必要的角色
若要解決此問題,請依照下列步驟執行︰
Microsoft.ContainerService/managedClusters/runCommand/action
新增和Microsoft.ContainerService/managedClusters/commandResults/read
角色。將必要的角色指派給使用者:
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 意見反應社群提交產品意見反應。