使用 Azure Private Link 對 Azure 容器登錄進行私人連線

將虛擬網路私人 IP 位址指派給登錄端點,並使用 Azure Private Link,以限制登錄的存取權。 虛擬網路上的用戶端與登錄的私人端點之間的網路流量,會周遊虛擬網路和 Microsoft 骨幹網路上的私人連結,以免暴露在公用網際網路上。 Private Link 也會透過 Azure ExpressRoute 私人對等互連或 VPN 閘道,從內部部署啟用私人登錄存取。

您可以針對登錄的私人端點設定 DNS 設定,以將設定解析為登錄的已配置私人 IP 位址。 透過 DNS 設定,網路中的用戶端和服務可以繼續存取位於登錄完整網域名稱的登錄,例如 myregistry.azurecr.io

本文顯示如何使用 Azure 入口網站 (建議) 或 Azure CLI,以針對您的登錄設定私人端點。 進階容器登錄服務層級中提供這項功能。 如需登錄服務層級和限制的相關資訊,請參閱 Azure 容器登錄層級

重要

某些功能可能無法使用,或在容器登錄中需要進行更多設定,以限制對私人端點、選取的子網路或 IP 位址的存取。

  • 停用登錄的公用網路存取時,某些信任服務 (部分機器翻譯) 的登錄存取權 (包括Azure 資訊安全中心) 需要啟用網路設定才能略過網路規則。
  • 公用網路存取停用後,某些 Azure 服務的執行個體,包括 Azure DevOps Services 目前無法存取容器登錄。
  • Azure DevOps 受控代理程式目前不支援私人端點。 您必須使用對私人端點具有網路可見性的自我裝載式代理程式。
  • 如果登錄具有已核准的私人端點,且公用網路存取已停用,則無法使用 Azure 入口網站、Azure CLI 或其他工具來將存放庫和標籤列在虛擬網路外部。

注意

從 2021 年 10 月開始,新的容器登錄最多允許 200 個私人端點。 稍早建立的登錄最多允許 10 個私人端點。 使用 az acr show-usage 命令來查看登錄的限制。 請開啟支援票證,將限制增加到 200 個私人端點。

必要條件

  • 要在其中設定私人端點的虛擬網路和子網路。 如有需要,請建立新的虛擬網路和子網路
  • 若要進行測試,建議您在虛擬網路中設定 VM。 如需建立測試虛擬機器以存取登錄的步驟,請參閱建立已啟用 Docker 的虛擬機器
  • 若要使用本文中的 Azure CLI 步驟,建議使用 Azure CLI 2.6.0 版或更新版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI。 或在 Azure Cloud Shell 中執行。
  • 如果您還沒有容器登錄,則請予以建立 (需要進階層),然後從 Microsoft 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

在您建立登錄時設定私人端點,或將私人端點新增至現有登錄。

建立私人端點 - 新的登錄

  1. 在入口網站中建立登錄時,請在 [基本] 索引標籤的 [SKU] 中,選取 [Premium]

  2. 選取 [網路] 索引標籤。

  3. 在 [網路連線] 中,選取 [私人端點]>[+ 新增]

  4. 輸入或選取下列資訊:

    設定
    訂用帳戶 選取您的訂用帳戶。
    資源群組 輸入現有群組的名稱,或建立一個新的群組。
    名稱 輸入唯一名稱。
    登錄子資源 選取 [登錄]
    網路功能
    虛擬網路 選取私人端點的虛擬網路。 範例:myDockerVMVNET
    子網路 選取私人端點的子網路。 範例:myDockerVMSubnet
    私人 DNS 整合
    與私人 DNS 區域整合 選取 [是]
    私人 DNS 區域 選取 (新增) privatelink.azurecr.io
  5. 設定其餘的登錄設定,然後選取 [檢閱 + 建立]

Create registry with private endpoint

您的私人連結現在已設定並可供使用。

建立私人端點 - 現有登錄

  1. 在入口網站中,瀏覽至容器登錄。

  2. 在 [設定] 底下,選取 [網路]

  3. 在 [私人端點] 索引標籤上,選取 [+ 私人端點]Add private endpoint to registry

  4. 在 [基本] 索引標籤中,輸入或選取以下資訊:

    設定
    專案詳細資料
    訂用帳戶 選取您的訂用帳戶。
    資源群組 輸入現有群組的名稱,或建立一個新的群組。
    [執行個體詳細資料]
    名稱 輸入名稱。
    區域 選取區域。
  5. 選取 [下一步:資源]。

  6. 輸入或選取下列資訊:

    設定
    連線方式 在此範例中,選取 [連線至我目錄中的 Azure 資源]
    訂用帳戶 選取您的訂用帳戶。
    資源類型 選取 Microsoft.ContainerRegistry/registries
    資源 選取您登錄的名稱
    目標子資源 選取 [登錄]
  7. 選取 [下一步:設定]

  8. 輸入或選取資訊:

    設定
    網路功能
    虛擬網路 選取私人端點的虛擬網路
    子網路 選取私人端點的子網路
    私人 DNS 整合
    與私人 DNS 區域整合 選取 [是]
    私人 DNS 區域 選取 (新增) privatelink.azurecr.io
  9. 選取 [檢閱 + 建立]。 您會移至 [檢閱 + 建立] 頁面,其中 Azure 會驗證您的設定。

  10. 當您看到 [驗證成功] 訊息時,請選取 [建立]

確認端點設定

建立私人端點之後,私人區域中的 DNS 設定會與 [私人端點] 設定出現在入口網站中:

  1. 在入口網站中,瀏覽至您的容器登錄,然後選取 [設定] > [網路]
  2. 在 [私人端點] 索引標籤上,選取您建立的私人端點。
  3. 選取 [DNS 設定]
  4. 檢閱連結設定和自訂 DNS 設定。

Endpoint DNS settings in portal

設定私人端點 - CLI

本文中的 Azure CLI 範例使用下列環境變數。 您將需要現有容器登錄、虛擬網路和子網路的名稱,才能設定私人端點。 取代適用於您環境的值。 所有範例已處理為 Bash 殼層格式:

REGISTRY_NAME=<container-registry-name>
REGISTRY_LOCATION=<container-registry-location> # Azure region such as westeurope 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 Container Registry 網域建立私人 Azure DNS 區域。 在後續步驟中,您會在此 DNS 區域中建立登錄網域的 DNS 記錄。 如需詳細資訊,請參閱本文稍後的 DNS 設定選項

若要使用私人區域來覆寫 Azure Container Registry 的預設 DNS 解析,區域必須命名為 privatelink.azurecr.io。 執行下列 az network private-dns zone create 命令以建立私人區域:

az network private-dns zone create \
  --resource-group $RESOURCE_GROUP \
  --name "privatelink.azurecr.io"

執行 az network private-dns link vnet create,將私人區域與虛擬網路建立關聯。 這個範例會建立名為 myDNSLink 的連結。

az network private-dns link vnet create \
  --resource-group $RESOURCE_GROUP \
  --zone-name "privatelink.azurecr.io" \
  --name MyDNSLink \
  --virtual-network $NETWORK_NAME \
  --registration-enabled false

建立私人登錄端點

在本節中,請在虛擬網路中建立登錄的私人端點。 首先,取得登錄的資源識別碼:

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 來查詢網路介面識別碼的私人端點:

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)

異地複本的其他端點

如果您的登錄是異地複寫,請查詢每個登錄複本的其他資料端點。 例如,在 eastus 區域中:

REPLICA_LOCATION=eastus
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 記錄。 例如,如果您在 westeurope 區域中有名為 myregistry 的登錄,則端點名稱為 myregistry.azurecr.iomyregistry.westeurope.data.azurecr.io

請先執行 az network private-dns record-set a create,為登錄端點和資料端點建立空的 A 記錄集:

az network private-dns record-set a create \
  --name $REGISTRY_NAME \
  --zone-name privatelink.azurecr.io \
  --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.io \
  --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.io \
  --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.io \
  --resource-group $RESOURCE_GROUP \
  --ipv4-address $DATA_ENDPOINT_PRIVATE_IP

異地複本的其他記錄

如果您的登錄已進行異地複寫,則請為每個複本建立額外的 DNS 設定。 繼續 eastus 區域中的範例:

az network private-dns record-set a create \
  --name ${REGISTRY_NAME}.${REPLICA_LOCATION}.data \
  --zone-name privatelink.azurecr.io \
  --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.io \
  --resource-group $RESOURCE_GROUP \
  --ipv4-address $GEO_REPLICA_DATA_ENDPOINT_PRIVATE_IP

私人連結現在已設定並可供使用。

停用公用存取

在許多情況下,停用公用網路的登錄存取。 此設定可防止虛擬網路外部的用戶端連線到登錄端點。

停用公用存取 - 入口網站

  1. 在入口網站中,瀏覽至您的容器登錄,然後選取 [設定] > [網路]
  2. 在 [公用存取] 索引標籤的 [允許公用網路存取] 中,選取 [停用]。 然後選取儲存

停用公用存取 - CLI

注意

如果已停用公用存取,則 az acr build 命令將無法再運作。

若要使用 Azure CLI 停用公用存取,請執行 az acr update,並將 --public-network-enabled 設定為 false

az acr update --name $REGISTRY_NAME --public-network-enabled false

執行具有私人端點和私人登錄的 az acr build

注意

這裡停用公用網路存取之後,az acr build 命令將無法再運作。 除非您使用專用代理程式集區,否則通常需要公用 IP。 工作會針對輸出要求,在每個區域中保留一組公用 IP。 如有需要,您可選擇將這些 IP 新增至防火牆允許的清單,以便進行無縫通訊。az acr build 命令會使用與工作相同的 IP 集合。

請考慮下列選項以成功執行 az acr build

使用服務端點來停用對容器登錄的存取

重要

容器登錄不支援啟用從虛擬網路設定的私人連結和服務端點功能。

一旦登錄已停用公用存取並設定私人連結,您就可以移除虛擬網路規則,以便停用從虛擬網路對於容器登錄的服務端點存取。

您應該驗證私人端點子網路內的資源是否透過私人 IP 位址連線到您的登錄,且具有正確的私人 DNS 區域整合。

若要驗證私人連結連線,請連線至您在虛擬網路中設定的虛擬機器。

執行 nslookupdig 這類公用程式,以透過私人連結來查閱登錄的 IP 位址。 例如:

dig $REGISTRY_NAME.azurecr.io

範例輸出會在子網路的位址空間中顯示登錄的 IP 位址:

[...]
; <<>> DiG 9.11.3-1ubuntu1.13-Ubuntu <<>> myregistry.azurecr.io
;; 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.io.         IN      A

;; ANSWER SECTION:
myregistry.azurecr.io.  1783    IN      CNAME   myregistry.privatelink.azurecr.io.
myregistry.privatelink.azurecr.io. 10 IN A      10.0.0.7

[...]

將此結果與 dig 輸出中的公用 IP 位址進行比較,以透過公用端點取得相同的登錄:

[...]
;; ANSWER SECTION:
myregistry.azurecr.io.	2881	IN	CNAME	myregistry.privatelink.azurecr.io.
myregistry.privatelink.azurecr.io. 2881	IN CNAME xxxx.xx.azcr.io.
xxxx.xx.azcr.io.	300	IN	CNAME	xxxx-xxx-reg.trafficmanager.net.
xxxx-xxx-reg.trafficmanager.net. 300 IN	CNAME	xxxx.westeurope.cloudapp.azure.com.
xxxx.westeurope.cloudapp.azure.com. 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.io/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 連線至虛擬網路的網路內部部署環境部署自訂 DNS 解決方案。

若要將這些案例中的登錄公用 FQDN 解析為私人 IP 位址,您需要將伺服器層級轉寄站設定為 Azure DNS 服務 (168.63.129.16)。 確切的設定選項和步驟取決於您現有的網路和 DNS。 例如,請參閱 Azure 私人端點 DNS 設定

重要

為了達到高可用性,如果您已在數個區域中建立私人端點,則建議您在每個區域中使用不同的資源群組,並將虛擬網路和相關聯的私人 DNS 區域放在其中。 此設定也會防止共用相同私人 DNS 區域所造成的無法預測 DNS 解析。

手動設定 DNS 記錄

在某些情況下,您可能需要在私人區域中手動設定 DNS 記錄,而不是使用 Azure 提供的私人區域。 請務必為下列每個端點建立記錄:登錄端點、登錄的資料端點,以及任何其他區域複本的資料端點。 如果未設定所有記錄,則登錄可能無法連線。

重要

如果您稍後新增複本,則需要手動為該區域中的資料端點新增 DNS 記錄。 例如,如果您在 northeurope 位置中建立 myregistry 的複本,則請新增 myregistry.northeurope.data.azurecr.io 的記錄。

您需要建立 DNS 記錄的 FQDN 和私人 IP 位址會與私人端點的網路介面相關聯。 您可以使用 Azure 入口網站或 Azure CLI 來取得此資訊。

  • 在入口網站中,導覽至您的私人端點,然後選取 [DNS 設定]
  • 使用 Azure CLI,執行 az network nic show 命令。 如需範例命令,請參閱本文稍早的取得端點 IP 設定

建立 DNS 記錄之後,請確定登錄 FQDN 會正確解析為其各自的私人 IP 位址。

清除資源

若要在入口網站中清除資源,請導覽至您的資源群組。 載入資源群組後,按一下 [刪除資源群組] 以移除資源群組及儲存於該處的資源。

如果您已在相同的資源群組中建立所有 Azure 資源,但不再需要這些資源,您可以使用單一 az group delete 命令,選擇性地刪除資源:

az group delete --name $RESOURCE_GROUP

若要從已啟用私人連結的登錄提取內容,用戶端必須允許存取登錄 REST 端點,以及所有區域性資料端點。 用戶端 Proxy 或防火牆必須允許存取

REST 端點:{REGISTRY_NAME}.azurecr.io 資料端點:{REGISTRY_NAME}.{REGISTRY_LOCATION}.data.azurecr.io

對於異地複寫的登錄,客戶需要設定每個區域複本的資料端點存取權。

您必須使用資料端點來更新用戶端 Proxy 和用戶端防火牆的路由設定,才能順利處理提取要求。 用戶端 Proxy 會將中央流量控制提供給輸出要求。 若要處理用戶端 Proxy 不需要的本機流量,您可以新增至 noProxy 區段以略過 Proxy。 深入了解 HTTP Proxy 文件來與 AKS 整合。

透過私人端點連線對權杖伺服器的要求不需要設定資料端點。

下一步