Azure Batch拉取ACR私有镜像触发NodePreparationError错误求助
问题根因
你遇到的400 Bad Request错误是Batch计算节点尝试通过Azure实例元数据服务获取指定用户分配托管标识(UAMI)的访问令牌时请求无效,核心原因是没有将UAMI关联到Batch池的计算节点上,仅在容器注册表配置中声明UAMI引用、给Batch账户分配UAMI均无法让节点获得该标识的使用权。
修复步骤
第一步:补充池的UAMI关联配置
你当前的代码仅在容器注册表参数中填写了identity_reference,缺少将UAMI挂载到计算节点的配置,需要按如下修改:- 新增模型导入:
from azure.batch.models import PoolIdentity, UserAssignedIdentity - 在
PoolAddParameter中新增identity参数:new_pool = PoolAddParameter( id=pool_id, # 新增以下identity配置 identity=PoolIdentity( type="UserAssigned", user_assigned_identities={ "/subscriptions/7bd2fd6e-1cb6-4db2-82fe-67c7ea3024cd/resourceGroups/SANDBOX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/my_uami": UserAssignedIdentity() } ), virtual_machine_configuration=VirtualMachineConfiguration( # 原有其他配置保持不变 ), # 原有其他参数保持不变 )
- 新增模型导入:
第二步:核对基础配置正确性
- 确认代码中填写的UAMI资源ID完全匹配实际创建的UAMI的资源ID,无拼写、大小写、订阅/资源组名称错误。
- 如果你的Batch池使用自定义虚拟网络,检查子网关联的网络安全组(NSG)是否放行了到
169.254.169.254端口80的出站流量,该地址是Azure实例元数据服务的本地地址,封禁会直接导致令牌获取失败。 - 确认UAMI的
AcrPull角色权限分配在目标私有ACR的资源级别,没有被权限边界、Azure Policy拦截生效。
修改完成后重新创建池即可解决节点预配失败问题。
内容的提问来源于stack exchange,提问作者kthy
相关产品推荐
相关产品推荐

