AKS 群集托管标识中的 Nginx 服务无权读取 publicIPAddresses

Nginx service in AKS cluster managed identity doesn't have permission to read publicIPAddresses

我正在通过 Azure CLI 创建 AKS 集群。

类似于:

az aks create 
    --resource-group RESOURCE-GROUP
    --name "mycluster"
    --enable-managed-identity
    --network-plugin "azure"
    --no-ssh-key
    ...

创建后我得到一个托管身份 mycluster-agentpool。我已将该身份添加到 PublicIP 所在的资源组的“网络贡献者”角色。我等了一个多小时。

但我仍然从 nginx 服务中得到这个错误:

network.PublicIPAddressesClient#List: Failure responding to request: StatusCode=403 -- 
Original Error: autorest/azure: Service returned an error. 
Status=403 
Code="AuthorizationFailed" 
Message="The client '00000000-0000-0000-0000-00000000' with object id '00000000-0000-0000-0000-00000000' does not have authorization to perform action 
'Microsoft.Network/publicIPAddresses/read' over scope 
'/subscriptions/00000000-0000-0000-0000-00000000/resourceGroups/RESOURCE-GROUP/providers/Microsoft.Network' or the scope is invalid. 
If access was recently granted, please refresh your credentials."

我觉得奇怪的是,创建集群后查询“identity”:

az aks show -g RESOURCE-GROUP -n mycluster --query "identity"

我得到(示例 GUID):

{
  "principalId": "00000000-1234-1234-1234-00000000",
  "tenantId": "00000000-5678-5678-5678-00000000",
  "type": "SystemAssigned",
  "userAssignedIdentities": null
}

而且这个 principalId 与 mycluster-agentpool 身份的 ObjectId 不匹配,我找不到它所属的任何地方,因为我怀疑 principalId 是需要权限的身份。

nginx 服务尝试连接的身份是什么?

根据研究,我发现当您为 AKS 启用托管身份时,AKS 的属性会显示 servicePrincipalProfile 和 MSI。当你想在另一个资源组中关联一个 public IP 地址时,你需要将“网络贡献者”角色授予 AKS 的托管标识,你可以通过 CLI 获取主体 Id,如下所示:

az aks show -g RESOURCE-GROUP -n mycluster --query "identity.principalId"

您可以获得有关“网络贡献者”的托管身份 here 的更多详细信息。它表明控制平面的身份管理网络资源,包括入口负载均衡器和 AKS 管理的 public IP。上面的 CLI 命令向您显示了控制平面的身份。

这个主体 ID 是一个对象 ID,您可以像这样通过 CLI 获取服务主体:

az ad sp show --id principalId