你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure Arc-enabled Kubernetes(预览版)中部署和配置工作负载联合身份验证

可以使用 Azure CLI 在 Azure Arc-enabled Kubernetes 群集上启用工作负载标识功能。 此过程遵循以下高级步骤:

  1. 在新的或现有的 Arc-enabled Kubernetes 群集上启用工作负载标识功能。
  2. 创建托管标识(或应用注册)和 Kubernetes 服务帐户。
  3. 为令牌联合配置托管标识。
  4. 配置服务帐户批注和应用程序 Pod 标签以使用工作负载标识。
  5. 在 Kubernetes 群集上配置工作负载标识设置。
  6. 在群集上禁用工作负载标识。

有关此功能的概述,请参阅已启用 Azure Arc 的 Kubernetes(预览版)中的工作负载联合身份验证

重要

Azure Arc 工作负载联合身份验证功能目前处于预览状态。 有关 beta 版本、预览版或尚未正式发布的版本的 Azure 功能所适用的法律条款,请参阅 Microsoft Azure 预览版的补充使用条款

提示

本文介绍在已启用 Arc 的 Kubernetes 群集上部署和配置工作负载标识所需的步骤。 要了解如何在其他类型的群集上启用工作负载标识,请参阅以下文章:

先决条件

  • 以下 Kubernetes 分发版支持 Azure Arc-enabled Kubernetes 群集(预览版)的工作负载标识:
    • 运行 K3s 的 Ubuntu Linux 群集
    • 边缘软件包上的 AKS
    • HCI 23H2 上的 AKS

若要使用工作负载标识功能,必须具有 Azure CLI 2.64 或更高版本以及 az connectedk8s 版本 1.10.0 或更高版本。 在更新 az connectedk8s 版本之前,请务必更新 Azure CLI 版本。 如果使用 Azure Cloud Shell,则将安装最新版本的 Azure CLI。

在群集上启用工作负载标识

按照相应步骤为新的或现有的 Arc-enabled Kubernetes 群集启用工作负载标识功能。 在这两种情况下,请确保将名称和资源组替换为你的值,并根据需要配置参数。

参数 步骤 必须
--enable-oidc-issuer 生成并托管 OIDC 颁发者 URL,这是一个可公开访问的 URL,它允许 API 服务器查找用于验证令牌的公共签名密钥。  必须
--enable-workload-identity 安装一个可变准入 Webhook,它将已签名的服务帐户令牌投影到已知路径,并根据带批注的服务帐户设置将与身份验证相关的环境变量注入到应用程序 Pod。 对于新群集,如果未启用此参数,则必须在向路径公开已签名服务帐户令牌的已知路径上装载投影卷。 可选

设置环境变量

为方便起见,本文中的示例引用了下面定义的环境变量。 将以下值替换为你自己的值:

export RESOURCE_GROUP="myRG"
export LOCATION="eastus"
export CLUSTER_NAME="mycluster"
export SERVICE_ACCOUNT_NAMESPACE="myKubernetesnamespace"
export SERVICE_ACCOUNT_NAME="mysa"
export SUBSCRIPTION="$(az account show --query id --output tsv)"
export USER_ASSIGNED_IDENTITY_NAME="myIdentity"
export FEDERATED_IDENTITY_CREDENTIAL_NAME="myFedIdentity"

若要创建启用了工作负载标识的 Azure Arc-enabled 群集,请使用以下命令:

az connectedk8s connect --name "${CLUSTER_NAME}" --resource-group "${RESOURCE_GROUP}" --enable-oidc-issuer –-enable-workload-identity

若要在现有的 Arc-enabled Kubernetes 群集上启用工作负载标识,请使用 update 命令。

az connectedk8s update --name "${CLUSTER_NAME}" --resource-group "${RESOURCE_GROUP}" --enable-oidc-issuer --enable-workload-identity

检索 OIDC 颁发者 URL

获取 OIDC 颁发者 URL 并将其保存到环境变量中。 在后续步骤中将要使用此颁发者 URL。

export OIDC_ISSUER="$(az connectk8s show --name "${CLUSTER_NAME}" --resource-group "${RESOURCE_GROUP}" \ 
    --query "oidcIssuerProfile.issuerUrl" \  
    --output tsv)"

若要查看环境变量,请输入 echo ${OIDC_ISSUER}。 环境变量应包含类似于以下示例的证书颁发者 URL:

https://northamerica.oic.prod-arc.azure.com/00000000-0000-0000-0000-000000000000/12345678-1234-1234-1234-123456789123/

默认情况下,颁发者设置为使用基 URL https://{region}.oic.prod-arc.azure.com/{tenant_id}/{uuid},其中 {region} 的值与创建 Arc-enabled Kubernetes 群集的位置相匹配。 值 {uuid} 表示 OpenID Connect (OIDC) 密钥,它是为每个群集随机生成的不可变的 guid。

创建托管标识

使用 az identity create 命令创建用户分配的托管标识。 使用工作负载标识时,将在用户分配的管理标识令牌与 Kubernetes 群集的服务帐户令牌之间建立信任关系。

az identity create \ 
    --name "${USER_ASSIGNED_IDENTITY_NAME}" \
    --resource-group "${RESOURCE_GROUP}" \
    --location "${LOCATION}" \
    --subscription "${SUBSCRIPTION}"

提取托管标识的客户端 ID,并将其存储在环境变量中。

export USER_ASSIGNED_CLIENT_ID="$(az identity show \ 
    --resource-group "${RESOURCE_GROUP}" \
    --name "${USER_ASSIGNED_IDENTITY_NAME}" \
    --query 'clientId' \
    --output tsv)"

创建 Kubernetes 服务帐户

创建一个 Kubernetes 服务帐户,并使用在上一步创建的托管标识的客户端 ID 对其进行批注。 与 Kubernetes 服务帐户关联的已签名令牌将在两者之间建立信任关系之后交换 Microsoft Entra ID 令牌。

应用以下 YAML 代码片段以创建添加了工作负载标识批注的服务帐户。

apiVersion: v1 
kind: ServiceAccount 
metadata: 
  annotations: 
    azure.workload.identity/client-id: "${USER_ASSIGNED_CLIENT_ID}" 
  name: "${SERVICE_ACCOUNT_NAME}" 
  namespace: "${SERVICE_ACCOUNT_NAMESPACE}" 

创建联合标识凭据

使用 az identity federated-credential create 命令在托管标识、服务帐户颁发者和使用者之间创建联合标识凭据。 此步骤用于在 Kubernetes 群集和 Microsoft Entra 之间建立信任关系,以交换令牌。 有关 Microsoft Entra 中联合标识凭据的详细信息,请参阅 Microsoft Entra ID 中的联合标识凭据概述

az identity federated-credential create \ 
    --name ${FEDERATED_IDENTITY_CREDENTIAL_NAME} \ 
    --identity-name "${USER_ASSIGNED_IDENTITY_NAME}" \ 
    --resource-group "${RESOURCE_GROUP}" \ 
    --issuer "${OIDC_ISSUER}" \ 
    --subject system:serviceaccount:"${SERVICE_ACCOUNT_NAMESPACE}":"${SERVICE_ACCOUNT_NAME}" \ 
    --audience api://AzureADTokenExchange 

注意

添加联合标识凭据后,传播需要几秒钟时间。 如果在添加联合标识凭据后立即发出令牌请求,则在刷新缓存之前,请求可能会失败。 若要避免此问题,可以在添加联合标识凭据后,在脚本中添加轻微的延迟。

配置服务帐户批注和 Pod 标签

以下服务帐户和 Pod 批注可用于根据应用程序要求配置工作负载标识。 如果 –-enable-workload-identity 设置为 true,则下面指定的 Pod 标签是必需的。

服务帐户批注

所有服务帐户批注都是可选的。 如果未指定批注,则将使用默认值。

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

Pod 标签

注释 说明 建议的值 必须
azure.workload.identity/use Pod 模板规格中需要使用此标签。如果 –-enable-workload-identity 设置为 true,则只有带有此标签的 Pod 才会由可变准入 Webhook 进行更改,以注入 Azure 特定环境变量和投影的服务帐户令牌卷。 true

Pod 批注

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

注释 说明 默认
azure.workload.identity/service-account-token-expiration 投影的服务帐户令牌的 expirationSeconds 字段。 配置它以防止在服务帐户令牌刷新期间因出错而导致停机。 Kubernetes 服务帐户令牌过期时间与 Microsoft Entra 令牌无关。 Microsoft Entra 令牌将在颁发后的 24 小时过期。 3600(支持的范围为 3600-86400)
azure.workload.identity/skip-containers 表示要跳过添加已投影服务帐户令牌卷步骤的容器的分号分隔列表。 例如:container1;container2 默认情况下,如果 Pod 带有 azure.workload.identity/use: true 标签,则投影的服务帐户令牌卷将添加到所有容器。

在 Kubernetes 群集上配置工作负载标识设置。

Kubernetes 群集上的 API 服务器需要配置为发布服务帐户令牌,其中包括可公开访问的 OIDC 颁发者 URL(以便 Entra 知道在何处查找用于验证令牌的公钥)。

若要在具有 K3s 的 Ubuntu Linux 上配置工作负载标识设置,请执行以下步骤来完成配置:

  1. 创建 k3s 配置文件。

  2. 编辑 /etc/rancher/k3s/config.yaml 以添加以下设置:

       `kube-apiserver-arg:  
         - 'service-account-issuer=${OIDC_ISSUER}'
         - 'service-account-max-token-expiration=24h'`
    
  3. 保存 config.yaml。

  4. 使用命令 systemctl restart k3s 重启 k3s API 服务器。

    建议经常轮换服务帐户密钥。 有关详细信息,请参阅服务帐户颁发者密钥轮换

禁用工作负载标识

若要在 Azure Arc-enabled Kubernetes 群集上禁用工作负载标识功能,请运行以下命令:

az connectedk8s update
    --resource-group "${RESOURCE_GROUP}"
    --name "${CLUSTER_NAME}"
    --disable-workload-identity

后续步骤