Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
通过将虚拟网络专用 IP 地址分配给注册表终结点并使用 Azure Private Link 来限制对注册表的访问。 虚拟网络上的客户端与注册表的私有终结点之间的网络流量通过虚拟网络和 Microsoft Azure 主干网络上的私有链接传输,从而避免暴露于公共 Internet。 Private Link还允许通过 Azure ExpressRoute、专用对等互连或 VPN 网关从本地进行专用注册表访问。
可以为注册表的专用终结点 配置 DNS 设置 ,以便设置解析为注册表分配的专用 IP 地址。 使用 DNS 配置时,网络中的客户端和服务可以继续按注册表的完全限定域名(如 myregistry.azurecr.cn)来访问注册表。
本文介绍如何使用 Azure 门户(推荐)或 Azure CLI(命令行界面)为注册表配置专用终结点。 此功能在 高级容器注册表服务层级(SKU)中可用,最多有 200 个专用终结点。
重要
如果容器注册表限制对专用终结点、所选子网或 IP 地址的访问,则某些功能可能不可用或需要更多配置。
- 禁用对注册表的公共网络访问时,某些受信任的服务(包括 Microsoft Defender for Cloud)仅当启用网络设置以绕过网络规则时,才能访问注册表。
- 禁用公用网络访问后,某些Azure服务的实例(包括Azure DevOps服务)无法访问容器注册表。
- Azure DevOps管理的代理目前不支持专用终结点。 需要使用自托管代理与专用终结点建立网络路径。
- 如果注册表具有批准的专用终结点并禁用公共网络访问,则无法使用Azure门户、Azure CLI或其他工具列出虚拟网络外部的存储库和标记。
先决条件
在虚拟网络和子网中进行专用终结点的设置。 如果需要,可创建新虚拟网络和子网。
为了进行测试,建议在虚拟网络中设置 VM。
若要使用本文中的Azure CLI步骤,建议Azure CLI版本 2.6.0 或更高版本。 若要安装或升级,请参阅 Install Azure CLI。
如果您还没有一个高级容器注册表,请创建一个,然后从 Azure Container Registry 导入一个公共示例镜像,例如
mcr.microsoft.com/hello-world。 例如,使用 Azure 门户或 Azure CLI 创建注册表。
注册容器注册表资源提供程序
若要使用不同的Azure订阅或租户中的专用链接配置注册表访问,需要注册该订阅中的Azure Container Registry的资源提供程序。 使用Azure门户、Azure CLI或其他工具。
示例:
az account set --subscription <Name or ID of subscription of private link>
az provider register --namespace Microsoft.ContainerRegistry
在 Azure 门户中设置专用终结点
在创建注册表时设置专用终结点,或向现有注册表添加专用终结点。
在新注册表中创建专用终结点
在门户中创建注册表时,在“基本信息”选项卡上,选择“高级定价计划”。
在“网络”选项卡中,对于“连接”配置,选择“专用访问”(建议)。
选择“ 创建专用终结点连接”。
输入或选择以下信息:
设置 值 订阅 选择订阅。 资源组 输入现有组名称或创建一个新组。 名称 输入唯一名称。 注册表子资源 确保选中 注册表 。 虚拟网络 选择专用终结点的虚拟网络。 示例:myDockerVMVNET。 子网 选择专用终结点的子网。 示例:myDockerVMSubnet。 与专用 DNS 区域集成 选择 “是”。 Private DNS 区域 选择“(新) privatelink.azurecr.cn”
选择“确定”。
配置其余注册表设置,然后选择“查看 + 创建”。 注册表是使用专用终结点创建的。
为现有注册表创建专用终结点
- 在 "Azure" 门户中转到你的容器注册表。
- 在服务菜单中的“设置”下,选择“网络”。
- 在 “专用访问 ”选项卡上,选择“ 创建专用终结点连接”。
- 在“ 基本信息 ”选项卡中,选择订阅、资源组和区域,然后输入专用终结点的名称。 网络接口名称是使用终结点名称创建的。
- 选择 “下一步:资源”。 专用终结点用于注册表资源,因此会预先选择资源类型和子资源。 然后选择 Next: Virtual Network。
- 选择专用终结点的虚拟网络和子网。 不要更改其他选项,然后选择“ 下一步:DNS”。
- 确保 “与专用 DNS 区域集成 ”设置为 “是”,并将专用 DNS 区域设置为 “新建”privatelink.azurecr.cn。 选择 “下一步:标记 ”并添加任何所需标记,然后选择“ 下一步:查看 + 创建”。
- 看到 “验证传递 ”消息时,选择“ 创建”。
确认终结点配置
创建专用终结点后,门户中的 专用终结点 设置会显示 DNS 设置。 步骤 1:确认:
- 在容器注册表的服务菜单中的 “设置”下,选择“ 网络”。
- 在 “专用访问 ”选项卡上,选择创建的专用终结点的名称。
- 在服务菜单中的 “设置”下,选择 DNS 配置。
- 查看专用链接的 DNS 配置的详细信息。
使用Azure CLI设置专用终结点
本文中的Azure CLI示例针对 Bash shell 进行了格式设置,并使用以下环境变量。 将示例值替换为现有容器注册表、虚拟网络和子网的名称以设置专用终结点。
REGISTRY_NAME=<container-registry-name>
REGISTRY_LOCATION=<container-registry-location> # Azure region such as chinanorth2 where registry created
RESOURCE_GROUP=<resource-group-name> # Resource group for your existing virtual network and subnet
NETWORK_NAME=<virtual-network-name>
SUBNET_NAME=<subnet-name>
在子网中禁用网络策略
禁用网络策略,如用于专用终结点的子网中的网络安全组。 使用 az network vnet subnet update 更新您的子网配置:
az network vnet subnet update \
--name $SUBNET_NAME \
--vnet-name $NETWORK_NAME \
--resource-group $RESOURCE_GROUP \
--disable-private-endpoint-network-policies
配置专用 DNS 区域
为专用Azure容器注册表域创建 private Azure DNS 区域。 在后续步骤中,你将在此 DNS 区域中为你的注册表域创建 DNS 记录。 有关详细信息,请参阅本文后面的 DNS 配置选项。
若要使用专用区域替代Azure容器注册表的默认 DNS 解析,请将区域命名为 privatelink.azurecr.cn。 运行以下 az network private-dns zone create 命令以创建专用区域:
az network private-dns zone create \
--resource-group $RESOURCE_GROUP \
--name "privatelink.azurecr.cn"
创建关联链接
运行 az network private-dns link vnet create 以将专用区域与虚拟网络相关联。 此示例创建名为 myDNSLink 的链接。
az network private-dns link vnet create \
--resource-group $RESOURCE_GROUP \
--zone-name "privatelink.azurecr.cn" \
--name MyDNSLink \
--virtual-network $NETWORK_NAME \
--registration-enabled false
创建专用注册表终结点
在此部分中,将在虚拟网络中创建注册表的专用终结点。 首先,获取注册表的资源 ID:
REGISTRY_ID=$(az acr show --name $REGISTRY_NAME \
--query 'id' --output tsv)
运行 az network private-endpoint create 命令以创建注册表的专用终结点。
下面的示例创建终结点 myPrivateEndpoint 和服务连接 myConnection。 若要为终结点指定容器注册表资源,请传递 --group-ids registry:
az network private-endpoint create \
--name myPrivateEndpoint \
--resource-group $RESOURCE_GROUP \
--vnet-name $NETWORK_NAME \
--subnet $SUBNET_NAME \
--private-connection-resource-id $REGISTRY_ID \
--group-ids registry \
--connection-name myConnection
获取端点 IP 配置
若要配置 DNS 记录,请获取专用终结点的 IP 配置。 在此示例中,专用终结点的网络接口连接到容器注册表的两个专用 IP 地址:一个用于注册表本身,一个用于注册表的数据终结点。 如果注册表是异地复制的,则每个副本都有一个额外的 IP 地址。
首先,运行 az network private-endpoint show 以查询网络接口 ID 的专用终结点:
NETWORK_INTERFACE_ID=$(az network private-endpoint show \
--name myPrivateEndpoint \
--resource-group $RESOURCE_GROUP \
--query 'networkInterfaces[0].id' \
--output tsv)
以下 az network nic show 命令获取容器注册表和注册表数据终结点的专用 IP 地址和 FQDN:
REGISTRY_PRIVATE_IP=$(az network nic show \
--ids $NETWORK_INTERFACE_ID \
--query "ipConfigurations[?privateLinkConnectionProperties.requiredMemberName=='registry'].privateIPAddress" \
--output tsv)
DATA_ENDPOINT_PRIVATE_IP=$(az network nic show \
--ids $NETWORK_INTERFACE_ID \
--query "ipConfigurations[?privateLinkConnectionProperties.requiredMemberName=='registry_data_$REGISTRY_LOCATION'].privateIPAddress" \
--output tsv)
# An FQDN is associated with each IP address in the IP configurations
REGISTRY_FQDN=$(az network nic show \
--ids $NETWORK_INTERFACE_ID \
--query "ipConfigurations[?privateLinkConnectionProperties.requiredMemberName=='registry'].privateLinkConnectionProperties.fqdns" \
--output tsv)
DATA_ENDPOINT_FQDN=$(az network nic show \
--ids $NETWORK_INTERFACE_ID \
--query "ipConfigurations[?privateLinkConnectionProperties.requiredMemberName=='registry_data_$REGISTRY_LOCATION'].privateLinkConnectionProperties.fqdns" \
--output tsv)
异地副本的附加终结点
如果注册表是异地复制,请查询每个注册表副本的附加数据终结点。 例如,在 chinaeast2 区域:
REPLICA_LOCATION=chinaeast2
GEO_REPLICA_DATA_ENDPOINT_PRIVATE_IP=$(az network nic show \
--ids $NETWORK_INTERFACE_ID \
--query "ipConfigurations[?privateLinkConnectionProperties.requiredMemberName=='registry_data_$REPLICA_LOCATION'].privateIPAddress" \
--output tsv)
GEO_REPLICA_DATA_ENDPOINT_FQDN=$(az network nic show \
--ids $NETWORK_INTERFACE_ID \
--query "ipConfigurations[?privateLinkConnectionProperties.requiredMemberName=='registry_data_$REPLICA_LOCATION'].privateLinkConnectionProperties.fqdns" \
--output tsv)
当您添加新异地复制时,专用终结点连接正在等待激活。 若要批准手动配置的专用终结点连接,请运行命令 az acr private-endpoint-connection approve。
在专用区域中创建 DNS 记录
以下命令在专用区域中为注册表终结点及其数据终结点创建 DNS 记录。 例如,如果在 chinaeast2 区域中有一个名为 myregistry 的注册表,则终结点名称是 和 。
首先,运行 az network private-dns record-set a create ,为注册表终结点和数据终结点创建空的 A 记录集:
az network private-dns record-set a create \
--name $REGISTRY_NAME \
--zone-name privatelink.azurecr.cn \
--resource-group $RESOURCE_GROUP
# Specify registry region in data endpoint name
az network private-dns record-set a create \
--name ${REGISTRY_NAME}.${REGISTRY_LOCATION}.data \
--zone-name privatelink.azurecr.cn \
--resource-group $RESOURCE_GROUP
运行 az network private-dns record-set a add-record 命令,为注册表终结点和数据终结点创建 A 记录:
az network private-dns record-set a add-record \
--record-set-name $REGISTRY_NAME \
--zone-name privatelink.azurecr.cn \
--resource-group $RESOURCE_GROUP \
--ipv4-address $REGISTRY_PRIVATE_IP
# Specify registry region in data endpoint name
az network private-dns record-set a add-record \
--record-set-name ${REGISTRY_NAME}.${REGISTRY_LOCATION}.data \
--zone-name privatelink.azurecr.cn \
--resource-group $RESOURCE_GROUP \
--ipv4-address $DATA_ENDPOINT_PRIVATE_IP
异地副本的附加记录
如果注册表是异地复制的,请为每个副本创建附加 DNS 设置。 继续在 chinaeast2 区域中的示例:
az network private-dns record-set a create \
--name ${REGISTRY_NAME}.${REPLICA_LOCATION}.data \
--zone-name privatelink.azurecr.cn \
--resource-group $RESOURCE_GROUP
az network private-dns record-set a add-record \
--record-set-name ${REGISTRY_NAME}.${REPLICA_LOCATION}.data \
--zone-name privatelink.azurecr.cn \
--resource-group $RESOURCE_GROUP \
--ipv4-address $GEO_REPLICA_DATA_ENDPOINT_PRIVATE_IP
专用链接现已配置,可供使用。
禁用对注册表的公共访问
在许多情况下,禁用从公用网络进行的注册表访问。 此配置可防止虚拟网络外部的所有客户端访问注册表终结点。
若要在 Azure 门户中禁用对容器注册表的公共访问,请执行以下步骤:
- 在容器注册表的服务菜单中的 “设置”下,选择“ 网络”。
- 在 “公共访问 ”选项卡上的 “公用网络访问”中,选择“ 已禁用”。 然后,选择“保存”。
还可以使用Azure CLI通过运行 az acr update 禁用公共访问,并将 --public-network-enabled 设置为 false。
注意
如果禁用对注册表的公共访问, az acr build 则命令不再有效。
az acr update --name $REGISTRY_NAME --public-network-enabled false
验证专用链接连接
应该验证专用终结点的子网中的资源是否可以通过专用 IP 地址连接到注册表,以及它们是否具有正确的专用 DNS 区域集成。
若要验证专用链接连接,请连接到虚拟网络中设置的虚拟机。 然后,运行一个实用工具,例如 nslookup 或通过 dig 专用链接查找注册表的 IP 地址。 例如:
dig $REGISTRY_NAME.azurecr.cn
示例输出显示注册表的 IP 地址在子网的地址空间中:
[...]
; <<>> DiG 9.11.3-1ubuntu1.13-Ubuntu <<>> myregistry.azurecr.cn
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52155
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;myregistry.azurecr.cn. IN A
;; ANSWER SECTION:
myregistry.azurecr.cn. 1783 IN CNAME myregistry.privatelink.azurecr.cn.
myregistry.privatelink.azurecr.cn. 10 IN A 10.0.0.7
[...]
将此结果与公共终结点上相同注册表的 dig 输出中的公共 IP 地址进行比较:
[...]
;; ANSWER SECTION:
myregistry.azurecr.cn. 2881 IN CNAME myregistry.privatelink.azurecr.cn.
myregistry.privatelink.azurecr.cn. 2881 IN CNAME xxxx.xx.azcr.io.
xxxx.xx.azcr.io. 300 IN CNAME xxxx-xxx-reg.trafficmanager.cn.
xxxx-xxx-reg.trafficmanager.cn. 300 IN CNAME xxxx.chinaeast2.cloudapp.chinacloudapi.cn.
xxxx.chinaeast2.cloudapp.chinacloudapi.cn. 10 IN A 20.45.122.144
[...]
通过专用链接确认注册表操作
还应验证是否可从网络中的虚拟机执行注册表操作。 建立与虚拟机的 SSH 连接,并运行 az acr login 以向注册表进行身份验证。 根据 VM 配置,可能需要将 sudo 作为以下命令的前缀。
az acr login --name $REGISTRY_NAME
执行注册表操作(如 docker pull),以从注册表拉取示例映像。 将 hello-world:v1 替换为适用于注册表的映像和标记,并以注册表登录服务器名称(全部小写)作为前缀:
docker pull myregistry.azurecr.cn/hello-world:v1
确认 Docker 已成功将映像拉取到 VM。
管理专用终结点连接
使用 Azure 门户或 az acr private-endpoint-connection 命令组中的命令来管理注册表的专用终结点连接。 可以批准、删除、列出、拒绝或显示注册表的专用终结点连接的详细信息。
若要列出注册表的专用终结点连接,请运行 az acr private-endpoint-connection list 命令:
az acr private-endpoint-connection list \
--registry-name $REGISTRY_NAME
使用本文中的步骤设置专用终结点连接时,注册表会自动接受具有注册表Azure RBAC 权限的客户端和服务的连接。 可以设置终结点以要求手动批准连接。 有关如何批准和拒绝专用终结点连接的信息,请参阅管理专用终结点连接。
重要
目前,如果从注册表中删除专用终结点,则可能还需要删除从虚拟网络到专用区域的链接。 如果未删除链接,可能会看到错误 unresolvable host 。
DNS 配置选项
本示例中的专用终结点会集成与基本虚拟网络关联的专用 DNS 区域。 此设置使用Azure提供的 DNS 服务直接将注册表的公共 FQDN 解析为虚拟网络中的专用 IP 地址。
专用链接支持使用专用区域的其他 DNS 配置方案,包括自定义 DNS 解决方案。 例如,你可能在虚拟网络中部署了自定义 DNS 解决方案,或者在使用 VPN 网关或Azure ExpressRoute连接到虚拟网络的网络中本地部署。
若要在这些方案中将注册表的公共 FQDN 解析为专用 IP 地址,需要将服务器级转发器配置为Azure DNS服务(168.63.129.16)。 确切的配置选项和步骤取决于现有的网络和 DNS。 有关示例,请参阅 Azure专用终结点专用 DNS 区域值。
重要
如果在多个区域中创建专用终结点以实现高可用性,请在每个区域中使用单独的资源组,并将虚拟网络和关联的专用 DNS 区域放入其中。 此配置还可防止由于共享同一专用 DNS 区域而导致 DNS 解析不可预测的问题。
手动配置 DNS 记录
在某些情况下,可能需要在专用区域中手动配置 DNS 记录,而不是使用Azure提供的专用区域。 请务必为注册表终结点、注册表的数据终结点以及任何其他区域副本的数据终结点创建记录。 如果未配置所有记录,注册表可能无法访问。
重要
如果以后添加新副本,则需要为该区域中的数据终结点手动添加新的 DNS 记录。 例如,如果在 chinaeast2 位置创建了 myregistry 的副本,请为 myregistry.chinaeast2.data.azurecr.cn 添加记录。
需要创建 DNS 记录的 FQDN 和专用 IP 地址与专用终结点的网络接口相关联。 可以使用 Azure 门户或Azure CLI获取此信息。
- 在门户中,导航至您的专用终结点,并选择 DNS 配置。
- 通过使用 Azure CLI,运行 az network nic show。 有关示例命令,请参阅 “获取终结点 IP 配置”。
创建 DNS 记录后,请确保注册的 FQDN 可以正确解析为各自的专用 IP 地址。
从启用了专用链接的注册表拉取
若要从启用了专用链接的注册表拉取内容,客户端必须允许访问注册表 REST 终结点和所有区域数据终结点。 客户端代理或防火墙必须允许访问:
- REST 终结点:
{REGISTRY_NAME}.azurecr.cn - 数据终结点:
{REGISTRY_NAME}.{REGISTRY_LOCATION}.data.azurecr.cn
对于异地复制的注册表,必须为每个区域副本配置对数据终结点的访问权限。
使用数据端点更新客户端代理和客户端防火墙的路由配置,以成功处理拉取请求。 客户端代理为 出站请求提供中心流量控制。 若要处理本地流量,不需要客户端代理。 可以将终结点添加到 noProxy 节中以绕过代理。 有关详细信息,请参阅 AKS 中的 HTTP 代理支持。
通过专用终结点连接向令牌服务器发出的请求不需要数据终结点配置。
清理资源
如果在同一资源组中创建了所有Azure资源,并且不再需要这些资源,则可以在 Azure 门户中或使用单个 az group delete 命令删除资源组:
az group delete --name $RESOURCE_GROUP
相关内容
若要了解有关Private Link的详细信息,请参阅 Azure Private Link 文档。
若要验证路由到专用终结点的虚拟网络中的 DNS 设置,请使用 参数运行
--vnet命令。 有关详细信息,请参阅 检查Azure容器注册表的运行状况。如果需要从客户端防火墙后面设置注册表访问规则,请参阅 配置规则,以访问防火墙后面的Azure容器注册表。