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
我正在通过 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