ACR设置为仅选定网络访问后ACI无法拉取镜像如何解决
ACI无法从限制公网访问的ACR拉取镜像解决方法
报错信息
Failed to pull image "<acrname>.azurecr.io/<imagae-name>:02b6d84d635c3d9ff4182ad1c50d16364695d3d5": rpc error: code Unknown desc Error response from daemon: Head "https://<acrname>.azurecr.io/v2/<image-name>/manifests/02b6d84d635c3d9ff4182ad1c50d16364695d3d5": denied: client with IP 'x.x.x.x' is not allowed access.
问题原因
你把ACR配置为仅允许选定网络访问后,默认会拒绝所有不在白名单内的来源请求。报错里提到的x.x.x.x就是ACI拉取镜像时的出口IP,这个IP没被加入ACR的访问允许列表,所以请求直接被ACR防火墙拦截。
解决方案
根据实际网络架构选对应方案即可:
- 临时应急方案:添加IP白名单
- 直接从报错信息里提取被拦截的IP
x.x.x.x - 进入ACR的网络防火墙配置页,在公网IP白名单栏添加这个IP,保存后等1-2分钟生效就能正常拉取
注意:如果ACI没部署在带固定出口IP的虚拟网络里,后续ACI重启、更新实例时出口IP可能变动,会再次出现拉取失败的问题,这个方案别在生产环境长期用。
- 直接从报错信息里提取被拦截的IP
- 生产推荐方案1:通过虚拟网络服务端点打通
- 给部署ACI的子网开启
Microsoft.ContainerRegistry服务端点,开启后这个子网访问ACR的流量会走Azure内网主干,不经过公网 - 回到ACR的网络配置页,在虚拟网络允许列表里添加刚才开了服务端点的虚拟网络和对应子网
- 确认子网没有配置强制隧道把流量导去第三方防火墙、NVA设备,不然会导致服务端点路由失效。
- 给部署ACI的子网开启
- 生产推荐方案2:通过私有终结点走纯内网访问
- 给ACR创建私有终结点,绑定到ACI所在的虚拟网络,分配内网IP
- 配置虚拟网络的私有DNS区域,保证ACR的登录域名能正确解析到私有终结点的内网IP
- 把ACI部署到同虚拟网(或者已经做了对等互联、专线打通的虚拟网)的专用子网里,拉镜像的流量全程走内网,完全不经过公网,安全性最高。
避坑提醒
别靠开启「允许受信任的Azure服务访问该容器注册表」选项解决问题,ACI不在ACR默认的受信任服务列表里,开了这个选项也不会放通ACI的访问请求。
内容的提问来源于stack exchange,提问作者romanzdk
相关产品推荐
相关产品推荐

