解决“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 群集并检索所需的信息。

先决条件

现象

下表列出了常见的 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。 此方案可能有不同的原因,例如以下原因:

  • 资源约束
  • 具有 NotReadySchedulingDisabled 状态的节点
  • 具有 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,请执行以下操作:

  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 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区