我正在尝试在Ubuntu VM上运行Azure批处理任务,其中包含从私有Azure容器注册表中提取的映像。无论是否预取,池中的节点在创建时失败,并出现以下错误:
Code: NodePreparationError
Message:
An error occurred during node preparation
Values:
Error - Hit unexpected error installing containers
Message - 400, message='Bad Request', url=URL('http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/&mi_res_id=/subscriptions/7bd2fd6e-1cb6-4db2-82fe-67c7ea3024cd/resourceGroups/SANDBOX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/my_uami')
基线:我有一个带有资源组的Azure订阅。资源组中
- a Container Registry,
- 批处理帐户和
- 用户分配的受管身份。
UAMI是在容器注册表和批处理帐户的标识刀片中分配的。管理员已经为我的订阅分配了AcrPull
角色。
我可以将图像拉到我的本地机器上,因此我知道它存在。我尝试在从Docker Hub预取的python3.7-slim
映像上运行一个简单的任务并成功,因此问题介于Batch和ACR之间。
下面是演示这个问题的最小示例:
from azure.batch import BatchServiceClient
from azure.batch.batch_auth import SharedKeyCredentials
from azure.batch.models import (
ComputeNodeIdentityReference,
ContainerConfiguration,
ContainerRegistry,
ImageReference,
JobAddParameter,
PoolAddParameter,
PoolInformation,
VirtualMachineConfiguration,
)
if __name__ == '__main__':
batch_service_client = BatchServiceClient(
SharedKeyCredentials('batchtest2021', 'GZTn…………………………………pGJ+gNE…………………………dvw=='),
batch_url='https://batchtest2021.westeurope.batch.azure.com/',
)
pool_id = 'my_test_pool'
new_pool = PoolAddParameter(
id=pool_id,
virtual_machine_configuration=VirtualMachineConfiguration(
container_configuration=ContainerConfiguration(
container_image_names=[
'myprivateacr.azurecr.io/mydockerimage:latest',
],
container_registries=[
ContainerRegistry(
registry_server='myprivateacr.azurecr.io',
identity_reference=ComputeNodeIdentityReference(
resource_id=f'/subscriptions/7bd2fd6e-1cb6-4db2-82fe-67c7ea3024cd/resourceGroups/SANDBOX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/my_uami'
),
),
],
),
image_reference=ImageReference(
publisher='microsoft-azure-batch',
offer='ubuntu-server-container',
sku='20-04-lts',
version='latest',
),
node_agent_sku_id='batch.node.ubuntu 20.04',
),
vm_size='STANDARD_A2M_V2',
target_dedicated_nodes=2,
)
batch_service_client.pool.add(new_pool)
job = JobAddParameter(id='sample_job_id', pool_info=PoolInformation(pool_id=pool_id))
batch_service_client.job.add(job)
该代码基于批处理Python快速入门示例和批处理文档。
我已经尝试了故障排除注册表登录指南中的各种步骤,但没有效果。我通过Azure Shell登录到ACR没有问题,但那是我的普通用户,当然不是UAMI。
guid已被更改,以保护无辜。
想买吗?
当为池使用托管身份时,您必须将身份添加到池本身,在帐户上设置身份允许批处理服务本身使用该身份,而不是池中的vm。请注意,您实际上不需要在用例(Azure Container Registry)中设置帐户的标识,只需要设置池。
请参阅文档为池分配身份:
https://learn.microsoft.com/azure/batch/managed-identity-pools