Azure ML v2 SDK部署K8s在线端点遇RefreshExtensionIdentityNotSet错误
解决Azure ML v2 SDK部署到AKS时的RefreshExtensionIdentityNotSet错误
问题背景
使用Azure Machine Learning v2 SDK将模型部署到附加至AML工作区的Kubernetes计算资源时,本地测试部署正常,但执行KubernetesOnlineDeployment在线部署时触发以下错误:
DeploymentIdentityError: Failed to create Kubernetes deployment identity, Reason:RefreshExtensionIdentityNotSet Details:Managed identity of AzureML extension is not assigned to the node pool of 'aks-default-XXXXXXXX-vmss000000'. The identity is used to give access for user container, such as pull image from ACR.
用户通过Terraform创建AKS集群,参考官方教程附加集群时添加了identity配置(类型为SystemAssigned),已尝试重新安装AzureML扩展但问题未解决。
相关代码
附加集群的代码:
compute = "testfooamlXXXX-c" from azure.ai.ml import load_compute compute_params = [ {"name": compute}, {"type": "kubernetes"}, { "resource_id": "/subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/resourceGroups/test-foo-aml/providers/Microsoft.ContainerService/managedClusters/testfooamlXXXX", }, {"identity": {"type":"SystemAssigned"}}, ] k8s_compute = load_compute(source=None, params_override=compute_params)
创建端点与部署的代码:
# 创建端点 endpoint = KubernetesOnlineEndpoint( name=endpoint_name, compute=compute, description="this is a sample online endpoint", auth_mode="key", tags={"foo": "bar"}, ) ml_client.begin_create_or_update(endpoint).result() # 创建部署对象 blue_deployment = KubernetesOnlineDeployment( name="blue", endpoint_name=endpoint_name, model=Model(path=str(model_path)), environment=Environment(name=env_name, version=env_version), code_configuration=CodeConfiguration( code=str(model_script_path.parent), scoring_script=model_script_path.name ), instance_count=1, ) # 触发错误的执行代码 ml_client.begin_create_or_update(blue_deployment).result()
排查方向
- 确认AKS节点池的托管标识是否已正确配置,且拥有访问镜像仓库(如ACR)的权限
- 检查AzureML扩展的托管标识是否与AKS节点池的VMSS关联
- 验证附加集群时的
identity配置是否生效,对应的标识是否具备AML工作区相关操作权限
解决方案
1. 配置AKS节点池的托管标识权限
- 如果节点池使用系统分配托管标识:为该标识分配ACR的
ACR Pull角色,确保其能够拉取部署所需的镜像 - 如果使用用户分配托管标识:确认创建AKS集群时已指定该标识,且该标识同样拥有ACR访问权限
2. 重新安装AzureML扩展并指定正确标识
先卸载现有扩展:
az k8s-extension delete --name azureml-fe --cluster-type managedClusters --cluster-name <你的AKS集群名> --resource-group <资源组名>
重新安装扩展,根据标识类型选择对应命令:
- 系统分配标识:
az k8s-extension create --name azureml-fe --cluster-type managedClusters --cluster-name <你的AKS集群名> --resource-group <资源组名> --extension-type Microsoft.AzureML.Kubernetes --scope cluster --configuration-settings enableInference=true --identity-type SystemAssigned
- 用户分配标识:
az k8s-extension create --name azureml-fe --cluster-type managedClusters --cluster-name <你的AKS集群名> --resource-group <资源组名> --extension-type Microsoft.AzureML.Kubernetes --scope cluster --configuration-settings enableInference=true --identity-type UserAssigned --identity-resource-id <用户分配标识的资源ID>
3. 重新附加AKS集群到AML工作区
- 删除已附加的Kubernetes计算资源:
ml_client.compute.begin_delete(compute).result()
- 等待扩展安装完成后,重新执行附加集群的代码,确保
identity配置正确
4. 验证部署资源的访问权限
- 确认部署使用的环境镜像所在ACR允许AKS节点池的标识访问
- 如果模型存储在Blob存储等位置,确保该标识拥有读取模型文件的权限
内容的提问来源于stack exchange,提问作者Rishabh Prajapati
相关产品推荐
相关产品推荐

