将 Microsoft Entra 工作负载 ID 与 Azure Kubernetes 服务 (AKS) 配合使用

部署在 Azure Kubernetes 服务 (AKS) 群集上的工作负载需要使用 Microsoft Entra 应用程序凭据或托管标识才能访问由 Microsoft Entra 保护的资源,例如 Azure 密钥保管库和 Microsoft Graph。 Microsoft Entra 工作负载 ID 与 Kubernetes 原生功能集成,以便与外部标识提供者联合。

Microsoft Entra 工作负载 ID 使用服务帐户令牌卷投影(即服务帐户),从而支持 Pod 使用 Kubernetes 标识。 将会颁发 Kubernetes 令牌,并且 OIDC 联合支持 Kubernetes 应用程序基于带注释的服务帐户使用 Microsoft Entra ID 安全地访问 Azure 资源。

Microsoft Entra 工作负载 ID 与应用程序注册结合使用,特别适用于 Azure 标识客户端库Microsoft 身份验证库 (MSAL) 集合。 工作负载可以使用其中任何一个库来无缝地进行身份验证和访问 Azure 云资源。

本文可帮助你了解 Microsoft Entra Workload ID,并回顾了可用于规划项目策略和从 Microsoft Entra Pod 托管标识进行可能的迁移的选项。

注意

可以使用服务连接器自动配置某些步骤。 另请参阅:什么是服务连接器?

依赖项

  • AKS 支持版本 1.22 及更高版本的 Microsoft Entra 工作负载 ID。
  • Azure CLI 版本 2.47.0 或更高版本。 可通过运行 az --version 查找版本,运行 az upgrade 升级版本。 如果需要进行安装或升级,请参阅安装 Azure CLI

Azure 标识客户端库

在 Azure 标识客户端库中,选择以下方法之一:

  • 使用 DefaultAzureCredential,它会尝试使用 WorkloadIdentityCredential
  • 创建包含 ChainedTokenCredentialWorkloadIdentityCredential 实例。
  • 直接使用 WorkloadIdentityCredential

下表提供了每种语言生态系统的客户端库所需的最低包版本。

生态系统 图书馆 最低版本
.NET Azure.Identity 1.9.0
C++ azure-identity-cpp 1.6.0
Go azidentity 1.3.0
Java azure-identity 1.9.0
Node.js @azure/identity 3.2.0
Python azure-identity 1.13.0

在以下代码示例中使用 DefaultAzureCredential。 此凭证类型使用 Azure 工作负载身份变更 Webhook 注入的环境变量来与 Azure Key Vault 进行身份验证。 若要查看使用其他方法之一的示例,请参阅上述特定于生态系统的客户端库链接。

using Azure.Identity;
using Azure.Security.KeyVault.Secrets;

string keyVaultUrl = Environment.GetEnvironmentVariable("KEYVAULT_URL");
string secretName = Environment.GetEnvironmentVariable("SECRET_NAME");

var client = new SecretClient(
    new Uri(keyVaultUrl),
    new DefaultAzureCredential());

KeyVaultSecret secret = await client.GetSecretAsync(secretName);

Microsoft 身份验证库 (MSAL)

以下客户端库是所需的最低版本。

生态系统 图书馆 映像 示例 有窗户
.NET 适用于 .Net 的 Microsoft 身份验证库 ghcr.io/azure/azure-workload-identity/msal-net:latest 链接
Go 适用于 Go 的 Microsoft 身份验证库 ghcr.io/azure/azure-workload-identity/msal-go:latest 链接
Java Microsoft Authentication Library-for-java ghcr.io/azure/azure-workload-identity/msal-java:latest 链接
JavaScript Microsoft Authentication Library-for-js ghcr.io/azure/azure-workload-identity/msal-node:latest 链接
Python Microsoft Authentication Library-for-python ghcr.io/azure/azure-workload-identity/msal-python:latest 链接

限制

  • 每个托管身份最多可以有 20 个联合标识凭据
  • 联合标识凭据在最初添加后需要几秒钟才能传播。
  • 不支持基于开源项目 Virtual Kubelet虚拟节点加载项。
  • 不支持对这些区域中的用户分配的托管标识创建联合标识凭据。

工作原理

在此安全模型中,AKS 群集充当令牌颁发者。 Microsoft Entra ID 使用 OpenID Connect 发现公共签名密钥,并在用它交换 Microsoft Entra 令牌前验证服务帐户令牌的真实性。 工作负载可以使用 Azure 标识客户端库或 Microsoft 身份验证库 (MSAL),用投影到其卷的服务帐户令牌交换 Microsoft Entra 令牌。

AKS 工作负载标识安全模型示意图。

下表描述了 Microsoft Entra 工作负载 ID 所需的 OIDC 颁发者终结点:

终结点 说明
{IssuerURL}/.well-known/openid-configuration 也称为 OIDC 发现文档。 此处包含关于发行者配置的元数据。
{IssuerURL}/openid/v1/jwks 这包含 Microsoft Entra ID 用于验证服务帐户令牌真实性的公共签名密钥。

下图汇总了使用 OpenID Connect 的身份验证顺序。

AKS 工作负载标识 OIDC 身份验证顺序示意图。

Webhook 证书自动轮换

与其他 Webhook 加载项类似,证书通过群集证书自动轮换操作进行轮换。

服务帐户标签和批注

Microsoft Entra 工作负载 ID 支持与服务帐户相关的以下映射:

  • 一个服务帐户引用一个 Microsoft Entra 对象的一对一映射。
  • 多个服务帐户引用同一 Microsoft Entra 对象的多对一映射。
  • 一个服务帐户通过更改客户端 ID 注释来引用多个 Microsoft Entra 对象的一对多映射。 有关详细信息,请参阅如何将多个标识与 Kubernetes 服务帐户联合

注意

如果服务帐户批注已更新,你必须重启 Pod 才能使更改生效。

如果你已使用 Microsoft Entra Pod 托管标识,则可将服务帐户视为 Azure 安全主体,只不过服务帐户是核心 Kubernetes API 的一部分,而不是自定义资源定义 (CRD)。 以下部分描述了可用标签和注释的列表,它们可用于配置在将服务帐户令牌交换为 Microsoft Entra 访问令牌时的行为。

服务帐户批注

所有注释都是可选的。 如果未指定注释,则将使用默认值。

注释 说明 默认
azure.workload.identity/client-id 表示 Microsoft Entra 应用程序
与 Pod 一起使用的客户端 ID。
azure.workload.identity/tenant-id 表示 Azure 租户 ID,其中的
Microsoft Entra 应用程序已注册。
AZURE_TENANT_ID 环境变量从
azure-wi-webhook-config ConfigMap 提取。
azure.workload.identity/service-account-token-expiration 表示投影的服务帐户令牌的 expirationSeconds
字段。 这是一个可选字段,您可以配置它以防止停机。
在服务帐户令牌刷新期间因出错而导致停机。 Kubernetes 服务帐户令牌过期时间与 Microsoft Entra 令牌无关。 Microsoft Entra 令牌将在颁发后的 24 小时内过期。
3600
支持的范围为 3600-86400。

Pod 标签

注意

对于使用工作负载标识的应用程序,需要向 Pod 规格添加标签 azure.workload.identity/use: "true",以便 AKS 将工作负载标识移动到“失败关闭”方案,从而为需要使用工作负载标识的 Pod 提供一致且可靠的行为。 否则,Pod 在重启后会失败。

标签 说明 建议的值 必需
azure.workload.identity/use Pod 模板规范中需要此标签。azure-workload-identity 可变准入 Webhook 只会对带有此标签的 Pod 执行可变操作,以便注入特定于 Azure 的环境变量以及投影的服务帐户令牌卷。

Pod 注释

所有注释都是可选的。 如果未指定注释,则将使用默认值。

注释 说明 默认
azure.workload.identity/service-account-token-expiration 表示投影的服务帐户令牌的 expirationSeconds 字段。 这是一个可选字段,可以配置它以防止在服务帐户令牌刷新期间因出错而导致停机。 Kubernetes 服务帐户令牌过期时间与 Microsoft Entra 令牌无关。 Microsoft Entra 令牌将在颁发后的 24 小时内过期。 1 3600
支持的范围为 3600-86400。
azure.workload.identity/skip-containers 表示一个以分号分隔的容器列表,这些容器将跳过添加投影的服务帐户令牌卷的操作。 例如,container1;container2 默认情况下,如果 Pod 带有 azure.workload.identity/use: true 标签,那么投影的服务帐户令牌卷将添加到所有容器中。
azure.workload.identity/inject-proxy-sidecar 将代理 init 容器和代理挎斗注入 Pod。 代理挎斗用于拦截对 IMDS 的令牌请求,并代表具有联合标识凭据的用户获取 Microsoft Entra 令牌。
azure.workload.identity/proxy-sidecar-port 表示代理挎斗的端口。 8000

1 当同时批注了服务帐户时优先。

如何迁移到 Microsoft Entra Workload ID

在已经运行 Pod 托管标识的群集上,可以通过两种方式之一将该群集配置为使用工作负载标识。 第一种做法允许使用为 Pod 托管标识实现的相同配置。 你可以在命名空间中使用标识批注服务帐户,以启用 Microsoft Entra Workload ID 并将批注注入 Pod。

第二种做法是重新编写应用程序,以使用最新版本的 Azure 标识客户端库。

为了帮助条理化和简化迁移过程,我们开发了一个迁移挎斗,它可以将应用程序产生的 IMDS 事务转换到 OpenID Connect (OIDC)。 迁移挎斗不旨在用作长期解决方案,而是一种快速启动和运行工作负载标识的方式。 在应用程序中运行迁移挎斗会将应用程序 IMDS 事务中转到 OIDC。 另一种方法是升级到支持 OIDC 身份验证的受支持 Azure 标识客户端库版本。

下表汇总了我们的工作负载标识迁移或部署建议。

情景 说明
新的或现有群集部署运行受支持版本的 Azure 标识客户端库 无需执行迁移步骤。
示例部署资源:在新群集上部署并配置工作负载标识
新的或现有群集部署运行不受支持版本的 Azure 标识客户端库 更新容器映像以使用受支持版本的 Azure 标识 SDK,或使用迁移挎斗

后续步骤