部署至 Google Kubernetes Engine

本指南說明如何從 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 會使用下列預設值:

如果您已停用基本編輯者角色授予功能,請將 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 ExplorerLOG NAME: "container-runtime" 下方。

從公開 Artifact Registry 存放區提取

將映像檔部署至含有 containerd 節點的 GKE 叢集後,您可以使用 SSH 連線至 VM 執行個體,並執行 crictl 指令進行疑難排解。

公開 Artifact Registry 存放區不需要驗證。crictl 也可以用來提取私人 Artifact Registry 存放區中的映像檔。

控制台

  1. 前往 Google Cloud 控制台的「VM Instances」(VM 執行個體) 頁面

    前往 VM 執行個體

  2. 在虛擬機器執行個體清單中,找到您要連線的執行個體,然後點選該列中「SSH」SSH旁的箭頭。

    執行個體名稱旁邊的 SSH 按鈕。

  3. 從下拉式選單中選取「在瀏覽器視窗中開啟」或偏好的連線方式。

  4. Google Cloud 控制台會開啟新的終端機視窗。使用 crictl 從 Artifact Registry 提取映像檔:

    crictl pull IMAGE_LOCATION:TAG
    

    輸出內容如下:

    Image is up to date for sha256:0f25067aa9c180176967b4b50ed49eed096d43fa8c17be9a5fa9bff05933bee5

    從 Artifact Registry 私人存放區提取映像檔時,您必須向存放區進行驗證。您可以使用存取權杖提供憑證。

gcloud

  1. 確認您使用的是最新版 Google Cloud CLI

    gcloud components update
    
  2. 連線至 VM:

    gcloud compute ssh --project=PROJECT_ID \
     --zone=ZONE \
     VM_NAME
    

    更改下列內容:

    • PROJECT_ID:包含 VM 的專案 ID
    • ZONE:VM 所在的可用區名稱
    • VM_NAME:VM 的名稱

    如果已為 Google Cloud CLI 設定預設屬性,則可省略此指令中的 --project--zone 旗標。例如:

    gcloud compute ssh VM_NAME
    
  3. 如果您尚未建立 SSH 金鑰,SSH keygen 會為您產生金鑰。系統出現提示時,請輸入通關密語或留空。

  4. 使用 crictl 從 Artifact Registry 提取映像檔:

    crictl pull IMAGE_LOCATION:TAG
    
  5. 輸出內容如下:

    Image is up to date for sha256:0f25067aa9c180176967b4b50ed49eed096d43fa8c17be9a5fa9bff05933bee5

    從 Artifact Registry 私人存放區提取映像檔時,您必須向存放區進行驗證。您可以使用存取權杖提供憑證。

從私人 Artifact Registry 存放區提取

控制台

  1. 前往 Google Cloud 控制台的「VM Instances」(VM 執行個體) 頁面

    前往 VM 執行個體

  2. 在虛擬機器執行個體清單中,找到您要連線的執行個體,然後點選該列中「SSH」SSH旁的箭頭。

    執行個體名稱旁邊的 SSH 按鈕。

  3. 從下拉式選項中選取「在瀏覽器視窗中開啟」。

  4. 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"}
  5. 從傳回的輸出內容複製 access_token 的值,不要複製引號。

  6. 使用 crictl pull --creds 和上一步複製的 access_token 值,提取映像檔。

    crictl pull --creds "oauth2accesstoken:ACCESS_TOKEN" IMAGE_LOCATION:TAG

    輸出內容如下:

    Image is up to date for sha256:0f25067aa9c180176967b4b50ed49eed096d43fa8c17be9a5fa9bff05933bee5

gcloud

  1. 確認您使用的是最新版 Google Cloud CLI

    gcloud components update
    
  2. 連線至 VM:

    gcloud compute ssh --project=PROJECT_ID \
     --zone=ZONE \
     VM_NAME
    

    請替換下列變數:

    • PROJECT_ID:包含 VM 的專案 ID
    • ZONE:VM 所在的可用區名稱
    • VM_NAME:VM 的名稱

    如果已為 Google Cloud CLI 設定預設屬性,則可省略此指令中的 --project--zone 旗標。例如:

    gcloud compute ssh VM_NAME
    
  3. 如果您尚未建立 SSH 金鑰,SSH keygen 會為您產生金鑰。系統出現提示時,請輸入通關密語或留空。

  4. 使用 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"}
  5. 從傳回的輸出內容複製 access_token 的值,不要複製引號。

  6. 使用 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 偵錯說明文件