跨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
相关产品推荐
相关产品推荐

