使用次要開機磁碟預先載入資料或容器映像檔

本頁面說明如何在 Google Kubernetes Engine (GKE) 中使用次要開機磁碟,在新節點上預先載入資料或容器映像檔,藉此縮短工作負載啟動延遲時間。這可讓工作負載快速冷啟動,並提升佈建資源的整體使用率。

閱讀本頁內容前,請先熟悉 Google Cloud、Kubernetes、容器、YAML、 containerd 執行階段和 Google Cloud CLI。

總覽

您可以設定具有次要開機磁碟的節點集區,這項功能適用於最新版 GKE。您可以指示 GKE 佈建節點,並預先載入資料,例如機器學習 (ML) 模型或容器映像檔。在次要磁碟中使用預先載入的容器映像檔或資料,可為工作負載帶來下列優點:

  • 提取大型容器映像檔或下載資料時,延遲時間縮短
  • 更快速的自動調度資源
  • 在維護事件和系統錯誤等中斷情況發生時,更快復原

以下各節說明如何在 GKE Autopilot 和 Standard 叢集中設定次要開機磁碟。

次要開機磁碟的運作方式

使用預先載入的容器映像檔或次要開機磁碟上的資料,可加快工作負載的啟動速度。次要開機磁碟具有下列特性:

  • 次要開機磁碟是永久磁碟,由分散式區塊儲存空間提供備份。
  • 永久磁碟是從您預先建立的磁碟映像檔例項化。
  • 基於可擴充性考量,每個節點都會從磁碟映像檔建立專屬的永久磁碟執行個體。節點刪除時,這些永久磁碟執行個體也會一併刪除。
  • 如果磁碟映像檔已在該區域中使用,後續從同一磁碟映像檔建立的所有磁碟,建立時間都會縮短。
  • 次要開機磁碟類型與節點開機磁碟相同。
  • 次要開機磁碟的大小取決於磁碟映像檔大小。

在節點集區中新增次要開機磁碟,通常不會增加節點佈建時間。GKE 會在節點佈建程序期間,從磁碟映像檔平行佈建次要開機磁碟。

最佳做法:

為支援預先載入的容器映像檔,GKE 會使用外掛程式擴充 containerd 執行階段,從次要開機磁碟讀取容器映像檔。容器映像檔會由基礎層重複使用。

將大型基礎層預先載入次要開機磁碟,而小型上層則可從容器登錄檔提取。

事前準備

開始之前,請務必先完成下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update 指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。

需求條件

使用次要開機磁碟時,必須符合下列需求:

  1. 使用支援的節點映像檔類型和 GKE 版本:
    • 擁有 containerd 的 Container-Optimized OS (COS_CONTAINERD):
      • GKE Standard 和 Autopilot:1.30.1-gke.1329000 以上版本。
    • 擁有 Containerd 的 Ubuntu (UBUNTU_CONTAINERD):
      • GKE Standard 和 Autopilot:1.35.0-gke.1403000 以上版本。
  2. 修改磁碟映像檔時,您必須建立新的節點集區。不支援更新現有節點上的磁碟映像檔。
  3. 設定映像檔串流,使用次要開機磁碟功能。
  4. 準備磁碟映像檔,其中包含建構時間可用的資料,或預先載入的容器映像檔。請確保叢集可以存取磁碟映像檔,以便載入節點。

    最佳做法:

    在 CI/CD 管道中自動建立磁碟映像檔。

限制

您無法更新現有節點的次要開機磁碟。如要附加新的磁碟映像檔,請建立新的節點集區。

定價

建立具有次要開機磁碟的節點集區時,GKE 會將永久磁碟附加至節點集區中的每個節點。永久磁碟的計費方式是根據 Compute Engine 磁碟定價。

準備次要開機磁碟映像檔

如要準備次要開機磁碟映像檔,請選擇「映像檔」分頁預先載入容器映像檔,或選擇「資料」分頁預先載入資料,然後完成下列操作說明:

圖片

GKE 提供名為 gke-disk-image-builder 的工具,可建立虛擬機器 (VM)、從磁碟提取容器映像檔,然後從該磁碟建立磁碟映像檔。

如要建立含有多個預先載入容器映像檔的磁碟映像檔,請完成下列步驟:

  1. 建立 Cloud Storage bucket,儲存 gke-disk-image-builder 的執行記錄。
  2. 使用 gke-disk-image-builder 建立磁碟映像檔。
go run ./cli \
    --project-name=PROJECT_ID \
    --image-name=DISK_IMAGE_NAME \
    --zone=LOCATION \
    --gcs-path=gs://LOG_BUCKET_NAME \
    --disk-size-gb=10 \
    --container-image=docker.io/library/python:latest \
    --container-image=docker.io/library/nginx:latest

更改下列內容:

  • PROJECT_ID:您 Google Cloud 專案的名稱。
  • DISK_IMAGE_NAME:磁碟映像檔的名稱。例如:nginx-python-image。
  • LOCATION:叢集位置。
  • LOG_BUCKET_NAME:用於儲存執行記錄的 Cloud Storage bucket 名稱。例如:gke-secondary-disk-image-logs/。

使用 gke-disk-image-builder 建立磁碟映像檔時,Google Cloud 會建立多項資源來完成程序 (例如 VM 執行個體、暫時磁碟和永久磁碟)。執行完畢後,映像檔建構工具會清除所有資源,您建立的磁碟映像檔除外。

資料

完成下列步驟,建立自訂磁碟映像檔做為資料來源:

  1. 建立具備空白磁碟的 VM。
  2. 使用 SSH 連線至 VM。
    1. 掛接空白磁碟。
    2. 將資料下載到空白磁碟。
  3. 從磁碟建立自訂映像檔。

設定次要開機磁碟

您可以在 GKE Autopilot 或 Standard 叢集中設定次要開機磁碟。

最佳做法:

使用 Autopilot 叢集,享有全代管 Kubernetes 體驗。如要選擇最適合工作負載的 GKE 作業模式,請參閱「選擇 GKE 作業模式」。

使用 GKE Autopilot

在本節中,您將建立磁碟映像檔許可清單,允許現有 GKE Autopilot 叢集中的磁碟映像檔。接著,您會修改 Pod 節點選取器,以使用次要開機磁碟。

允許專案中的磁碟映像檔

在本節中,您將建立 GCPResourceAllowlist,允許 GKE 從Google Cloud 專案中的磁碟映像檔,建立具有次要開機磁碟的節點。

  1. 將下列資訊清單儲存為 allowlist-disk.yaml:

    apiVersion: "node.gke.io/v1"
    kind: GCPResourceAllowlist
    metadata:
      name: gke-secondary-boot-disk-allowlist
    spec:
      allowedResourcePatterns:
      - "projects/PROJECT_ID/global/images/.*"
    

    將 PROJECT_ID 替換為專案 ID,以代管磁碟映像檔。

  2. 套用資訊清單:

    kubectl apply -f allowlist-disk.yaml
    

    GKE 會從專案中的所有磁碟映像檔,建立具有次要開機磁碟的節點。

更新 Pod 節點選取器,以使用次要開機磁碟

在本節中,您會修改 Pod 規格,讓 GKE 使用次要開機磁碟建立節點。

  1. 在 Pod 範本中新增 nodeSelector:

    nodeSelector:
        cloud.google.com.node-restriction.kubernetes.io/gke-secondary-boot-disk-DISK_IMAGE_NAME: CONTAINER_IMAGE_CACHE.PROJECT_ID
    

    更改下列內容:

    • DISK_IMAGE_NAME:磁碟映像檔名稱。
    • PROJECT_ID:用於存放磁碟映像檔的專案 ID。
  2. 使用 kubectl apply 指令,透過 Pod 範本套用 Kubernetes 規格。

  3. 確認次要開機磁碟快取正在使用中:

    kubectl get events --all-namespaces
    

    輸出結果會與下列內容相似:

    75s         Normal      SecondaryDiskCachin
    node/gke-pd-cache-demo-default-pool-75e78709-zjfm   Image
    gcr.io/k8s-staging-jobsejt/pytorch-mnist:latest is backed by secondary disk cache
    
  4. 如要更可靠地確認是否使用次要開機磁碟快取,請按照下列步驟操作:

    使用這個記錄名稱,從您感興趣的節點查詢記錄:

    logName="projects/PROJECT_ID/logs/gcfs-snapshotter"
    

    將 PROJECT_ID 替換為 Google Cloud 專案 ID。

    類似於 Image gcr.io/k8s-staging-jobsejt/pytorch-mnist:latest is backed by secondary boot disk caching by 100.0%... 的記錄表示已使用次要開機磁碟快取。

  5. 檢查映像檔提取延遲時間:

    kubectl describe pod POD_NAME
    

    將 POD_NAME 替換為 Pod 名稱。

    輸出結果會與下列內容相似:

    …
      Normal  Pulled     15m   kubelet            Successfully pulled image "docker.io/library/nginx:latest" in 0.879149587s
    …
    

無論映像檔大小為何,快取容器映像檔的預期映像檔提取延遲時間應會大幅縮短。

使用 GKE Standard

如要建立 GKE Standard 叢集和節點集區,請完成下列操作說明,並根據您是否要將容器映像檔或資料預先載入次要開機磁碟,選擇「映像檔」或「資料」分頁:

圖片

如要設定次要開機磁碟,請使用 Google Cloud CLI 或 Terraform:

gcloud

  1. 建立啟用映像檔串流的 GKE Standard 叢集:

    gcloud container clusters create CLUSTER_NAME \
        --location=LOCATION \
        --cluster-version=VERSION \
        --enable-image-streaming
    

    更改下列內容:

    • CLUSTER_NAME:叢集名稱。
    • LOCATION:叢集位置。
    • VERSION:要使用的 GKE 版本。GKE 版本必須為 1.28.3-gke.1067000 以上。
  2. 在同一個專案中,建立具有次要開機磁碟的節點集區:

    gcloud container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location LOCATION \
    --enable-image-streaming \
    --secondary-boot-disk=disk-image=global/images/DISK_IMAGE_NAME,mode=CONTAINER_IMAGE_CACHE
    

    更改下列內容:

    • NODE_POOL_NAME:節點集區的名稱。
    • CLUSTER_NAME:現有叢集的名稱。
    • LOCATION:叢集的運算可用區,以半形逗號分隔。
    • DISK_IMAGE_NAME:磁碟映像檔名稱。

    如要使用其他專案中的磁碟映像檔建立具有次要開機磁碟的節點集區,請完成「使用其他專案中的次要開機磁碟」一節中的步驟。

  3. 在 Pod 範本中新增 nodeSelector:

    nodeSelector:
        cloud.google.com/gke-nodepool: NODE_POOL_NAME
    
  4. 確認次要開機磁碟快取正在使用中:

    kubectl get events --all-namespaces
    

    輸出結果會與下列內容相似:

    75s       Normal      SecondaryDiskCachin
    node/gke-pd-cache-demo-default-pool-75e78709-zjfm Image
    gcr.io/k8s-staging-jobsejt/pytorch-mnist:latest is backed by secondary disk cache
    
  5. 如要更可靠地確認是否使用次要開機磁碟快取,請按照下列步驟操作:

    使用這個記錄名稱,從您感興趣的節點查詢記錄:

    logName="projects/PROJECT_ID/logs/gcfs-snapshotter"
    

    將 PROJECT_ID 替換為 Google Cloud 專案 ID。

    類似於 Image gcr.io/k8s-staging-jobsejt/pytorch-mnist:latest is backed by secondary boot disk caching by 100.0%... 的記錄表示已使用次要開機磁碟快取。

  6. 執行下列指令,檢查映像檔提取延遲時間:

    kubectl describe pod POD_NAME
    

    將 POD_NAME 替換為 Pod 名稱。

    輸出結果會與下列內容相似:

    …
      Normal  Pulled     15m   kubelet            Successfully pulled image "docker.io/library/nginx:latest" in 0.879149587s
    …
    

無論映像檔大小為何,快取容器映像檔的預期映像檔提取延遲時間應不超過幾秒。

Terraform

  1. 如要使用 Terraform 建立含有預設節點集區的叢集,請參閱下列範例:

    resource "google_container_cluster" "default" {
      name               = "default"
      location           = "us-central1-a"
      initial_node_count = 1
    
      # secondary_boot_disks require GKE 1.28.3-gke.106700 or later, which should
      # be true for all release channels apart from EXTENDED.
      # If required, Use `release_channel = "EXTENDED"` and set `min_master_version`.
    }
  2. 在同一個專案中,建立具有次要開機磁碟的節點集區:

    resource "google_container_node_pool" "secondary-boot-disk-container" {
      name               = "secondary-boot-disk-container"
      location           = "us-central1-a"
      cluster            = google_container_cluster.default.name
      initial_node_count = 1
    
      node_config {
        machine_type = "e2-medium"
        image_type   = "COS_CONTAINERD"
        gcfs_config {
          enabled = true
        }
        secondary_boot_disks {
          disk_image = ""
          mode       = "CONTAINER_IMAGE_CACHE"
        }
      }
    }

    如要進一步瞭解如何使用 Terraform,請參閱「GKE 的 Terraform 支援」。

  3. 在 Pod 範本中新增 nodeSelector:

    nodeSelector:
        cloud.google.com/gke-nodepool: NODE_POOL_NAME
    
  4. 確認次要開機磁碟快取正在使用中:

    kubectl get events --all-namespaces
    

    輸出結果會與下列內容相似:

    75s       Normal      SecondaryDiskCachin
    node/gke-pd-cache-demo-default-pool-75e78709-zjfm Image
    gcr.io/k8s-staging-jobsejt/pytorch-mnist:latest is backed by secondary disk cache
    
  5. 執行下列指令,檢查映像檔提取延遲時間:

    kubectl describe pod POD_NAME
    

    將 POD_NAME 替換為 Pod 名稱。

    輸出結果會與下列內容相似:

    …
      Normal  Pulled     15m   kubelet            Successfully pulled image "docker.io/library/nginx:latest" in 0.879149587s
    …
    

無論映像檔大小為何,快取容器映像檔的預期映像檔提取延遲時間應不超過幾秒。

如要進一步瞭解如何使用 Terraform,請參閱「GKE 的 Terraform 支援」。

資料

您可以使用 Google Cloud CLI 或 Terraform 設定次要開機磁碟並預先載入資料:

gcloud

  1. 建立啟用映像檔串流的 GKE Standard 叢集:

    gcloud container clusters create CLUSTER_NAME \
        --location=LOCATION \
        --cluster-version=VERSION \
        --enable-image-streaming
    

    更改下列內容:

    • CLUSTER_NAME:叢集名稱。
    • LOCATION:叢集位置。
    • VERSION:要使用的 GKE 版本。GKE 版本必須為 1.28.3-gke.1067000 以上。
  2. 使用 --secondary-boot-disk 旗標建立具有次要開機磁碟的節點集區:

    gcloud container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location LOCATION \
    --enable-image-streaming \
    --secondary-boot-disk=disk-image=global/images/DISK_IMAGE_NAME
    

    更改下列內容:

    • NODE_POOL_NAME:節點集區的名稱。
    • CLUSTER_NAME:現有叢集的名稱。
    • LOCATION:叢集的運算可用區,以半形逗號分隔。
    • DISK_IMAGE_NAME:磁碟映像檔名稱。

    如要使用其他專案中的磁碟映像檔建立具有次要開機磁碟的節點集區,請完成「使用其他專案中的次要開機磁碟」一節中的步驟。

    GKE 會建立節點集區,每個節點都有預先載入資料的次要磁碟。GKE 會在節點上連結並掛接次要開機磁碟。

  3. 如要存取資料,請使用 hostPath 磁碟區掛接,在 Pod 容器中掛接次要開機磁碟映像檔。將 /usr/local/data_path_sbd 設為容器中要存放資料的路徑:

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-name
    spec:
      containers:
      ...
        volumeMounts:
        - mountPath: /usr/local/data_path_sbd
          name: data-path-sbd
      ...
      volumes:
      - name: data-path-sbd
        hostPath:
          path: /mnt/disks/gke-secondary-disks/gke-DISK_IMAGE_NAME-disk
    

    將 DISK_IMAGE_NAME 換成磁碟映像檔名稱。

Terraform

  1. 如要使用 Terraform 建立含有預設節點集區的叢集,請參閱下列範例:

    resource "google_container_cluster" "default" {
      name               = "default"
      location           = "us-central1-a"
      initial_node_count = 1
    
      # secondary_boot_disks require GKE 1.28.3-gke.106700 or later, which should
      # be true for all release channels apart from EXTENDED.
      # If required, Use `release_channel = "EXTENDED"` and set `min_master_version`.
    }
  2. 在同一個專案中,建立具有次要開機磁碟的節點集區:

    resource "google_container_node_pool" "secondary-boot-disk-data" {
      name               = "secondary-boot-disk-data"
      location           = "us-central1-a"
      cluster            = google_container_cluster.default.name
      initial_node_count = 1
    
      node_config {
        machine_type = "e2-medium"
        image_type   = "COS_CONTAINERD"
        gcfs_config {
          enabled = true
        }
        secondary_boot_disks {
          disk_image = ""
        }
      }
    }

    如要進一步瞭解如何使用 Terraform,請參閱「GKE 的 Terraform 支援」。

  3. 如要存取資料,請使用 hostPath 磁碟區掛接,在 Pod 容器中掛接次要開機磁碟映像檔。將 /usr/local/data_path_sbd 設為容器中要存放資料的路徑:

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-name
    spec:
      containers:
      ...
        volumeMounts:
        - mountPath: /usr/local/data_path_sbd
          name: data-path-sbd
      ...
      volumes:
      - name: data-path-sbd
        hostPath:
          path: /mnt/disks/gke-secondary-disks/gke-DISK_IMAGE_NAME-disk
    

    將 DISK_IMAGE_NAME 替換為磁碟映像檔名稱。

使用次要開機磁碟進行叢集自動調度資源

如要建立節點集區,並在次要開機磁碟上設定叢集自動調度資源,請使用 Google Cloud CLI:

  gcloud container node-pools create NODE_POOL_NAME \
      --cluster=CLUSTER_NAME \
      --location LOCATION \
      --enable-image-streaming \
      --secondary-boot-disk=disk-image=global/images/DISK_IMAGE_NAME,mode=CONTAINER_IMAGE_CACHE \
      --enable-autoscaling \
      --num-nodes NUM_NODES \
      --min-nodes MIN_NODES \
      --max-nodes MAX_NODES

更改下列內容:

  • NODE_POOL_NAME:節點集區的名稱。
  • CLUSTER_NAME:現有叢集的名稱。
  • LOCATION:叢集的運算可用區,以半形逗號分隔。
  • DISK_IMAGE_NAME:磁碟映像檔名稱。
  • MIN_NODES:每個可用區中,指定節點集區的自動調度節點數量下限。如要在 GKE 1.24 以上版本中,為整個節點集區指定節點數量下限,請使用 --total-min-nodes。旗標 --total-min-nodes 和 --total-max-nodes 與旗標 --min-nodes 和 --max-nodes 互斥。
  • MAX_NODES:每個可用區中,指定節點集區可自動調度的節點數量上限。如要在 GKE 1.24 以上版本中,為整個節點集區指定節點數量上限,請使用 --total-max-nodes。旗標 --total-min-nodes 和 --total-max-nodes 與旗標 --min-nodes 和 --max-nodes 互斥。

使用次要開機磁碟自動佈建節點

在 GKE 1.30.1-gke.1329000 以上版本中,您可以設定自動佈建節點,自動建立及刪除節點集區,以滿足工作負載的資源需求。

  1. 為 GKE 自動佈建節點功能建立次要開機磁碟的磁碟映像檔許可清單自訂資源,類似於下列項目:

    apiVersion: "node.gke.io/v1"
    kind: GCPResourceAllowlist
    metadata:
      name: gke-secondary-boot-disk-allowlist
    spec:
      allowedResourcePatterns:
      - "projects/<PROJECT_ID>/global/images/.*"
    

    將 PROJECT_ID 替換為專案 ID,以託管磁碟映像檔。

  2. 在叢集中部署允許清單自訂資源,請執行下列指令:

    kubectl apply -f ALLOWLIST_FILE
    

    將 ALLOWLIST_FILE 替換為資訊清單檔案名稱。

  3. 更新 Pod 節點選取器,使用次要開機磁碟:

    nodeSelector:
        cloud.google.com.node-restriction.kubernetes.io/gke-secondary-boot-disk-DISK_IMAGE_NAME:CONTAINER_IMAGE_CACHE.PROJECT_ID
    

    更改下列內容:

    • DISK_IMAGE_NAME:磁碟映像檔名稱。
    • PROJECT_ID:用於存放磁碟映像檔的專案 ID。

使用其他專案中的次要開機磁碟

使用次要開機磁碟建立節點集區時,您可以透過 --secondary-boot-disk 旗標,告知 GKE 使用不同專案中的磁碟映像檔。

  1. 使用 --secondary-boot-disk 旗標,從不同專案的磁碟映像檔建立具有次要開機磁碟的節點集區。例如:

    gcloud beta container node-pools create NODE_POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location LOCATION \
        --enable-image-streaming \
        --secondary-boot-disk=disk-image=projects/IMAGE_PROJECT_ID/global/images/DISK_IMAGE_NAME,mode=CONTAINER_IMAGE_CACHE
    
    

    更改下列內容:

    • DISK_IMAGE_NAME:磁碟映像檔名稱。
    • IMAGE_PROJECT_ID:磁碟映像檔所屬專案的名稱。

    GKE 會建立節點集區,每個節點都有預先載入資料的次要磁碟。GKE 會將次要開機磁碟連接並掛接到節點。

  2. 如要授予不同專案所屬磁碟映像檔的存取權,請為叢集服務帳戶新增「Compute Image User」(Compute 映像檔使用者) 角色:

    • 預設的運算服務帳戶:CLUSTER_PROJECT_NUMBER@cloudservices.gserviceaccount.com
    • GKE 服務帳戶:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com
    gcloud projects add-iam-policy-binding IMAGE_PROJECT_ID \
        --member serviceAccount:CLUSTER_PROJECT_NUMBER@cloudservices.gserviceaccount.com \
        --role roles/compute.imageUser
    
    gcloud projects add-iam-policy-binding IMAGE_PROJECT_ID \
        --member serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com \
        --role roles/compute.imageUser
    

後續步驟