Compartir a través de

使用 Azure Kubernetes 服务 (AKS) 的服务主体

AKS 群集需要 Microsoft Entra 服务主体托管标识来动态创建和管理其他 Azure 资源,例如 Azure 负载均衡器或 Azure 容器注册表 (ACR)。

为获得最佳安全性和易用性,Microsoft 建议使用托管标识而不是服务主体来授权从 AKS 群集访问 Azure 中的其他资源。 托管标识是一种特殊类型的服务主体,可用于获取 Microsoft Entra 凭据,而无需管理和保护凭据。 有关在群集中使用托管标识的详细信息,请参阅在 AKS 中使用托管标识

本文介绍如何在 AKS 群集中创建和使用服务主体。

开始之前

要创建 Microsoft Entra 服务主体,必须具有相应的权限,能够向 Microsoft Entra 租户注册应用程序,并将应用程序分配到订阅中的角色。 如果没有必要的权限,则需要让 Microsoft Entra ID 或订阅管理员来分配必要的权限,或者预先创建一个可以与 AKS 群集配合使用的服务主体。

如果使用来自另一 Microsoft Entra 租户的服务主体,则还需围绕部署群集时可用的权限进行更多的考量。 你可能没有读取和写入目录信息的适当权限。 有关详细信息,请参阅 Microsoft Entra 中的默认用户权限是什么?

先决条件

  • 如果使用的是 Azure CLI,需要 Azure CLI 2.0.59 或更高版本。 运行 az --version 即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI
  • 如果使用的是 Azure PowerShell,需要 Azure PowerShell 5.0.0 或更高版本。 运行 Get-InstalledModule -Name Az 即可查找版本。 如果需要安装或升级,请参阅安装 Azure Az PowerShell 模块

创建服务主体

在创建群集之前创建服务主体。

  1. 使用“az ad sp create-for-rbac”命令创建服务主体。

    az ad sp create-for-rbac --name myAKSClusterServicePrincipal
    

    输出应类似于以下示例输出:

    {
      "appId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "displayName": "myAKSClusterServicePrincipal",
      "name": "http://myAKSClusterServicePrincipal",
      "password": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "tenant": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    }
    
  2. 复制输出中 appIdpassword 的值。 在下一个部分创建 AKS 群集时会用到这两个值。

指定适用于 AKS 群集的服务主体

  • 为使用“az aks create”命令新建的 AKS 群集使用现有服务主体,并使用 --service-principal--client-secret 参数指定上一个部分得到的输出中的 appIdpassword

    az aks create \
        --resource-group myResourceGroup \
        --name myAKSCluster \
        --service-principal <appId> \
        --client-secret <password> \
        --generate-ssh-keys
    

    注意

    如果使用的是具有自定义机密的现有服务主体,请确保该机密不超过 190 字节。

委托对其他 Azure 资源的访问权限

AKS 群集的服务主体可以用来访问其他资源。 例如,如果要将 AKS 群集部署到现有 Azure 虚拟网络子网,连接到 Azure 容器注册表 (ACR),或从群集访问密钥保管库中的密钥或机密,则需要将对这些资源的访问权限委派给服务主体。 若要委派访问权限,请将 Azure 基于角色的访问控制 (Azure RBAC) 角色分配给服务主体。

重要

向与群集关联的服务主体授予的权限可能需要 60 分钟才能传播。

  • 使用 az role assignment create 命令创建角色分配。 为 appId 参数提供服务主体的 appID 的值。 指定角色分配的范围,例如资源组或虚拟网络资源。 角色分配决定服务主体对资源拥有哪些权限以及在什么范围内拥有这些权限。

    例如,若要分配服务主体权限来访问密钥保管库中的机密,可以使用以下命令:

    az role assignment create \
        --assignee <appId> \
        --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.KeyVault/vaults/<vault-name>" \
        --role "Key Vault Secrets User"
    

    注意

    资源的 --scope 需要是完整的资源 ID,例如 /subscriptions/<guid>/resourceGroups/myResourceGroup/subscriptions/<guid>/resourceGroups/myResourceGroupVnet/providers/Microsoft.Network/virtualNetworks/myVnet

以下部分详细介绍了可能需要分配给服务主体的常见委派。

Azure 容器注册表

如果使用 Azure 容器注册表 (ACR) 作为容器映像存储,则需要向 AKS 群集的服务主体授予读取和拉取映像的权限。 建议使用 az aks createaz aks update 命令与注册表集成,并为服务主体分配适当角色。 有关详细步骤,请参阅通过 Azure Kubernetes 服务向 Azure 容器注册表进行身份验证

网络

可以使用高级网络,在该网络中,虚拟网络和子网或公共 IP 地址位于另一资源组中。 在虚拟网络的子网上分配网络参与者内置角色。 或者,可以创建有权访问该资源组中网络资源的自定义角色。 有关详细信息,请参阅 AKS 服务权限

存储

如果需要访问另一个资源组中的现有磁盘资源,请分配以下角色权限集之一:

  • 创建自定义角色,并定义 Microsoft.Compute/disks/readMicrosoft.Compute/disks/write 角色权限,或者
  • 在资源组中分配虚拟机参与者内置角色。

Azure 容器实例

如果使用虚拟 Kubelet 与 AKS 集成,并选择在与 AKS 群集分开的资源组中运行 Azure 容器实例 (ACI),则必须在 ACI 资源组上向 AKS 群集服务主体授予“参与者”权限。

其他注意事项

使用 AKS 和 Microsoft Entra 服务主体时,请考虑以下几点:

  • Kubernetes 的服务主体是群集配置的一部分,但不要使用此标识来部署群集。
  • 默认情况下,服务主体凭据的有效期为一年。 可以随时更新或轮换服务主体凭据
  • 每个服务主体都与一个 Microsoft Entra 应用程序相关联。 Kubernetes 群集的服务主体可以与任何有效的 Microsoft Entra 应用程序名称(例如 https://www.contoso.org/example)相关联。 应用程序的 URL 不一定是实际的终结点。
  • 指定服务主体客户端 ID 时,请使用 appId 的值。
  • 在 Kubernetes 群集的代理节点 VM 中,服务主体凭据存储在 /etc/kubernetes/azure.json 文件中。
  • 在删除使用“az aks create”命令创建的 AKS 群集时,不会删除自动创建的服务主体。
    • 若要删除服务主体,请查询群集 servicePrincipalProfile.clientId,使用“az ad sp delete”命令将其删除。 替换资源组名称的 -g 参数的值,以及群集名称的 -n 参数的值:

      az ad sp delete --id $(az aks show \
        --resource-group myResourceGroup \
        --name myAKSCluster \
        --query servicePrincipalProfile.clientId \
        --output tsv)
      

故障排除

Azure CLI 会缓存 AKS 群集的服务主体凭据。 如果这些凭据过期,会在 AKS 群集部署期间遇到错误。 如果运行“az aks create”命令并收到类似于以下内容的错误消息,则可能表示缓存的服务主体凭据有问题:

Operation failed with status: 'Bad Request'.
Details: The credentials in ServicePrincipalProfile were invalid. Please see https://aka.ms/aks-sp-help for more details.
(Details: adal: Refresh request failed. Status Code = '401'.

可以结合使用 az ad app credential list 命令与 "[].endDateTime" 查询,检查服务主体凭据的到期日期。

az ad app credential list \
    --id <app-id> \
    --query "[].endDateTime" \
    --output tsv

服务主体凭据的默认过期时间为一年后。 如果凭据超过一年,可以重置现有凭据创建新服务主体

常规 Azure CLI 故障排除

Azure CLI 可以在多个 shell 环境中运行,但格式略有变化。 如果 Azure CLI 命令出现意外结果,请参阅如何成功使用 Azure CLI

后续步骤

有关 Microsoft Entra 服务主体的详细信息,请参阅 Application Objects and Service Principal Objects(应用程序对象和服务主体对象)。

有关如何更新凭据的信息,请参阅为 AKS 中的服务主体更新或轮换凭据