在 AKS 中使用 Microsoft Entra Pod 管理的标识(预览版)

Microsoft Entra pod 托管标识使用 Azure Kubernetes 服务(AKS)基元,将 Azure 资源的托管标识 和 Microsoft Entra ID 中的标识与 pod 关联。 管理员创建 Kubernetes 基元形式的标识和绑定,使 Pod 能够以标识提供者的身份访问依赖于 Microsoft Entra ID 的 Azure 资源。

Microsoft AKS 中的 Entra Pod 托管标识具有以下限制:

  • 每个群集最多支持 200 个 Pod 托管标识。
  • 每个群集最多支持 200 个 Pod 管理的标识例外。
  • Pod 托管标识仅在 Linux 节点池上受支持。
  • 此功能仅在虚拟机规模集支持的群集上受支持。

重要

建议查看 Microsoft Entra 工作负载 ID。 此身份验证方法将替代 Pod 托管标识(预览版),后者与 Kubernetes 本机功能集成,以便代表应用程序与任何外部标识提供者联合。

2022 年 10 月 24 日,Azure Kubernetes 服务中的开源Microsoft Entra Pod 托管标识(预览版)已弃用,项目已于 2023 年 9 月存档。 有关详细信息,请查看弃用通知。 AKS Pod 身份管理托管加载项已进行修补,并将在 2025 年 9 月之前继续支持,以便客户有足够时间迁移到 Microsoft Entra 工作负荷 ID

操作模式选项

Microsoft Entra Pod 托管标识支持两种操作模式:

  • 标准模式:在此模式下,以下两个组件部署到 AKS 群集:

    • 托管标识控制器(MIC):MIC 是 Kubernetes 控制器,通过 Kubernetes API 服务器监控 Pod、AzureIdentityAzureIdentityBinding 的更改。 检测到相关更改时,MIC 会根据需要添加或删除 AzureAssignedIdentity。 具体而言,如果计划了 Pod,MIC 会将 Azure 上的托管标识分配给节点池在创建阶段使用的基础虚拟机规模集。 删除所有使用该标识的 Pod 时,MIC 会从节点池的虚拟机规模集中删除标识,除非其他 Pod 使用相同的托管标识。 创建或删除 AzureIdentity 或 AzureIdentityBinding 时,MIC 会执行类似的操作。

    • 节点托管标识 (NMI):NMI 是在 AKS 群集中每个节点上作为 DaemonSet 运行的 Pod。 NMI 会拦截对 每个节点上的 Azure 实例元数据服务 的安全令牌请求。 NMI 截获令牌请求并将其重定向到自身。 然后,它会检查 Pod 是否有权访问请求的标识,如果是,则代表应用程序从 Microsoft Entra 租户检索令牌。

  • 托管模式:此模式仅提供 NMI。 通过 AKS 群集加载项安装时,Azure 管理创建 Kubernetes 基元(AzureIdentity 和 AzureIdentityBinding)和标识分配,以响应用户的 CLI 命令。 否则,如果通过 Helm 图表安装,则需要根据每个用户手动分配和管理身份。 有关详细信息,请参阅托管模式下的 Pod 标识

安装指南中所示通过 Helm 图表或 YAML 清单安装 Microsoft Entra Pod 托管标识时,可以在 standardmanaged 模式之间进行选择。 如果您决定改用本文中所示的 AKS 集群加载项来安装 Microsoft Entra pod 托管标识,设置将使用 managed 模式。

先决条件

AKS 中的 Microsoft Entra 管理的 Pod 身份必须满足以下要求:

  • 已安装 Azure CLI 2.20.0 或更高版本。

  • AKS 群集版本为 1.26 或更高版本。

  • 必须具有相应的权限,例如 “所有者 ”或 “参与者” 角色。

安装 aks-preview Azure CLI 扩展

重要

AKS 预览功能可在自助服务和自愿选择的基础上启用。 预览版按“现状”和“视供应情况”提供,它们不包括在服务级别协议和有限保证范围内。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:

若要安装 aks-preview 扩展,请运行以下命令:

az extension add --name aks-preview

运行以下命令以更新到已发布的最新扩展版本:

az extension update --name aks-preview

注册 EnablePodIdentityPreview 功能标志

EnablePodIdentityPreview使用 az feature register 命令注册功能标志,如以下示例所示:

az feature register --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview"

小窍门

若要禁用 AKS 托管加载项,请运行以下命令:

az feature unregister --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview"

要过几分钟,状态才会显示为已注册。 使用 az feature show 命令验证注册状态:

az feature show --namespace "Microsoft.ContainerService" --name "EnablePodIdentityPreview"

当状态反映为“已注册”时,使用 az provider register 命令刷新 Microsoft.ContainerService 资源提供程序的注册:

az provider register --namespace Microsoft.ContainerService

使用 Pod 托管标识管理 AKS 群集

启用 Microsoft Entra Pod 托管标识时,可以使用 Azure 容器网络接口(CNI)或 Kubenet 网络插件管理 AKS 群集。

  1. 使用默认建议的配置创建启用了 Azure CNI 和 Pod 托管标识的 AKS 群集。 以下命令使用 az group create 创建名为 myResourceGroup 的资源组,并使用az aks create该命令在 myResourceGroup 资源组中创建名为 myAKSCluster 的 AKS 群集。

    az group create --name myResourceGroup --location eastus
    az aks create \
        --resource-group myResourceGroup \
        --name myAKSCluster \
        --enable-pod-identity \
        --network-plugin azure \
        --generate-ssh-keys
    
  2. 使用 az aks get-credentials 登录到 AKS 群集。 此命令还会在开发计算机上下载并配置 kubectl 客户端证书。

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

在 AKS 群集上启用 Pod 托管身份时,系统会将一个AzurePodIdentityException 名为aks-addon-exception的组件添加到kube-system命名空间。 允许 AzurePodIdentityException 具有某些标签的容器组访问 Azure 实例元数据服务 (IMDS) 终结点,而无需经过 NMI 服务器的拦截。 aks-addon-exception 允许 AKS 第一方插件(如 Microsoft Entra pod 托管标识)运行,而无需手动配置 AzurePodIdentityException。 可选择地,您可以使用...添加、删除和更新AzurePodIdentityException

  • az aks pod-identity exception add

  • az aks pod-identity exception delete

  • az aks pod-identity exception update

  • kubectl

更新使用 Azure CNI 的现有 AKS 群集

若要使用 Azure CNI 更新现有 AKS 群集以包含 Pod 托管标识,请运行以下命令:

az aks update --resource-group $MY_RESOURCE_GROUP --name $MY_CLUSTER --enable-pod-identity

创建管理标识

必须在订阅上拥有相关权限(例如 所有者),才能创建标识。

若要使用 az identity create 创建供演示 Pod 使用的标识,请设置 IDENTITY_CLIENT_IDIDENTITY_RESOURCE_ID 变量,然后运行以下命令:

az group create --name myIdentityResourceGroup --location chinaeast2
export IDENTITY_RESOURCE_GROUP="myIdentityResourceGroup"
export IDENTITY_NAME="application-identity"
az identity create --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME}
export IDENTITY_CLIENT_ID="$(az identity show --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME} --query clientId -o tsv)"
export IDENTITY_RESOURCE_ID="$(az identity show --resource-group ${IDENTITY_RESOURCE_GROUP} --name ${IDENTITY_NAME} --query id -o tsv)"

为托管标识分配权限

必须根据 Pod 执行的操作为分配给 Pod 的托管标识授予适当的权限。 确保仅分配所需的最低角色以遵循安全最佳做法。

若要运行演示, IDENTITY_CLIENT_ID 托管标识必须在包含 AKS 群集虚拟机规模集的资源组中具有虚拟机 参与者 权限。

# Obtain the name of the resource group containing the Virtual Machine Scale set of your AKS cluster, commonly called the node resource group
NODE_GROUP=$(az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv)

# Obtain the id of the node resource group
NODES_RESOURCE_ID=$(az group show --name $NODE_GROUP -o tsv --query "id")

# Create a role assignment granting your managed identity permissions on the node resource group
az role assignment create --role "Virtual Machine Contributor" --assignee "$IDENTITY_CLIENT_ID" --scope $NODES_RESOURCE_ID

创建 Pod 托管标识

要使用 az aks pod-identity add 为集群创建受管理的标识,请运行以下命令:

export POD_IDENTITY_NAME="my-pod-identity"
export POD_IDENTITY_NAMESPACE="my-app"
az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE}  --name ${POD_IDENTITY_NAME} --identity-resource-id ${IDENTITY_RESOURCE_ID}

注释

“POD_IDENTITY_NAME”必须是 RFC 1123 中定义的有效域名系统(DNS)子域名

使用 pod-identity add 分配 Pod 托管标识时,Azure CLI 尝试通过 Pod 托管标识 (IDENTITY_RESOURCE_ID) 向群集标识授予“托管标识操作员”角色。

Azure 在集群中创建一个表示 Azure 中标识的 AzureIdentity 资源,以及一个将该 AzureIdentity 连接到选择器的 AzureIdentityBinding 资源。 可以通过运行以下命令来查看这些资源:

kubectl get azureidentity -n $POD_IDENTITY_NAMESPACE
kubectl get azureidentitybinding -n $POD_IDENTITY_NAMESPACE

运行示例应用程序

要使某个 Pod 能够使用 Microsoft Entra Pod 托管标识,该 Pod 需要一个 aadpodidbinding 标签,其值与 AzureIdentityBinding 中的选择器相匹配。 默认情况下,选择器将匹配 Pod 托管标识的名称,但也可在调用 --binding-selector 时使用 az aks pod-identity add 选项进行设置。

要使用 Microsoft Entra Pod 托管标识运行示例应用程序,请创建包含以下内容的 demo.yaml 文件。 请将 POD_IDENTITY_NAMEIDENTITY_CLIENT_IDIDENTITY_RESOURCE_GROUP 替换为前面步骤中使用的值。 请将 SUBSCRIPTION_ID 替换为你的订阅 ID。

注释

在前面的步骤中,你已创建 POD_IDENTITY_NAMEIDENTITY_CLIENT_IDIDENTITY_RESOURCE_GROUP 变量。 可以使用诸如 echo 的命令来显示你为变量设置的值(例如 echo $POD_IDENTITY_NAME)。

apiVersion: v1
kind: Pod
metadata:
  name: demo
  labels:
    aadpodidbinding: $POD_IDENTITY_NAME
spec:
  containers:
  - name: demo
    image: mcr.azk8s.cn/oss/azure/aad-pod-identity/demo:v1.6.3
    args:
      - --subscriptionid=$SUBSCRIPTION_ID
      - --clientid=$IDENTITY_CLIENT_ID
      - --resourcegroup=$IDENTITY_RESOURCE_GROUP
    env:
      - name: MY_POD_NAME
        valueFrom:
          fieldRef:
            fieldPath: metadata.name
      - name: MY_POD_NAMESPACE
        valueFrom:
          fieldRef:
            fieldPath: metadata.namespace
      - name: MY_POD_IP
        valueFrom:
          fieldRef:
            fieldPath: status.podIP
  nodeSelector:
    kubernetes.io/os: linux

请注意,Pod 定义具有一个标签,该值与在上一 aadpodidbinding 步中运行的 az aks pod-identity add Pod 托管标识的名称匹配。

  1. demo.yaml 部署到与 Pod 托管标识相同的命名空间中,使用 kubectl apply

    kubectl apply -f demo.yaml --namespace $POD_IDENTITY_NAMESPACE
    
  2. 验证示例应用程序是否已成功运行并使用 kubectl logs:

    kubectl logs demo --follow --namespace $POD_IDENTITY_NAMESPACE
    

    验证日志显示令牌是否成功获取,以及 HTTP GET 请求操作是否成功。

    ...
    successfully doARMOperations vm count 0
    successfully acquired a token using the MSI, msiEndpoint(http://169.254.169.254/metadata/identity/oauth2/token)
    successfully acquired a token, userAssignedID MSI, msiEndpoint(http://169.254.169.254/metadata/identity/oauth2/token) clientID(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
    successfully made GET on instance metadata
    ...
    

运行具有多个标识的应用程序

若要使应用程序能够使用多个标识,请在创建 Pod 标识时将 --binding-selector 设置为相同的选择器:

az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE}  --name ${POD_IDENTITY_NAME_1} --identity-resource-id ${IDENTITY_RESOURCE_ID_1} --binding-selector myMultiIdentitySelector
az aks pod-identity add --resource-group myResourceGroup --cluster-name myAKSCluster --namespace ${POD_IDENTITY_NAMESPACE}  --name ${POD_IDENTITY_NAME_2} --identity-resource-id ${IDENTITY_RESOURCE_ID_2} --binding-selector myMultiIdentitySelector

然后将 Pod YAML 中的 aadpodidbinding 字段设置为指定的绑定选择器。

apiVersion: v1
kind: Pod
metadata:
  name: demo
  labels:
    aadpodidbinding: myMultiIdentitySelector
...

在现有群集上禁用 Pod 托管标识

  1. 若要在现有群集上禁用 Pod 托管标识,请运行以下命令从群集中删除 Pod 托管标识:

    az aks pod-identity delete --name ${POD_IDENTITY_NAME} --namespace ${POD_IDENTITY_NAMESPACE} --resource-group myResourceGroup --cluster-name myAKSCluster
    
  2. 然后运行以下命令禁用群集上的功能:

    az aks update --resource-group myResourceGroup --name myAKSCluster --disable-pod-identity
    

清理资源

要从群集中移除 Microsoft Entra Pod 托管标识,请从群集中移除示例应用程序和 Pod 托管标识。

kubectl delete pod demo --namespace $POD_IDENTITY_NAMESPACE

然后删除群集标识的标识和角色分配。

az aks pod-identity delete \
  --name ${POD_IDENTITY_NAME} \
  --namespace ${POD_IDENTITY_NAMESPACE} \
  --resource-group myResourceGroup \
  --cluster-name myAKSCluster

az identity delete \
  --resource-group ${IDENTITY_RESOURCE_GROUP} \
  --name ${IDENTITY_NAME}

az role assignment delete \
  --role "Managed Identity Operator" \
  --assignee "$IDENTITY_CLIENT_ID" \
  --scope "$IDENTITY_RESOURCE_ID"

后续步骤

有关托管标识的详细信息,请参阅 Azure 资源的托管标识