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

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

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

本文說明如何使用 Azure 入口網站 或 Azure CLI 設定登錄的私人端點。 此功能可在 進階版 容器登錄服務層級中使用。 如需登錄服務層級和限制的相關信息,請參閱 Azure Container Registry 層

重要

某些功能可能無法使用,或需要容器登錄中的更多設定,以限制私人端點、選取的子網或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] 中選取 [進階版]。

  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 容器登錄網域建立 私人 Azure DNS 區域 。 在後續步驟中,您會在此 DNS 區域中建立登錄網域的 DNS 記錄。 如需詳細資訊,請參閱 本文稍後的 DNS 組態選項

若要使用私人區域來覆寫 Azure 容器登錄的預設 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 和服務連線 my 連線 ion。 若要指定端點的容器登入資源,請傳遞 --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-record 集合:

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-records

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-enabledfalse

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位址與公用端點上的公用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 位址。

Private link 支援使用私人區域的其他 DNS 設定案例,包括自定義 DNS 解決方案。 例如,您可能已在虛擬網路中部署自定義 DNS 解決方案,或是在您使用 VPN 閘道或 Azure ExpressRoute 連線到虛擬網路的網路內部部署。

若要在這些案例中將登錄的公用 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 記錄之後,請確定登錄 FQDN 會正確地解析為各自的私人 IP 位址。

清除資源

若要在入口網站中清除您的資源,請流覽至您的資源群組。 載入資源群組之後,按兩下 [ 刪除資源群組 ] 以移除資源群組和儲存在那裡的資源。

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

az group delete --name $RESOURCE_GROUP

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

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

針對異地復寫登錄,客戶必須設定每個區域複本數據端點的存取權。

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

透過私人端點連線對令牌伺服器的要求不需要數據端點設定。

下一步