部署至 Google Kubernetes Engine

本指南說明如何從 Artifact Registry 提取映像檔,並部署至 Google Kubernetes Engine。如果您想部署至自架構或第三方 Kubernetes 服務,必須先設定驗證機制,才能從 Artifact Registry 擷取映像檔。 Google Cloud 如要從 Google Cloud 以外的 Kubernetes 工作負載驗證至 Google Cloud,請參閱「使用 Kubernetes 設定 Workload Identity 聯盟」。

Google Kubernetes Engine 可直接從 Docker 存放區提取映像檔。部分版本提供預先設定的支援功能,可從 Artifact Registry Docker 存放區提取映像檔。

需求條件

本節說明與 GKE 整合時的必要條件。

權限

建立節點集區或叢集時,GKE 會使用下列預設值:

如果您已停用授予基本編輯者角色的權限,請為 Compute Engine 預設服務帳戶授予「Artifact Registry Reader」角色 (roles/artifactregistry.reader)。

如果您使用這些預設值,並授予 Compute Engine 預設服務帳戶 Artifact Registry Reader 角色 (roles/artifactregistry.reader),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 不同的專案中,請授予 Artifact Registry 權限給 GKE 節點使用的服務帳戶。根據預設,節點會使用 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 (cos) 的 Container-Optimized OS 變化版本。

雖然 Docker 二進位檔可在使用 containerd 做為執行階段的 Linux 節點上使用,但我們不建議使用。Docker 不會管理 Kubernetes 在容器節點上執行的容器,因此您無法使用 Docker 指令或 Docker API 查看或與執行中的 Kubernetes 容器互動。

如要針對 Linux 節點進行偵錯或疑難排解,您可以利用專為 Kubernetes 容器執行階段建構的可攜式指令列工具 (crictl) 與 Containerd 互動。crictl 支援檢視容器和映像檔、讀取記錄檔,以及在容器中執行指令等常用功能。

詳情請參閱 crictl 使用者指南,以及 containerd 的 GKE 說明文件。

針對 Windows Server 節點,containerd 守護程序會以名為 containerd 的 Windows 服務形式執行。記錄檔可在下列記錄檔目錄中取得:C:\etc\kubernetes\logs\containerd.log,並會顯示在 記錄檔探索工具LOG NAME: "container-runtime" 下方。

從公開 Artifact Registry 存放區提取

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

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

控制台

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

    前往 VM 執行個體

  2. 在虛擬機器執行個體清單中,找到您要建立連線的執行個體,然後在該列中按一下 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 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 按鈕。

  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 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 偵錯說明文件