你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

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

为了访问其他 Azure Active Directory (Azure AD) 资源,AKS 群集需要 Azure Active Directory (AD) 服务主体托管标识。 需要服务主体或托管标识才能动态创建和管理其他 Azure 资源,例如 Azure 负载均衡器或容器注册表 (ACR)。

建议使用托管标识对其他 Azure 资源进行身份验证,它是 AKS 群集的默认身份验证方法。 有关如何在群集中使用托管标识的详细信息,请参阅使用系统分配的托管标识

本文介绍如何创建和使用适用于 AKS 群集的服务主体。

准备阶段

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

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

先决条件

Azure CLI 版本 2.0.59 或更高版本。 运行 az --version 即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI

Azure PowerShell 版本 5.0.0 或更高版本。 运行 Get-InstalledModule -Name Az 即可查找版本。 如果需要安装或升级,请参阅安装 Azure Az PowerShell 模块

手动创建服务主体

若要通过 Azure CLI 手动创建服务主体,请使用 az ad sp create-for-rbac 命令。

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

输出类似于以下示例。 复制 appIdpassword 的值。 在下一部分创建 AKS 群集时,会使用这些值。

{
  "appId": "559513bd-0c19-4c1a-87cd-851a26afd5fc",
  "displayName": "myAKSClusterServicePrincipal",
  "name": "http://myAKSClusterServicePrincipal",
  "password": "e763725a-5eee-40e8-a466-dc88d980f415",
  "tenant": "72f988bf-86f1-41af-91ab-2d7cd011db48"
}

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

若要在通过 az aks create 命令创建 AKS 群集时使用现有的服务主体,请使用 az ad sp create-for-rbac 命令的输出中的 --service-principal--client-secret 参数来指定 appIdpassword

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

注意

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

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

AKS 群集的服务主体可以用来访问其他资源。 例如,如果希望将 AKS 群集部署到现有 Azure 虚拟网络子网或连接到 Azure 容器注册表 (ACR),则需要将对那些资源的访问权限委托给服务主体。

若要委托权限,请使用 az role assignment create 命令创建一个角色分配。 将 appId 分配到特定的作用域,例如一个资源组或虚拟网络资源。 然后,通过角色定义服务主体对资源的具体权限,如以下示例所示:

az role assignment create --assignee <appId> --scope <resourceScope> --role Contributor

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

注意

如果从节点资源组删除了参与者角色分配,则以下操作可能会失败。 使用系统分配的托管标识向群集授予的权限可能需要 60 分钟才能填充完毕。

以下各部分详述了可能需要分配的常见委派。

Azure 容器注册表

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

网络

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

存储

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

  • 创建一个自定义角色,并定义以下角色权限:
    • Microsoft.Compute/disks/read
    • Microsoft.Compute/disks/write
  • 或者,在资源组中分配存储帐户参与者内置角色

Azure 容器实例

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

其他注意事项

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

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

      az ad sp delete --id $(az aks show -g myResourceGroup -n myAKSCluster --query servicePrincipalProfile.clientId -o tsv)
      

故障排除

AKS 群集的服务主体凭据由 Azure CLI 缓存。 如果这些凭据已过期,那么在部署 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'.

请运行以下命令检查凭据文件的存在时间:

ls -la $HOME/.azure/aksServicePrincipal.json

服务主体凭据的默认过期时间为一年后。 如果 aksServicePrincipal.json 文件的存在时间已超出一年,请删除该文件,然后重试部署 AKS 群集。

常规 Azure CLI 故障排除

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

后续步骤

若要详细了解 Azure Active Directory 服务主体,请参阅应用程序和服务主体对象

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