You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨Azure AD租户:配置AKS托管身份访问ACR的最佳方案

跨租户AKS托管身份访问ACR的实现方案

核心最优方案:Azure AD B2B协作 + ACR RBAC授权

通过B2B协作将租户B的AKS托管身份纳入租户A的身份体系,再通过RBAC授予最小权限的镜像拉取权限,全程基于Azure原生身份机制,无需管理额外密钥,安全性和可维护性最高。

分步实施步骤

1. 采集租户B中AKS托管身份信息

先确认AKS使用的托管身份(系统分配/用户分配均可,以下以系统分配为例),执行Azure CLI命令获取关键信息:

# 获取AKS系统托管身份的对象ID
az aks show --resource-group <租户B的AKS资源组名> --name <AKS集群名> --query "identity.principalId" -o tsv
# 获取租户B的租户ID
az account show --query tenantId -o tsv

记录输出的principalId和租户B的tenantId。

2. 在租户A中创建B2B外部身份邀请

切换到租户A的Azure CLI上下文,将租户B的AKS托管身份作为外部主体邀请到租户A:

az account set --subscription <租户A的订阅ID>

# 创建B2B邀请(托管身份属于服务主体类型,需指定Guest类型)
az ad invitation create \
  --invited-user-id <步骤1获取的principalId> \
  --invited-user-display-name "AKS跨租户ACR访问身份" \
  --invited-user-type Guest \
  --redirect-url "https://azure.microsoft.com" \
  --send-invitation-message false

执行成功后,租户B的托管身份将以外部用户身份出现在租户A的Azure AD中。

3. 给租户A的ACR分配镜像拉取权限

为刚添加的外部身份授予AcrPull权限(拉取镜像的最小必要权限):

az role assignment create \
  --assignee <步骤1获取的principalId> \
  --role "AcrPull" \
  --scope "/subscriptions/<租户A的订阅ID>/resourceGroups/<租户A的ACR资源组名>/providers/Microsoft.ContainerRegistry/registries/<ACR名称>"

4. 配置AKS使用托管身份拉取镜像(推荐用CSI驱动)

针对AKS 1.24及以上版本,推荐使用ACR CSI驱动实现无密钥、自动令牌刷新的镜像拉取:

步骤4.1 启用ACR CSI驱动
az aks enable-addons --resource-group <租户B的AKS资源组名> --name <AKS集群名> --addons acr-credential-provider
步骤4.2 创建CSI SecretProviderClass和Deployment
# SecretProviderClass配置,用于自动获取ACR访问令牌
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: acr-csi-secret
spec:
  provider: azure
  parameters:
    useVMManagedIdentity: "true"
    userAssignedIdentityID: <步骤1获取的principalId> # 系统分配托管身份填此值,用户分配则填对应ID
    tenantId: <租户A的租户ID>
    objects: |
      array:
      - |
        objectName: acr-pull-token
        objectType: secret
        objectAlias: .dockerconfigjson
    subscriptionId: <租户A的订阅ID>
    resourceGroup: <租户A的ACR资源组名>
  secretObjects:
  - data:
    - key: .dockerconfigjson
      objectName: acr-pull-token
    secretName: acr-csi-secret
    type: kubernetes.io/dockerconfigjson
---
# 测试Deployment,使用CSI拉取镜像
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-acr-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test
  template:
    metadata:
      labels:
        app: test
    spec:
      containers:
      - name: test-container
        image: <租户A的ACR登录服务器>/<镜像名>:<版本>
      imagePullSecrets:
      - name: acr-csi-secret

将上述YAML文件应用到AKS集群:

kubectl apply -f acr-csi-config.yaml

5. 验证配置有效性

检查测试Pod的运行状态:

kubectl get pods -l app=test

如果Pod状态为Running,说明跨租户镜像拉取配置成功。

备选方案:租户A服务主体+AKS镜像拉取秘密

若B2B协作存在限制,可在租户A创建专用服务主体,授予AcrPull权限,然后在租户B的AKS中使用该服务主体的密钥创建镜像拉取秘密。此方案需手动管理密钥生命周期,安全性低于托管身份方案,仅作备选。


内容的提问来源于stack exchange,提问作者user23413046

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:13:20