Azure Container Registry 中的異地複寫

啟用 Azure 容器登錄檔(ACR)的地理複製,會在你選擇的 Azure 區域建立地理複製資源。 當你將圖片推送到地理複製的登錄檔時,內容會自動同步到所有地理複製品。

透過地理複製:

  • 管理一個登錄檔:在所有地理複本間維持一組憑證、角色分配、網路規則及登錄檔設定。
  • 使用一個全域端點:在所有建置和部署中引用 myregistry.azurecr.io/myimage:tag 。 Azure 會將要求路由到對用戶端具有最佳網路效能設定檔的異地複本,通常是距離最近的異地複本。 然而,如果用戶端距離多個地理複本相等距離,或最近的地理複本無法使用,請求可能會被轉送至其他地方。
  • 自動同步:推送標籤和摘要一次;ACR 將內容與元資料複製到所有地理複製品。

地理複製需要 Premium SKU。

附註

高可用性考量

複寫模式

ACR 地理複製採用 主動-主動 模式。

  • 所有異地複寫複本皆為作用中且可寫入—您可以從任何異地複寫複本推送、提取和刪除映像,不僅限於主區域的異地複寫複本。
  • 這與主-次級複製模型不同,後者僅接受一個區域接受寫入,次要區域則是被動的。

一致性模型

ACR 採用 最終一致性。

  • 在任何異地複寫複本中推送或刪除映像後,ACR 最終會在背景中將這項變更複寫到所有異地複寫複本。
  • 複製時間取決於影像大小。 如果已推送大量映像或大型映像,則已推送的映像或標籤可能無法立即在其他異地複寫複本中提取。 同樣地,已刪除的映像或標籤可能仍可提取入其他異地複寫複本,直到刪除傳播。
  • 建立新的地理複製品所需的時間會隨著登記冊的總規模而成長。 建立新的地理複本時,現有的地理複本仍可正常處理推送、提取和刪除流量。 當新的異地複寫複本在背景同步時,沒有限制狀態或劣化區間。
  • 在複寫於背景完全完成之前,異地複寫複本可能都無法擁有最新的內容或中繼資料。 您可以使用 Webhook,在每個異地複本中某個推送映像完成複寫時接收通知。

Important

未來一致性失效模式需規劃:

  • 推送後立即跨區域提取 — 將映像推送至某個異地寫複本後,若立即從另一個異地複寫複本提取,可能會因manifest unknown而失敗,直到複寫完成同步為止。 這種情況通常會影響 CI/CD 管線:當 CI 執行程式推送映像時,跨多個區域的 Pod 會立即嘗試提取該映像。
  • 標籤覆寫競爭 — 推送myapp:v1後,不久又以不同的摘要 (相同標籤、不同內容) 重新推送myapp:v1,可能會導致不同的異地複寫複本在複寫期間將同一標籤解析為不同的摘要。
  • 刪除傳播 — 在某一區域刪除標籤或存放庫需要時間傳播。 從刪除尚未傳播的異地複寫複本提取資料,仍有可能傳回已刪除的內容。
  • 推送過程中的容錯移轉分散 — 跨越健康狀態感知容錯移轉邊界或 DNS 跳轉事件的多層推送,可能會使各層落在一個異地複寫複本上,而資訊清單則落在另一個異地複寫複本上,導致後續提取時,顯示為資訊清單確認錯誤或blob unknown。 請參閱推送因資訊清單錯誤而失敗,了解緩解措施。

緩解措施:

  • 對緊接在跨區域推送後的提取作業建置重試邏輯—以退避機制重試,或在提取前檢查複寫狀態。
  • 利用 webhook 在每個地理複本完成複製時接收通知,然後再觸發跨區域拉取。

資料平面高可用性

地理複製透過將影像分布於多個區域,提升資料平面的可用性。 如果某個區域發生中斷,仍可從其他異地複本存取映像,而推送、拉取及刪除作業也會透過其餘的異地複本繼續運作。

區域備援一律會為異地複本啟用——ACR 會自動將複本資料分散到多個可用性區域,以防範單一可用性區域中斷。

附註

如果您的登錄檔使用 客戶管理的金鑰,請檢視 金鑰庫故障轉移與冗餘指引 以達到最大韌性。

健康狀態感知容錯移轉

ACR 會自動監控每個地理複製品的健康狀況,並將全球端點流量從無法可靠回應請求的地理複製品中重新導向。 這稱為健康狀態感知容錯移轉。 ACR 根據 ACR 服務健康狀況及 Azure 區域基礎架構健康度,路由全球端點流量。

  • 自動與依各登錄:健康狀態是以每個登錄為單位評估,而不是以區域為單位。 若降級只影響區域內部分登錄檔,則只有這些登錄檔會被重新導向——同一區域內的其他登錄檔仍可在本地持續服務,且不會有不必要的延遲損失。
  • 時序:端到端的重新路由約在幾分鐘內,速度足夠捕捉區域的實際退化,也足夠慢以應付暫時性錯誤,這些錯誤會自行解決。 DNS TTL 可能會在所有用戶端切換到新區域前增加傳播延遲。
  • 無需客戶操作:沒有客戶可調用的觸發器。 健康狀態感知容錯移轉完全由平台負責管理。
  • 容錯回復為自動進行:一旦異地複寫複本的區域健康狀態評估再次通過,例如在區域 ACR 或 Azure 基礎結構復原後,全域端點即可重新開始將流量路由到已復原 Azure 區域中的異地複寫複本。
  • 並非由節流所觸發:健康狀態感知容錯移轉是以 DNS 為基礎,並會回應區域 ACR 服務健康狀態和 Azure 基礎結構健康狀態。 它 不會 根據 HTTP 429(限速)回應重新導向流量。 如果某個異地複本對你的要求進行節流,但該區域的基礎結構狀況良好,全域端點仍會持續將你的要求導向該異地複本。 若要管理節流,請使用區域端點將工作負載散布到多個異地複寫複本,以實現更佳的容量分散。

健康狀態感知容錯移轉的範圍:

健康狀態感知容錯移轉僅適用於針對全域端點 (myregistry.azurecr.io) 執行的作業。 此規定 不 適用於:

  • 區域端點 — 當你使用區域端點(myregistry.<region>.geo.azurecr.io),你就是直接與一個特定的地理複本通訊。 如果該區域退化,ACR 不會自動重新導向。 透過切換到不同的區域端點來實現客戶端故障轉移。
  • 專用資料端點 — 一旦登錄端點將你導向到專門的資料端點進行層級下載,你就會在整個下載過程中停留在該區域的資料端點。 區域由負責執行 blob-location 呼叫的登錄端點事先決定。

容錯移轉期間節流:

API 作業的節流限制針對每個複本。 在健康狀態感知容錯移轉期間,原本散布在多個異地複寫複本間的流量,可能會大量集中到仍留在全域端點路由集區中的異地複寫複本。 容量方案應至少具備二到三個異地複寫複本,以便在容錯移轉期間,將流量散布到多個健康狀態良好的異地複寫複本。 只有兩個區域的登錄在其中一個區域無法使用時,更容易達到依據每個複本的節流限制。 為減輕此問題,利用 區域端點 將工作負載分散於多個地理複本,並規劃每個複本的容量。

如何確認故障轉移:

  • Azure入口網站:進入你的登錄檔,在幫助區塊中選擇資源健康,即可查看平台端的退化訊號。
  • Azure CLI:用 az acr replication list --registry myregistry --output table 檢查複製狀態。 發生問題的異地複本會顯示 `online` 以外的狀態。
  • Azure 監視器:平台指標會自動收集。 啟用資源日誌的 診斷設定 以取得詳細的遙測數據。

本區域故障行為

主區域是你最初建立登錄檔的區域。 它承載登錄檔的控制平面,負責管理登錄檔設定。 主區域在創建時是固定的,之後無法更改。 若要將登錄檔移至其他主區域,請參見 Relocate Azure Container Registry,該說明是一種重新部署程序(建立新的登錄檔),而非原地變更。

若主區域無法使用,影響僅限於控制平面 (管理) 作業。 所有資料平面操作仍持續透過剩餘的地理複製品進行。

在本地區中斷時,哪些方法仍然有效:

  • 影像推送、拉取與刪除 — 用戶端可透過全域端點(myregistry.azurecr.io)或任何可用區域端點(myregistry.<region>.geo.azurecr.io)推送、拉取及刪除任何可用的地理複本影像。 ACR 會自動將全球端點請求導向健康的地理複製品。
  • Authentication — 所有認證方法仍可正常運作,包括Microsoft Entra ID、服務主體、管理身份及資料庫範圍令牌。 用戶端可對任何可用的地理複本進行認證,無需更改憑證、令牌或登錄檔 URL。
  • Webhook 遞送 - 已為可用的地理複製品配置的 Webhook 會持續觸發。 一次推送會產生來自接收端異地複寫複本的 webhook 事件,以及在複寫完成時,來自各個異地複寫複本的事件。 Webhook 使用者應設計為能夠處理每個已推送映像的多個事件,並視需要刪除重複事件。
  • 區域端點 — 若啟用區域端點,它們仍能獨立運作。 用戶端可透過區域端點網址直接與特定地理複本通訊。

在本地區中斷期間無法取得的是什麼:

  • 全球端點路由至本區域地理複本 — ACR 的健康偵測會自動停止將全球端點流量路由至本區域地理複本,並將其導向健康的地理複本。
  • 本區域的區域端點 — 當本區域關閉時,本區的區域端點(myregistry.<home-region>.geo.azurecr.io)無法使用。 其他地理複製品的區域端點則繼續獨立運作。
  • 登錄檔設定變更 — 在家區域恢復之前,無法修改登錄檔屬性,例如網路規則、複製設定或可用性區域設定。
  • ACR 任務 — 任務 綁定在主區域,當該區域無法使用時不會執行。

服務層級與限制考量

Azure Container Registry 服務層級與限制會分別套用到每個異地複寫複本。

某些服務等級限制有以下特別考量:

  • 儲存限制:你的服務等級的儲存限制在所有地理複本之間是共享的。 例如,如果你推送一個 1 GiB 的映像檔,並將其複寫到 5 個異地複本,則只有 1 GiB 會列入你所屬層級的儲存體上限。
  • API 速率限制:對於 API 操作的節流限制,例如每分鐘的讀取和寫入次數,是針對地理複本而設定的。 使用 區域端點 將工作負載分散到多個地理複本,以更好地分配容量,避免所有流量集中在單一地理複本上。

欲了解更多服務等級與限制資訊,請參閱 ACR 服務等級。

定價考量

  • 儲存體計費:儲存體是依異地複寫複本計費。 例如,將 1 GiB 的映像複寫到 5 個異地複本時,將按 5 GiB 的儲存空間計費(1 GiB × 5 個異地複本)。
  • 資料傳輸:地理複製可透過允許區域內影像推送與拉取來降低成本,避免跨區域資料傳輸費用。 然而,當 ACR 將複製內容推送到其他地理複製品以達成最終一致性時,跨區域資料傳輸費用仍然適用。

欲了解更多資訊,請參閱 ACR 價格。

新增或刪除異地複本

所需權限

要管理地理複製品,您的身份需要以下權限:

權限 Description
Microsoft.ContainerRegistry/registries/read 取得登錄屬性
Microsoft.ContainerRegistry/registries/write 建立或更新登錄檔屬性
Microsoft.ContainerRegistry/registries/replications/read 列出異地複本
Microsoft.ContainerRegistry/registries/replications/write 建立或更新地理複製品
Microsoft.ContainerRegistry/registries/replications/delete 刪除地理副本
Microsoft.ContainerRegistry/registries/replications/operationStatuses/read 取得異地複本作業狀態

Azure 入口網站

  1. 請在 Azure 入口網站進入你的登錄檔。
  2. 在服務中,選擇地理複製。
  3. 地圖上:
    • 藍色六角形:主區域(你建立登錄檔的地方)
    • 綠色六角形:可用區域
    • 灰色六邊形:無法使用區域
  4. 選擇一個綠色六角形,然後選擇 「建立」。

Azure 入口網站中地理複製地圖的截圖。

Azure CLI

# Create a replica
az acr replication create --registry myregistry --location eastus

# List replicas
az acr replication list --registry myregistry --output table

# Delete a replica
az acr replication delete --registry myregistry --name eastus

更多指令請參見 az acr 複製。

異地複寫登錄的全域端點

設定好地理複製後,你可以透過登錄檔的全域端點()推送、拉取或刪除登錄檔中的內容。myregistry.azurecr.io

全域端點的運作方式

當您透過全域端點推送、提取或刪除時,ACR 會將要求路由至對用戶端而言網路效能最佳的異地複寫複本。

  • 從用戶端的角度來看,網路效能表現最佳的異地複本通常是距離最近的異地複本。
  • 然而,如果用戶端距離多個地理複本相等距離,或最近的地理複本無法使用,請求可能會被轉送至其他地方。
  • ACR 負責管理這段路由。 你無法控制哪個地理複製品處理特定請求。

顯示全域端點要求流程的示意圖:用戶端連線至 myregistry.azurecr.io,Azure 管理的路由會選取具有最佳網路效能設定檔的異地複寫複本,而異地複寫複本會傳回 307 重新導向至其資料端點,以供下載 Blob。

使用全域端點

驗證:

az acr login --name myregistry

標籤並推送圖片:

docker tag myapp:v1 myregistry.azurecr.io/myapp:v1
docker push myregistry.azurecr.io/myapp:v1

拉一張圖片:

docker pull myregistry.azurecr.io/myapp:v1

匯入圖片:

az acr import \
  --name myregistry \
  --source mcr.microsoft.com/hello-world:latest \
  --image hello-world:latest

Kubernetes 部署清單:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  template:
    spec:
      containers:
      - name: myapp
        image: myregistry.azurecr.io/myapp:v1

暫時將地理複製品排除於全域端點路由之外

你可以透過關閉 --global-endpoint-routing 特定地理複製品的設定,將該地理複製品排除在全域端點路由之外。 這對維護或故障排除很有用,或是當你知道某個特定地理複本或 Azure 區域正在退化時。 你甚至可以關閉主區域地理複製的全域端點路由——主區域僅用於控制平面操作,其資料平面流量可以安全排除在全域路由之外。 欲了解更多本區域控制事項,請參閱 本區域停電行為。

  • 當特定異地複本的--global-endpoint-routing 設定為 false 時,ACR 會停止將透過全域端點進入的要求路由到該異地複本。
  • 即使該地理複製品的全球端點路由被禁用,資料仍持續與該地理複製品 雙向 同步。 即使異地複寫複本已從全域路由中排除,從任何區域推送至登錄的每個映像仍會複寫到該異地複寫複本。 當您重新啟用異地複寫複本時,它會立即準備好提供流量,無需同步處理時間。
  • 因此,該地理複製品的儲存配額與成本持續累積。
  • 若啟用區域端點,地理複本的區域端點 URLmyregistry.<region-name>.geo.azurecr.io()即使在全域端點路由被停用後仍能正常運作。 --global-endpoint-routing僅控制異地複寫複本是否參與全域端點路由。
# Exclude a geo-replica from global endpoint routing
az acr replication update --registry myregistry --name eastus \
  --global-endpoint-routing false

# Re-enable a geo-replica in global endpoint routing
az acr replication update --registry myregistry --name eastus \
  --global-endpoint-routing true

附註

  • 該--name參數指定地理複製資源名稱,而非 Azure 區域。 使用 傳回的 az acr replication list 值。
  • 在 Azure CLI 2.86.0 及以後版本中,--region-endpoint-enabled 改名為 --global-endpoint-routing。 舊的旗標名稱已棄用,並於 Azure CLI 2.87.0(2026 年 6 月)中移除。 如果你有現有的指令碼或使用 --region-endpoint-enabled 的自動化程序,請將其更新為使用 --global-endpoint-routing。

Important

請勿為全域端點使用長效 DNS 快取。 當你為地理複製品關閉全域端點路由時,ACR 會以快速路徑清除伺服器端的 DNS 紀錄。 然而,如果用戶端為全球端點執行自己的長期存在的 DNS 快取,這些用戶端會繼續解析為已停用的異地複寫複本,直到用戶端快取到期。 長期存在的快取會讓--global-endpoint-routing false從用戶端來看像是沒有生效。

Tip

您可以選擇使用短暫存在的 DNS 快取來推送到全域端點。 一個短暫存在,範圍限定於單次推送持續時間的 DNS 釘選,有助於確保推送一致性,因為所有層和諮詢清單都會傳送到同一個異地複寫複本。 這也避免可能導致資訊清單錯誤的 DNS 跳轉 — 請參閱疑難排解。

地理複製登錄的區域端點(預覽)

區域端點會為每個副本提供專屬 URL,讓你能精確指定哪個區域地理副本負責你的推送、拉取或刪除請求:

  • myregistry.eastus.geo.azurecr.io
  • myregistry.westeurope.geo.azurecr.io

需要時使用區域端點:

劇本 Description
可預測路由 確保工作負載一律使用特定副本,以實現區域內親和性。
用戶端故障轉移 實作您自己的容錯移轉邏輯,根據您自己的用戶端健康狀態檢查,明確在各區域之間切換,而不依賴作為全域端點基礎的 Azure 健康狀態檢查。
推拉一致性 針對特定異地複寫複本執行推送、提取和刪除作業,以避免在 CI/CD 管線或容器部署資訊清單中發生因複寫延遲和最終一致性所導致的競爭情況。
Troubleshooting 測試或除錯特定的區域副本。
容量規劃 清楚掌握提供各個工作負載的來源複本,以規劃各複本的容量,避免受到節流。

Important

健康狀態感知容錯移轉不適用於區域端點。 使用區域端點時,你是直接與某個特定的地理複本通訊。 如果該區域退化,ACR 不會自動重新導向。 健康狀態感知容錯移轉僅適用於針對全域端點 (myregistry.azurecr.io) 執行的作業。 請參閱前表中的 客戶端故障轉移 情境。

附註

節流是依據每個複本,不是每個登錄。 當你將工作負載固定到單一區域端點時,所有流量都會集中到該地理複寫複本。 如果您的所有叢集都使用同一個區域端點,您可能會在尖峰時段達到該異地複寫複本每個區域的節流限制。 為了緩解,可以將工作負載分散到多個區域端點以更好地分配容量,或使用全域端點處理不需要明確釘選的工作負載。

區域端點與全域端點共存

啟用區域端點並不會停用或取代全域端點。 你可以同時使用兩者:

  • 如果你偏好由 Azure 跨地理複本管理的自動路由,可以使用 全域端點(myregistry.azurecr.io)。
  • 如果你想要更細緻的用戶端路由控制,可以使用 regional endpoints (myregistry.<region-name>.geo.azurecr.io),完全繞過Azure管理的全球端點路由。

區域終點的運作方式

區域端點作為特定地理複製品的 登入伺服器 。 當你認證並與區域端點互動,而非登錄檔的全域端點時,所有登錄檔操作(認證、產物上傳/下載、儲存庫操作及元資料操作)都會直接傳送到該區域副本,完全繞過 Azure 管理的路由。

層塊下載(實際的容器映像層)仍會遵循你登錄檔現有的設定:

  • 沒有私人端點或專用資料端點的登錄檔:當你從特定地理複本下載影像層時,層塊下載會重新導向到Azure儲存帳號(*.blob.core.windows.net)。
  • 啟用私有端點或專用資料端點的登錄檔:當你從特定地理複製品下載影像層時,層塊下載會重新導向到對應區域的專用資料端點(myregistry.<region-name>.data.azurecr.io)。

下圖說明區域端點請求流程:

顯示區域端點請求流程的圖示:用戶端連接 myregistry.region.geo.azurecr.io,請求直接送達該區域地理複本,而該地理複本會向其資料端點發出 307 重定向以進行 blob 下載。

附註

透過區域端點推送到地理複本的影像與標籤,最終仍會在一致性下傳播至所有其他地理複本。

區域終點先決條件

  • Premium SKU — 區域端點僅在 Premium 等級登錄檔中提供。
  • Azure CLI — 版本 2.86.0 或更新版本。 所有區域端點指令(--regional-endpoints、az acr show-endpoints、az acr login --endpoint)在 Azure CLI 2.86.0+ 中原生提供。

Important

如果你之前安裝了私有預覽的 CLI 擴充功能: 如果你參與了區域端點的私有預覽並安裝了 acrregionalendpoint CLI 擴充功能,請卸載它以避免與內建 CLI 指令衝突:

az extension remove --name acrregionalendpoint

你可以透過以下方式確認該擴充功能已不再安裝:

az extension list --query "[?name=='acrregionalendpoint']" -o table

附註

區域端點可在任何高級 SKU 登錄檔啟用,即使不進行地理複製。 沒有異地複寫複製的登錄在主區域只有一個異地複寫複本,該複本會獲得一個區域端點 URL。 不過,當你的登錄檔至少有兩個地理複製品時,這個功能最有用。

啟用區域端點

你可以在建立新登錄檔或更新現有登錄檔時啟用區域端點。

建立一個啟用區域端點的新登錄檔:

az acr create \
  -n myregistry \
  -g myrg \
  -l regionname \
  --sku Premium \
  --regional-endpoints enabled

在現有登錄檔啟用區域端點:

az acr update \
  -n myregistry \
  -g myrg \
  --regional-endpoints enabled

區域端點在登錄檔層級啟用,並適用於每個地理複本。 你無法為個別副本啟用區域端點。 啟用區域端點後,Azure Container Registry 會自動為每個地理複製建立登入伺服器 URL。

使用區域端點

驗證並使用區域端點

區域端點支援與全域端點相同的認證方法:Microsoft Entra ID、服務主體、管理身份及管理員憑證。

Important

切換端點時請重新驗證。 ACR 代幣適用於全球及區域端點。 然而,像 Docker 和 containerd 這類容器工具會根據主機名稱儲存憑證,因此從全球端點切換到區域端點(或區域端點間)需要為 az acr login 該主機名稱重新建立憑證。 關於 AKS,請參見 使用區域端點搭配 AKS 管理身份驗證。

登入特定區域端點:

az acr login --name myregistry --endpoint eastus

標記並推送影像到區域端點。 透過區域端點推送到地理複本的影像與標籤,最終仍會在一致性下傳播至所有其他地理複本。

docker tag myapp:v1 myregistry.eastus.geo.azurecr.io/myapp:v1
docker push myregistry.eastus.geo.azurecr.io/myapp:v1

從區域端點擷取一張影像:

docker pull myregistry.eastus.geo.azurecr.io/myapp:v1

使用區域端點搭配 AKS 管理身份驗證

使用受控身分識別向 ACR 進行驗證的 AKS 映像提取,支援 AKS 節點映像202607.29或更新版本的區域端點。 請檢查每個節點池目前的映像檔:

az aks nodepool show \
  --resource-group <resource-group> \
  --cluster-name <cluster-name> \
  --name <node-pool-name> \
  --query nodeImageVersion \
  --output tsv

若要在相容的節點映像 VHD 於您所在區域和雲端提供後自動接收,請使用NodeImage節點 OS 自動升級通道。 AKS 自動用途 NodeImage;對於 AKS 標準型,請選擇 NodeImage。

az aks update \
  --resource-group <resource-group> \
  --name <cluster-name> \
  --node-os-upgrade-channel NodeImage

對於執行較舊映像的 AKS 節點,在從區域端點提取映像時,可使用 Kubernetes 映像提取密鑰,或改用全域端點(<registry-name>.azurecr.io)。

使用內嵌於部署資訊清單中的區域端點

如果你需要將工作負載釘選到特定區域,可以在 Kubernetes 部署清單中直接指定區域端點。 這可確保特定區域中的叢集一律從其同地部署的複本提取資料,進而提供可預測的路由並降低延遲。

美國東部集群部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-eastus
spec:
  template:
    spec:
      containers:
      - name: myapp
        image: myregistry.eastus.geo.azurecr.io/myapp:v1

西歐集群部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-westeurope
spec:
  template:
    spec:
      containers:
      - name: myapp
        image: myregistry.westeurope.geo.azurecr.io/myapp:v1

透過在每個叢集的清單中使用不同的區域端點,你可以選擇確保每個叢集從其本地副本拉取資料,而非依賴 Azure 管理的路由。

如需使用 ACR 驗證 Azure Kubernetes Service (AKS) 的相關資訊,請參閱從 Azure Kubernetes Service 使用 Azure Container Registry 進行驗證。

使用區域端點搭配以 DNS 為基礎的路由,無需更改部署資訊清單

如果你不想在每個區域維護不同的部署清單,可以讓所有清單指向全域端點(myregistry.azurecr.io),並利用軟體定義網路或區域流量管理器,根據起始區域的流量將全域端點解析到適當的區域端點。 這能達成與區域端點相同的共置目標(可預測路由與降低延遲),同時不會在部署清單中嵌入區域專屬的網址。

如需使用 ACR 驗證 Azure Kubernetes Service (AKS) 的相關資訊,請參閱從 Azure Kubernetes Service 使用 Azure Container Registry 進行驗證。

從特定地理複本使用區域端點匯入

Azure Container Registry 支援從多個雲端供應商的來源登錄檔匯入映像檔。 如果匯入來源是 ACR,你只能從來源 ACR 的主區域匯入。 來源 ACR 的區域端點不支援作為匯入來源。 從來源 ACR 匯入時,指定來源 ACR 的全域端點。 此外,匯入總是將內容寫入下游 ACR 的主區域。 請參閱 Azure Container Registry 端點參考。

區域端點網路考量

防火牆規則

如果你使用 ACR 防火牆規則 或帶有區域端點的自訂防火牆,請設定防火牆規則允許存取:

終點 Purpose
myregistry.<region-name>.geo.azurecr.io 登錄作業的區域端點
myregistry.azurecr.io 全域端點(若同時使用)
myregistry.<region-name>.data.azurecr.io 層下載(若使用私有端點或專用資料端點)
*.blob.core.windows.net 層級下載(如果不是使用私有端點或專用資料端點)

私人端點

當虛擬網路內的登錄檔建立 私有端點 時,該私有端點資源會暴露多個虛擬網路私有 IP,涵蓋該登錄局 的所有 端點表面——全域端點、每個區域端點(若啟用區域端點)以及每個專用資料端點(設定私有端點時自動啟用)。

每個端點表面會消耗虛擬網路子網中的一個私有 IP 位址。 請依此規劃子網大小:

  • 1 IP 用於全域端點(myregistry.azurecr.io)
  • 1 IP 每個異地複寫複本用於專用資料端點 (myregistry.<region>.data.azurecr.io) — 在至少有一個私人端點的登錄上一律啟用
  • 每個地理複本 1 個 IP,供區域端點使用(myregistry.<region>.geo.azurecr.io)— 僅在已啟用區域端點時

範例:一個包含 3 個地理複本並啟用區域端點的登錄檔,需要每個私有端點資源 1(全域)+ 3(資料)+ 3(區域)= 7 個私人 IP 位址。 若無區域端點,同一登錄檔需 1 + 3 = 4 個私人 IP 位址。

如果有許多地理複本,當子網路中可用的 IP 位址耗盡時,建立私人端點可能會失敗。 欲了解更多資訊,請參閱 使用私人端點從虛擬網路私密連接登錄檔。

專用資料端點

當區域端點與專用資料端點同時啟用時 — 無論是明確啟用或透過設定至少一個私人端點自動啟用 — 來自區域端點的層 Blob 下載會自動重新導向到異地複寫複本的專用資料端點 (myregistry.<region-name>.data.azurecr.io)。 重定向始終停留在與區域端點 相同的區域 內——從 拉 myregistry.eastus.geo.azurecr.io 取 總是會重新導向到 myregistry.eastus.data.azurecr.io,從不會轉到不同區域的資料端點。

此同區域保證同樣適用於從全域端點拉取資料。 ACR 會將要求路由至對用戶端而言具有最佳網路效能設定檔的異地複寫複本,而提供的異地複寫複本會發出 307 重新導向,將要求重新導向至其專屬資料端點,絕不跨區域。

Tip

啟用專用資料端點以達到區域內最佳效能,並啟用專用 URL 用於層下載:

az acr update -n <registry-name> --data-endpoint-enabled true

欲了解更多資訊,請參閱Azure Container Registry中的專用資料端點。

端點參考

欲了解所有登錄端點類型、URL 格式及控制它們的 CLI 旗標的完整參考,請參見 Azure Container Registry端點參考。

故障排除

因 manifest 錯誤導致推送失敗

docker push是一連串 HTTP 要求:每一層的 blob 上傳,接著是依摘要參照這些層的資訊清單上傳。 有些 Linux DNS 解析器無法穩定快取回應。 如果附近區域有多個異地複寫複本,DNS 可能會在一次推送中解析到不同的複本 (DNS 跳轉),導致推送的資訊清單會參考已推送到不同異地複寫複本的層。 因為複本最終是一致的,資訊清單可能會落在尚未擁有其參考層的複本上,導致資訊清單確認失敗。

解決方案 (依偏好順序):

  1. 使用 區域端點,將推送全程鎖定至單一地理複寫節點。 每個子請求(登入、blob 上傳、manifest 上傳)都會送到同一個地理複本。 這是最簡潔的修正方式,也是對於任何重視推送/拉取一致性的管線所建議採用的方法。
  2. 使用短效的 DNS 快取,例如 dnsmasq,其作用範圍限於單次推送期間。 關於 Azure 中的 Linux 虛擬機,請參閱 DNS 名稱解析選項。 釘選應僅維持到這次推送完成,不應更久 — 不要為全域端點執行長期存在的 DNS 快取,因為這會干擾--global-endpoint-routing false以及健康狀態感知容錯移轉路由。
  3. 將發佈步驟設計為冪等,如此一來,即使因推送過程中發生失敗而觸發重試,仍可安全進行。

已啟用私人端點的登錄在建立異地複本時卡住

此問題通常發生在用來為已啟用私人端點的登錄建立異地複寫複本的身分識別沒有建立私人端點網路資源的足夠權限時。

解決方案:

  • 若要解決此問題,請手動刪除卡在佈建狀態的異地複本。
  • 之後,在建立異地複本之前,請確保該身分具有 Microsoft.Network/privateEndpoints/privateLinkServiceProxies/write 權限。
  • 也要確認每個連接到登錄檔的私有端點子網是否有空閒的 IP 容量。 如果任何已連線虛擬網路中的任何子網路沒有足夠的可用 IP 位址,複寫佈建就會失敗並回復。 複製品會短暫出現在某種 Creating 狀態,然後被移除。 產生的錯誤無法識別是哪個子網或虛擬網路被耗盡。 關於子網大小的指引,請參見 「使用私有端點私密連接登錄檔」。

在擁有靜態 IP 私有端點的登錄檔上,地理複製建立會失敗

當登錄的私有端點配置為 靜態 私有 IP 時,新增地理複本會失敗。

每個地理複製品都有自己的專用資料端點,該端點以成員身份在私有端點上公開,群組 ID registry 與成員名稱 registry_data_<region>為 。 當你新增一個地理複本時,ACR 會要求私有端點新增該區域資料端點的成員。 配置為動態 IP 分配的私有端點會自動分配新成員的 IP。 設定靜態 IP 配置的私有端點在建立時會定義固定的 IP 設定,且不會自動新增成員,因此複製建立失敗時會出現類似以下錯誤:

Failed to replicate private endpoint. Private Endpoint <id> contains static ipconfigurations:
[... GroupId: registry, MemberName: registry_data_<existing-region> ...] and it's missing these
membernames/groupids requested by Private Link service [GroupId: registry, MemberName:
registry_data_<new-region>, IpVersion: IPv4]. Private Endpoint needs to be reconfigured with
missing memberNames.

要檢查登錄機構私有端點的分配方法,請檢查 PrivateIPAllocationMethod 該私有端點網路介面上的 IP 配置。 私有端點會參考一個儲存這些 IP 配置的網路介面,因此先取得網路介面 ID,然後檢查其 IP 設定:

nicId=$(az network private-endpoint show \
  --name <private-endpoint-name> \
  --resource-group <resource-group-name> \
  --query "networkInterfaces[0].id" --output tsv)

az network nic show --ids "$nicId" \
  --query "ipConfigurations[].{Name:name, PrivateIPAddress:privateIPAddress, PrivateIPAllocationMethod:privateIPAllocationMethod}" \
  --output table

解決方案:

  • 如果您預期日後會新增異地複本,請對私有端點使用動態 IP 指派。 透過動態配置,ACR 會自動為每個新區域配置資料端點成員。 這是建議的方法。
  • 如果需要靜態 IP 分配,則在所有地理複本都存在後建立私有端點。 先新增每個地理複本,然後建立靜態 IP 私有端點,使其 IP 配置包含每個現有區域資料端點的成員。 建立靜態 IP 私有端點後,若不重新設定私有端點以新增新成員,就無法再新增地理複本。