解决“az aks command invoke”失败
本文介绍如何解决 Microsoft Azure CLI 中的 az aks 命令调用失败,以便可以成功连接到任何 Azure Kubernetes 服务 (AKS) 群集,尤其是连接到专用 AKS 群集。
其他连接方法需要使用额外的配置组件,如下表所示。
连接方法 | 额外配置组件 |
---|---|
虚拟网络 | 虚拟专用网络 (VPN) |
对等互连网络 | Azure ExpressRoute |
专用终结点 | Jumpbox |
az aks command invoke
Azure CLI 命令是连接到不需要额外配置组件的群集的替代方法。
运行az aks command invoke
命令时,Azure CLI 会自动在命名空间中创建 aks-command
Pod command-<ID>
以访问 AKS 群集并检索所需的信息。
先决条件
Kubernetes kubectl 工具。 若要使用 Azure CLI 安装 kubectl,请运行 az aks install-cli 命令。
现象
下表列出了常见的 az aks command invoke
错误消息。 每个错误消息都有一个指向该部分的链接,用于描述错误发生的原因以及如何修复此错误。
错误消息 | 链接。 |
---|---|
操作返回了无效状态“找不到” | 原因 1:由于节点或资源约束,无法创建 Pod |
由于 kubernetes 故障,无法在托管群集中运行命令。 详细信息:允许 Webhook“validation.gatekeeper.sh”拒绝请求: <策略特定的消息> | 原因 2:Azure Policy 不允许创建 Pod |
服务器错误(禁止):命名空间被禁止:用户“ID”无法列出群集范围内的 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 Policy 不允许创建 Pod
如果有特定的 Azure 策略,该 az aks command invoke
命令可能会因为 Pod 中 command-<ID>
不允许的配置而失败。 例如,你可能具有需要只读根文件系统或其他特定配置的 Azure 策略。
解决方案 2:为禁止创建 Pod 的策略免除命名空间
建议免除 aks-command
不允许创建 Pod 的关联 Azure 策略的命名空间。 有关豁免的详细信息,请参阅 Azure Policy 中的“了解范围”
若要免除 Azure Policy,请执行以下操作:
在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 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区。