在 Azure Kubernetes 服务中使用托管标识

目前,Azure Kubernetes 服务 (AKS) 群集(特指 Kubernetes 云提供商)需要使用标识才能在 Azure 中创建其他资源,例如负载均衡器和托管磁盘。 此标识可以是托管标识或服务主体。 如果使用服务主体,你必须提供一个服务主体,或由 AKS 代表你创建一个。 如果使用托管标识,AKS 会自动为你创建托管标识。 使用服务主体的群集最终会达到这样一种状态,即,必须续订服务主体才能让群集保持正常运行。 管理服务主体会增加复杂性,这也是托管标识使用起来更简单的原因。 服务主体和托管标识适用相同的权限要求。

托管标识本质上是服务主体的包装器,这使其更易于管理。 根据 Azure Active Directory 的默认设置,MI 的凭据轮换每 46 天自动发生一次。 AKS 使用系统分配和用户分配的托管标识类型。 这些标识目前是不可变的。 若要了解详细信息,请阅读 Azure 资源托管标识

准备阶段

必须安装了以下资源:

  • Azure CLI 2.23.0 或更高版本

限制

  • 不支持启用了托管标识的群集的租户移动/迁移。
  • 如果群集启用了 aad-pod-identity,节点托管标识 (NMI) pod 将修改节点的 iptable,以拦截对 Azure 实例元数据终结点的调用。 此配置意味着对元数据终结点发出的任何请求都将被 NMI 拦截,即使 pod 不使用 aad-pod-identity。 可以将 AzurePodIdentityException CRD 配置为通知 aad-pod-identity 应在不使用 NMI 进行出任何处理的情况下,代理与 CRD 中定义的标签匹配的 pod 所发起的对元数据终结点的任何请求。 应通过配置 AzurePodIdentityException CRD 在 aad-pod-identity 中排除在 kube-system 命名空间中具有 kubernetes.azure.com/managedby: aks 标签的系统 pod。 有关详细信息,请参阅禁用特定 pod 或应用程序的 aad-pod-identity。 若要配置例外情况,请安装 mic-exception YAML

托管标识摘要

AKS 对内置服务和加载项使用多个托管标识。

标识 名称 使用案例 默认权限
控制面板 不可见 由 AKS 控制平面组件用于管理群集资源,包括入口负载均衡器和 AKS 管理的公共 IP,以及群集自动缩放程序操作 节点资源组的参与者角色
Kubelet AKS Cluster Name-agentpool 向 Azure 容器注册表 (ACR) 进行身份验证 NA(对于 kubernetes v1.15+)
加载项 AzureNPM 无需标识 不可用
加载项 AzureCNI 网络监视 无需标识 不可用
加载项 azurepolicy(网关守卫) 无需标识 不可用
加载项 azurepolicy 无需标识 不可用
加载项 Calico 无需标识 不可用
加载项 仪表板 无需标识 不可用
加载项 HTTPApplicationRouting 管理所需的网络资源 节点资源组的读取者角色,DNS 区域的参与者角色
加载项 入口应用程序网关 管理所需的网络资源 节点资源组的参与者角色
加载项 omsagent 用于将 AKS 指标发送到 Azure Monitor “监视指标发布者”角色
加载项 Virtual-Node (ACIConnector) 管理 Azure 容器实例 (ACI) 所需的网络资源 节点资源组的参与者角色
OSS 项目 aad-pod-identity 通过 Azure Active Directory (AAD) 使应用程序可安全访问云资源 NA

创建具有托管标识的 AKS 群集

现在,可以使用以下 CLI 命令创建具有托管标识的 AKS 群集。

首先,创建 Azure 资源组:

# Create an Azure resource group
az group create --name myResourceGroup --location chinaeast2

然后,创建 AKS 群集:

az aks create -g myResourceGroup -n myManagedCluster --enable-managed-identity

创建群集后,你便可以将应用程序工作负荷部署到新群集中,并与之交互,就像与基于服务主体的 AKS 群集交互一样。

最后,获取用于访问群集的凭据:

az aks get-credentials --resource-group myResourceGroup --name myManagedCluster

将 ASK 群集更新至托管标识

现在可以使用以下 CLI 命令更新当前使用服务主体的 AKS 集群以使用托管标识。

az aks update -g <RGName> -n <AKSName> --enable-managed-identity

备注

将系统分配的标识或用户分配的标识更新为托管标识后,请在节点上执行 az aks nodepool upgrade --node-image-only 以完成对托管标识的更新。

获取系统分配的托管标识并将其用于 AKS 群集

使用以下 CLI 命令确认 AKS 群集是否正在使用托管标识:

az aks show -g <RGName> -n <ClusterName> --query "servicePrincipalProfile"

如果群集正在使用托管标识,你将看到 clientId 值为“msi”。 改用服务主体的群集将改为显示对象 ID。 例如:

{
  "clientId": "msi"
}

验证群集是否正在使用托管标识后,可以使用以下命令来查找控制平面系统分配的标识的对象 ID:

az aks show -g <RGName> -n <ClusterName> --query "identity"
{
    "principalId": "<object-id>",
    "tenantId": "<tenant-id>",
    "type": "SystemAssigned",
    "userAssignedIdentities": null
},

备注

若要创建并使用自己的 VNet、静态 IP 地址或附加的 Azure 磁盘(资源位于工作器节点资源组外部),请使用群集系统分配的托管标识的 PrincipalID 来执行角色分配。 有关角色分配的详细信息,请参阅委托对其他 Azure 资源的访问权限

向 Azure 云提供商使用的群集托管标识授予的权限可能需要 60 分钟才能填充完毕。