本指南說明如何從 Artifact Registry 提取映像檔,並部署至 Google Kubernetes Engine。如要部署至自行代管或第三方 Kubernetes 服務,您必須先設定 Google Cloud 的驗證機制,才能從 Artifact Registry 提取映像檔。如要從 Kubernetes 外部的工作負載向 Google Cloud 進行驗證,請參閱「使用 Kubernetes 設定 Workload Identity Federation」。 Google Cloud
Google Kubernetes Engine 可直接從 Docker 存放區提取映像檔。部分版本已預先設定支援,可從 Artifact Registry Docker 存放區提取映像檔。
需求條件
本節說明與 GKE 整合時的相關規定。
權限
建立節點集區或叢集時,GKE 會使用下列預設值:
- Compute Engine 預設服務帳戶是節點的身分。
-
視組織政策設定而定,系統可能會自動將專案的編輯者角色授予預設服務帳戶。強烈建議您 強制執行
iam.automaticIamGrantsForDefaultServiceAccounts機構政策限制,停用自動角色授予功能。如果組織是在 2024 年 5 月 3 日後建立,系統預設會強制執行這項限制。停用自動角色授予功能後,您必須決定要將哪些角色授予預設服務帳戶,然後自行授予這些角色。
如果預設服務帳戶已具備「編輯者」角色,建議您將「編輯者」角色替換為權限較少的角色。如要安全修改服務帳戶的角色,請使用 Policy Simulator 查看變更會造成的影響,然後授予及撤銷適當的角色。
- 使用預設服務帳戶建立的節點具有 Compute Engine 預設存取權範圍,包括儲存空間的唯讀存取權。您無法變更現有節點的存取權範圍。
如果您已停用基本編輯者角色授予功能,請將 Artifact Registry 讀取者角色 (roles/artifactregistry.reader) 授予 Compute Engine 預設服務帳戶。
如果您使用這些預設值,並將 Artifact Registry 讀取者角色 (roles/artifactregistry.reader) 授予 Compute Engine 預設服務帳戶,則 GKE 可以從相同 Google Cloud 專案中的 Artifact Registry 存放區提取映像檔。如需從節點推送映像檔、跨專案提取或推送映像檔、使用使用者提供的服務帳戶,或有其他預設設定不支援的需求,請參閱存取控管文件,瞭解如何設定存取權。
如果發生「權限遭拒」錯誤,請參閱4xx 錯誤。
GKE 版本
下表列出建立叢集所需的最低 GKE 版本,這些叢集具有從相同專案的 Docker 存放區提取容器的預設權限。
| 版本 | 最低修補程式需求 |
|---|---|
| 1.14 | 1.14.10-gke.22 |
| 1.15 | 1.15.9-gke.8 |
如果 GKE 版本低於最低版本,您必須設定 Kubernetes imagePullSecrets,才能讓 GKE 提取映像檔。
如果 GKE 與 Artifact Registry 位於不同專案,請授予 GKE 節點使用的服務帳戶 Artifact Registry 權限。根據預設,節點會使用 Compute Engine 預設服務帳戶。
執行映像檔
您可以使用下列指令,在 Google Kubernetes Engine 叢集中執行 Artifact Registry 映像檔:
kubectl run [NAME] --image=LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE:TAG
其中:
-
LOCATION是存放區的區域或多區域位置。 PROJECT是您的 Google Cloud 主控台專案 ID。 如果專案 ID 包含冒號 (:),請參閱「網域範圍專案」。REPOSITORY是儲存映像檔的存放區名稱。IMAGE是存放區中的映像檔名稱。TAG是您要提取的映像檔版本標記。
如要進一步瞭解 Kubernetes 指令,請參閱 kubectl 總覽。
排解 containerd 節點映像檔問題
從 GKE 節點 1.19 版開始,Linux 節點的預設節點映像檔為含有 containerd 的 Container-Optimized OS (cos_containerd) 子類,而非含有 Docker 的 Container-Optimized OS (cos) 子類。
雖然使用 containerd 做為執行階段的 Linux 節點上提供 Docker 二進位檔,但我們不建議使用。Docker 不會管理 Kubernetes 在 containerd 節點上執行的容器,因此您無法使用 Docker 指令或 Docker API 檢視或與執行的 Kubernetes 容器互動。
如要針對 Linux 節點進行偵錯或疑難排解,您可以利用專為 Kubernetes 容器執行階段建構的可攜式指令列工具 (crictl) 與 Containerd 互動。crictl 支援檢視容器和映像檔、讀取記錄,以及在容器中執行指令等常用功能。
詳情請參閱 crictl 使用手冊,以及 GKE 說明文件中的 containerd 主題。
如果是 Windows Server 節點,containerd daemon 會以名為 containerd 的 Windows 服務執行。記錄位於下列記錄目錄:
C:\etc\kubernetes\logs\containerd.log,並顯示在 Logs Explorer 的 LOG NAME: "container-runtime" 下方。
從公開 Artifact Registry 存放區提取
將映像檔部署至含有 containerd 節點的 GKE 叢集後,您可以使用 SSH 連線至 VM 執行個體,並執行 crictl 指令進行疑難排解。
公開 Artifact Registry 存放區不需要驗證。crictl
也可以用來提取私人 Artifact Registry 存放區中的映像檔。
控制台
前往 Google Cloud 控制台的「VM Instances」(VM 執行個體) 頁面。
在虛擬機器執行個體清單中,找到您要連線的執行個體,然後點選該列中「SSH」SSH旁的箭頭。

從下拉式選單中選取「在瀏覽器視窗中開啟」或偏好的連線方式。
Google Cloud 控制台會開啟新的終端機視窗。使用
crictl從 Artifact Registry 提取映像檔:crictl pull IMAGE_LOCATION:TAG
輸出內容如下:
Image is up to date for sha256:0f25067aa9c180176967b4b50ed49eed096d43fa8c17be9a5fa9bff05933bee5
從 Artifact Registry 私人存放區提取映像檔時,您必須向存放區進行驗證。您可以使用存取權杖提供憑證。
gcloud
確認您使用的是最新版 Google Cloud CLI
gcloud components update
連線至 VM:
gcloud compute ssh --project=PROJECT_ID \ --zone=ZONE \ VM_NAME
更改下列內容:
PROJECT_ID:包含 VM 的專案 IDZONE:VM 所在的可用區名稱VM_NAME:VM 的名稱
如果已為 Google Cloud CLI 設定預設屬性,則可省略此指令中的
--project與--zone旗標。例如:gcloud compute ssh VM_NAME
如果您尚未建立 SSH 金鑰,SSH keygen 會為您產生金鑰。系統出現提示時,請輸入通關密語或留空。
使用
crictl從 Artifact Registry 提取映像檔:crictl pull IMAGE_LOCATION:TAG
輸出內容如下:
Image is up to date for sha256:0f25067aa9c180176967b4b50ed49eed096d43fa8c17be9a5fa9bff05933bee5
從 Artifact Registry 私人存放區提取映像檔時,您必須向存放區進行驗證。您可以使用存取權杖提供憑證。
從私人 Artifact Registry 存放區提取
控制台
前往 Google Cloud 控制台的「VM Instances」(VM 執行個體) 頁面。
在虛擬機器執行個體清單中,找到您要連線的執行個體,然後點選該列中「SSH」SSH旁的箭頭。

從下拉式選項中選取「在瀏覽器視窗中開啟」。
Google Cloud 控制台會開啟新的終端機視窗。使用
curl產生 Compute Engine 服務帳戶存取權杖。curl -s "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" -H "Metadata-Flavor: Google"
輸出內容如下列範例所示:
"access_token":"ya29.c.KpkBCQgdwv6LrZ2tjrCpG6snWwPMX29LzMeUmAV_Hq_XaxUurfXcCfGZfASGh_KbdmUYTvkuV3sh-WaSBplEskdP6Tc HDsTv4B9hMyvoL4M9HrzKHuKTa1ZGj_3iQ1lwq_dAMxAPGjxEVKexatwN2KP0EAWyb6R55Cuu8ItgLf9f4pm9lC5zH4Qo0fkxPUsnCGRBe4AYxEpN6T sh","expires_in":3526,"token_type":"Bearer"}
從傳回的輸出內容複製
access_token的值,不要複製引號。使用
crictl pull --creds和上一步複製的access_token值,提取映像檔。crictl pull --creds "oauth2accesstoken:ACCESS_TOKEN" IMAGE_LOCATION:TAG
輸出內容如下:
Image is up to date for sha256:0f25067aa9c180176967b4b50ed49eed096d43fa8c17be9a5fa9bff05933bee5
gcloud
確認您使用的是最新版 Google Cloud CLI
gcloud components update
連線至 VM:
gcloud compute ssh --project=PROJECT_ID \ --zone=ZONE \ VM_NAME
請替換下列變數:
PROJECT_ID:包含 VM 的專案 IDZONE:VM 所在的可用區名稱VM_NAME:VM 的名稱
如果已為 Google Cloud CLI 設定預設屬性,則可省略此指令中的
--project與--zone旗標。例如:gcloud compute ssh VM_NAME
如果您尚未建立 SSH 金鑰,SSH keygen 會為您產生金鑰。系統出現提示時,請輸入通關密語或留空。
使用
curl產生 Compute Engine 服務帳戶存取權杖。curl -s "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" -H "Metadata-Flavor: Google"
輸出內容如下:
"access_token":"ya29.c.KpkBCQgdwv6LrZ2tjrCpG6snWwPMX29LzMeUmAV_Hq_XaxUurfXcCfGZfASGh_KbdmUYTvkuV3sh-WaSBplEskdP6Tc HDsTv4B9hMyvoL4M9HrzKHuKTa1ZGj_3iQ1lwq_dAMxAPGjxEVKexatwN2KP0EAWyb6R55Cuu8ItgLf9f4pm9lC5zH4Qo0fkxPUsnCGRBe4AYxEpN6T sh","expires_in":3526,"token_type":"Bearer"}
從傳回的輸出內容複製
access_token的值,不要複製引號。使用
crictl pull --creds和上一步複製的access_token值,提取映像檔。crictl pull --creds "oauth2accesstoken:ACCESS_TOKEN" IMAGE_LOCATION:TAG
輸出內容如下:
Image is up to date for sha256:0f25067aa9c180176967b4b50ed49eed096d43fa8c17be9a5fa9bff05933bee5
crictl 可讓開發人員偵錯執行階段,不必設定 Kubernetes 元件。如需完整指令清單,請參閱 crictl 說明文件和 Kubernetes 偵錯說明文件。