在 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 Workload 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、AzureIdentity 和 AzureIdentityBinding 的更改。 检测到相关更改时,MIC 会根据需要添加或删除 AzureAssignedIdentity。 具体而言,当某个 Pod 被调度时,MIC 会在创建阶段将 Azure 上的托管身份分配给节点池所使用的底层虚拟机规模集。 当所有使用该标识的 Pod 都被删除后,就会从节点池的虚拟机规模集中移除该标识,除非其他 Pod 也在使用同一个托管标识。 创建或删除 AzureIdentity 或 AzureIdentityBinding 时,MIC 会执行类似的操作。

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

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

如安装指南中所示通过 Helm 图表或 YAML 清单安装 Microsoft Entra Pod 托管标识时,可以在 standard 和 managed 模式之间进行选择。 如果您决定改用本文中所示的 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_ID 和 IDENTITY_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_NAME、IDENTITY_CLIENT_ID 和 IDENTITY_RESOURCE_GROUP 替换为前面步骤中使用的值。 请将 SUBSCRIPTION_ID 替换为你的订阅 ID。

注释

在前面的步骤中,你已创建 POD_IDENTITY_NAME、IDENTITY_CLIENT_ID 和 IDENTITY_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 资源的托管标识。