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、AzureIdentity 和 AzureIdentityBinding 的更改。 检测到相关更改时,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 托管标识时,可以在 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 群集。
使用默认建议的配置创建启用了 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使用
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 addaz aks pod-identity exception deleteaz 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 托管标识的名称匹配。
将
demo.yaml部署到与 Pod 托管标识相同的命名空间中,使用kubectl apply。kubectl apply -f demo.yaml --namespace $POD_IDENTITY_NAMESPACE验证示例应用程序是否已成功运行并使用
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 托管标识
若要在现有群集上禁用 Pod 托管标识,请运行以下命令从群集中删除 Pod 托管标识:
az aks pod-identity delete --name ${POD_IDENTITY_NAME} --namespace ${POD_IDENTITY_NAMESPACE} --resource-group myResourceGroup --cluster-name myAKSCluster然后运行以下命令禁用群集上的功能:
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 资源的托管标识。