你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
部署在 AKS 群集上的工作负荷需要Microsoft Entra 应用程序凭据或托管标识才能访问 Microsoft Entra 保护的资源,例如 Azure Key Vault 和 Microsoft Graph。 Microsoft Entra Workload ID 与 Kubernetes 原生功能集成,来联合外部身份验证提供者,使你能够将工作负载身份分配给工作负载,用于身份验证和访问其他服务和资源。
Microsoft Entra 工作负荷 ID 使用 服务帐户令牌卷投影 (或服务 帐户),使 Pod 能够使用 Kubernetes 标识。 颁发 Kubernetes 令牌, OpenID Connect (OIDC) 联合身份验证 使 Kubernetes 应用程序能够基于带批注的服务帐户通过 Microsoft Entra ID 安全地访问 Azure 资源。
可以将 Microsoft Entra 工作负荷 ID 与 Azure 标识客户端库 或 Microsoft身份验证库 (MSAL) 集合一起使用,以及 应用程序注册,以便无缝地进行身份验证和访问 Azure 云资源。
注意
可以使用服务连接器自动配置某些步骤。 有关详细信息,请参阅 什么是服务连接器?
先决条件
- AKS 支持版本 1.22 及更高版本的 Microsoft Entra 工作负载 ID。
- Azure CLI 版本 2.47.0 或更高版本。 可通过运行
az --version查找版本,运行az upgrade升级版本。 如果需要进行安装或升级,请参阅安装 Azure CLI。
限制
- 每个托管身份最多可以有 20 个联合标识凭据。
- 最初添加后,联合标识凭据传播需要几秒钟时间。
- 不支持基于开源项目 Virtual Kubelet 的虚拟节点加载项。
- 在这些区域中,用户分配的托管标识不支持创建联合身份凭据。
Azure 标识客户端库
在 Azure 标识客户端库中,选择以下方法之一:
- 使用
DefaultAzureCredential,它会尝试使用WorkloadIdentityCredential。 - 创建包含
ChainedTokenCredential的WorkloadIdentityCredential实例。 - 直接使用
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 |
Azure 标识客户端库代码示例
以下代码示例使用 DefaultAzureCredential. 此凭据类型使用负载身份变更 webhook 注入的环境变量,与 Azure Key Vault 进行身份验证。 若要查看使用其他方法之一的示例,请参阅 特定于生态系统的客户端库。
using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
string keyVaultUrl = Environment.GetEnvironmentVariable("<key-vault-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身份验证库适用于Java | ghcr.io/azure/azure-workload-identity/msal-java:latest |
链接 | 否 |
| JavaScript | 用于 JavaScript 的 Microsoft 身份验证库 | ghcr.io/azure/azure-workload-identity/msal-node:latest |
链接 | 否 |
| Python | Microsoft身份验证库-适用于Python | ghcr.io/azure/azure-workload-identity/msal-python:latest |
链接 | 否 |
工作原理
在此安全模型中,AKS 群集充当令牌颁发者。 Microsoft Entra ID 使用 OIDC 发现公共签名密钥,并在用它交换 Microsoft Entra 令牌前验证服务帐户令牌的真实性。 工作负荷可以使用 Azure Identity 客户端库或 MSAL,将其卷中投射的服务帐户令牌交换为 Microsoft Entra 令牌。
下表描述了 Microsoft Entra 工作负载 ID 所需的 OIDC 颁发者终结点:
| 终结点 | 说明 |
|---|---|
{IssuerURL}/.well-known/openid-configuration |
也称为 OIDC 发现文档。 此处包含关于发行者配置的元数据。 |
{IssuerURL}/openid/v1/jwks |
这包含 Microsoft Entra ID 用于验证服务帐户令牌真实性的公共签名密钥。 |
下图总结了使用 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 标签
注意
对于使用 Microsoft Entra 工作负荷身份的应用程序,需要将标签 azure.workload.identity/use: "true" 添加到 AKS 的 Pod 规范中,以便将工作负荷身份移动到 “Fail Close” 方案,为需要使用工作负荷身份的 Pod 提供一致且可靠的行为。 否则,Pod 在重启后将无法正常运行。
| 标签 | 说明 | 建议的值 | 必需 |
|---|---|---|---|
azure.workload.identity/use |
Pod 模板规范中需要此标签。azure-workload-identity 可变准入 Webhook 只会对带有此标签的 Pod 执行可变操作,以便注入特定于 Azure 的环境变量以及投影的服务帐户令牌卷。 | 是 | 是 |
Pod 注释
所有注释都是可选的。 如果未指定批注,则使用默认值。
| 注释 | 说明 | 默认 |
|---|---|---|
azure.workload.identity/service-account-token-expiration |
有关详细信息 ,请参阅服务帐户注释 。 Pod 注释优先于服务帐户注释。 | 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 令牌。 | false |
azure.workload.identity/proxy-sidecar-port |
表示代理挎斗的端口。 | 8000 |
迁移到 Microsoft Entra 工作负荷 ID
可以通过以下两种方式之一配置已运行 Pod 托管标识的群集以使用 Microsoft Entra 工作负荷 ID:
- 使用为 Pod 托管标识实现的相同配置。 你可以在命名空间中使用标识批注服务帐户,以启用 Microsoft Entra Workload ID 并将批注注入 Pod。
- 重写应用程序以使用最新版本的 Azure 标识客户端库。
为了帮助简化和加快迁移过程,我们开发了一个迁移sidecar,用于将应用程序创建的实例元数据服务(IMDS)事务转换为OIDC。 迁移辅助程序并不是一种长期解决方案,而是一种能够快速启动和运行 Microsoft Entra 负载 ID 的方法。 在应用程序中运行迁移挎斗会将应用程序 IMDS 事务中转到 OIDC。 另一种方法是升级到支持 OIDC 身份验证的受支持 Azure 标识客户端库版本。
下表汇总了 AKS 群集的迁移或部署建议:
| 情景 | 说明 |
|---|---|
| 新的或现有群集部署运行受支持版本的 Azure 标识客户端库 | 无需执行迁移步骤。 示例部署资源: 在新群集上部署和配置 Microsoft Entra 工作负荷 ID |
| 新的或现有群集部署运行不受支持版本的 Azure 标识客户端库 | 更新容器映像以使用受支持版本的 Azure 标识 SDK,或使用迁移挎斗。 |
后续步骤
- 若要了解如何设置 Pod 以使用工作负荷标识作为迁移选项进行身份验证,请参阅 使用 Microsoft Entra 工作负荷 ID 实现应用程序身份验证的现代化。
- 请参阅 部署和配置具有 Microsoft Entra 工作负荷 ID 的 AKS 群集,这有助于部署群集并配置示例应用程序以使用工作负荷标识。