佈建及使用混合本機 SSD,用於原始區塊和暫時儲存空間

本文說明如何在 Google Kubernetes Engine (GKE) 中佈建及分區本機 SSD,以支援在同一個節點上,同時需要標準臨時儲存空間檔案系統和未格式化原始區塊儲存空間的工作負載。

這項設定適用於有狀態應用程式和高度最佳化的資料庫。這類工作負載通常需要直接存取磁碟,才能提高效能,但也需要標準臨時檔案儲存空間,用於 sidecar、記錄或容器快取。使用混合本機 SSD 容量,就不必將獨立節點或完整磁碟專門用於原始區塊基礎架構,因此可減少叢集管理負擔,並充分運用硬體。

建立具有混合本機 SSD 容量的叢集或節點集區時,GKE 會按照下列方式,對每個實體連接的本機 SSD 進行分區:

  • 暫時儲存空間:要求的暫時容量會平均分配到各個本機 SSD,並合併提供節點的標準暫時檔案儲存空間。如果臨時容量分散在多個本機 SSD,儲存空間會合併為 RAID-0 陣列。您可以使用標準 emptyDir 磁碟區存取臨時儲存空間。
  • 原始區塊儲存空間:每個磁碟上剩餘的實體容量會以不同的未格式化原始區塊裝置形式呈現給節點。

本文適用對象為平台管理員、操作人員和開發運作人員,說明如何針對特殊工作負載,在 GKE 中最佳化硬體使用率和儲存空間效能。

注意事項

除了 Compute Engine 本機 SSD 限制之外,設定混合本機 SSD 模式前,請先詳閱下列 GKE 專屬注意事項:

  • Autopilot 相容性:GKE Autopilot 叢集不支援混合原始區塊和臨時儲存空間。如要瞭解如何在 Autopilot 中使用本機 SSD 做為標準臨時儲存空間,請參閱「Autopilot 叢集中的本機 SSD」。
  • 自訂 ComputeClass:自訂 ComputeClass 不支援混合本機 SSD 設定。
  • 作業系統:混合本機 SSD 模式僅支援 Linux 節點映像檔 (Container-Optimized OS 和 Ubuntu)。不支援 Windows Server 節點集區。
  • 維護事件:不建議將本機 SSD 做為儲存空間最佳化 Z3 或 Z4D VM 的原始區塊儲存空間。這些 VM 上的資料可能無法在維護事件中保留。詳情請參閱「佈建及使用本機 SSD 支援的原始區塊儲存空間」。
  • 共用 I/O:由於臨時 RAID-0 陣列和目標原始區塊分區都依賴相同的基礎實體 SSD,因此對一個邏輯分區進行密集作業可能會影響另一個分區的處理量。如要瞭解處理量上限,請參閱「本機 SSD 效能」。
  • 定價:使用混合模式分割本機 SSD 容量時,無論暫時性儲存空間和原始區塊儲存空間分配到的容量為何,您都必須支付節點附加的基礎實體本機 SSD 總容量費用。詳情請參閱「本機 SSD 定價」。
  • 手動設定:如要使用本機 SSD 支援的原始區塊儲存空間,您必須手動設定裝置,因為 GKE 不會格式化或掛接原始區塊分區。您也必須負責管理節點容量,以及處理共置工作負載可能造成的中斷情形。使用本機 PersistentVolume 物件可提供整合式 Pod 排程。如果工作負載不需要在 Pod 生命週期內保留資料,或沒有特殊效能需求,請改用完全暫時性的本機 SSD 設定。完全臨時設定適用於大多數用途。
  • 節點記憶體交換:您可以使用開機磁碟設定檔或臨時本機 SSD 設定檔,將混合本機 SSD 容量與節點記憶體交換功能結合。專用本機 SSD 設定檔不支援混合本機 SSD 容量。詳情請參閱「節點記憶體交換與混合本機 SSD 容量」。

事前準備

開始之前,請確認您已執行下列工作:

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

如要使用這項功能,GKE 節點必須執行 1.37.0-gke.3570000 以上版本。

必要的角色

如要取得建立叢集和節點集區所需的權限,並混合使用本機 SSD 容量,請要求管理員授予您專案的 Kubernetes Engine 管理員 (roles/container.admin) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

建立混合本機 SSD 儲存空間的叢集或節點集區

您可以使用 --ephemeral-storage-local-ssd 旗標的 capacity 屬性,分配暫時容量並保留原始區塊失聯。

使用 --ephemeral-storage-local-ssd 旗標指定 capacity 子欄位,建立叢集或節點集區。

如果機器類型允許設定本機 SSD 數量,您也必須指定 count 子欄位。如果機型的本機 SSD 數量固定 (例如 -lssd 類型),則可省略 count 子欄位,因為 GKE 會根據 VM 形態自動計算磁碟數量。

建立混合本機 SSD 儲存空間的叢集

如要建立新的叢集,請使用 gcloud container clusters create 指令。這些設定僅適用於預設節點集區。如果後續節點集區需要混合本機 SSD 儲存空間,請在建立節點集區時指定 --ephemeral-storage-local-ssd 旗標。可連接的磁碟數量上限因機型和區域而異。

如果叢集版本早於 1.37.0-gke.3570000,請在下列叢集建立指令中新增下列其中一個旗標:

  • --cluster-version=<var>VERSION</var> 旗標,且 <var>VERSION</var> 設為 1.37.0-gke.3570000 以上版本,或
  • --release-channel=rapid 標記。

如果機器類型的本機 SSD 數量可設定,請執行下列指令:

gcloud container clusters create CLUSTER_NAME \
    --machine-type=MACHINE_TYPE \
    --ephemeral-storage-local-ssd count=NUMBER_OF_DISKS,capacity=CAPACITY

如果機器類型的本機 SSD 數量固定,請執行下列指令:

gcloud container clusters create CLUSTER_NAME \
    --machine-type=MACHINE_TYPE \
    --ephemeral-storage-local-ssd capacity=CAPACITY

更改下列內容:

  • CLUSTER_NAME:要建立的叢集名稱。
  • MACHINE_TYPE:要使用的機器類型。如需支援的機器類型清單,請參閱「機器系列支援」。您無法搭配使用本機 SSD 和預設 e2-medium 機型,因為共用核心機型不支援本機 SSD。
  • NUMBER_OF_DISKS:如果機器類型的本機 SSD 數量可設定,則為要在每個節點上佈建的本機 SSD 磁碟數量。
  • CAPACITY:要格式化為臨時儲存空間的本機 SSD 總容量。這個值必須大於 0,且絕對小於實體本機 SSD 總容量 (磁碟數量 × 每個磁碟的大小),例如 200GB。注意事項:

    • 叢集建立後即無法變更這個值。
    • GKE 會保留部分容量供系統使用,因此可分配的臨時儲存空間會少於 CAPACITY。詳情請參閱「本機暫時儲存空間預留」。

建立混合本機 SSD 儲存空間的節點集區

如要將節點集區新增至現有叢集,請使用 gcloud container node-pools create 指令。

如果節點集區的版本早於 1.37.0-gke.3570000,請務必執行下列操作:

  • 在下列節點集區建立指令中加入 --node-version=<var>VERSION</var> 旗標,並將 <var>VERSION</var> 設為 1.37.0-gke.3570000 以上版本。
  • 確認叢集控制層為 1.37.0-gke.3570000 以上版本。

如果機器類型的本機 SSD 數量可設定,請執行下列指令:

gcloud container node-pools create POOL_NAME \
    --cluster=CLUSTER_NAME \
    --machine-type=MACHINE_TYPE \
    --ephemeral-storage-local-ssd count=NUMBER_OF_DISKS,capacity=CAPACITY

如果機器類型的本機 SSD 數量固定,請執行下列指令:

gcloud container node-pools create POOL_NAME \
    --cluster=CLUSTER_NAME \
    --machine-type=MACHINE_TYPE \
    --ephemeral-storage-local-ssd capacity=CAPACITY

更改下列內容:

  • POOL_NAME:要建立的新節點集區名稱。
  • CLUSTER_NAME:叢集名稱。
  • MACHINE_TYPE:要使用的機器類型。如需支援的機器類型清單,請參閱「機器系列支援」。您無法搭配使用本機 SSD 和預設 e2-medium 機型,因為共用核心機型不支援本機 SSD。
  • NUMBER_OF_DISKS:如果機器類型的本機 SSD 數量可設定,則為要在每個節點上佈建的本機 SSD 磁碟數量。
  • CAPACITY:要格式化為臨時儲存空間的本機 SSD 總容量。這個值必須大於 0,且絕對小於實體本機 SSD 總容量 (磁碟數量 × 每個磁碟的大小),例如 200GB。注意事項:

    • 節點集區建立後即無法變更這個值。
    • GKE 會保留部分容量供系統使用,因此可分配的臨時儲存空間會少於 CAPACITY。詳情請參閱「本機暫時儲存空間預留」。

驗證節點標籤

佈建完成後,請執行下列指令,確認節點的臨時和原始區塊儲存空間標籤正確無誤:

kubectl describe node NODE_NAME

輸出內容應包含下列兩個節點標籤:

  • cloud.google.com/gke-ephemeral-storage-local-ssd: "true"
  • cloud.google.com/gke-local-nvme-ssd-partition: "true"

存取暫時容量

透過 emptyDir 磁碟區存取預留的臨時儲存空間,就像存取任何其他 GKE 臨時磁碟區一樣。

存取原始區塊容量

如要存取原始區塊容量,請建立 StorageClass 物件、佈建本機 PersistentVolume 物件,並使用 PersistentVolumeClaim 物件宣告該物件。

建立 StorageClass

由於您在佈建 PersistentVolume 物件時未使用社群靜態佈建工具,建議您使用 volumeBindingMode: WaitForFirstConsumer 欄位建立 StorageClass 物件。這會延遲繫結,直到 Pod 排程完成,確保 Kubernetes 從可執行 Pod 的適當節點選擇本機 SSD。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: "local-storage"
provisioner: "kubernetes.io/no-provisioner"
volumeBindingMode: "WaitForFirstConsumer"

建立 PersistentVolume

本機 PersistentVolume 物件在節點升級、資源調度和叢集自動調度資源方面有重要限制。建立磁碟區前,請先詳閱本機 PersistentVolume 的限制,瞭解生命週期事件對資料的影響。

如要建立 PersistentVolume 物件,請完成下列步驟,找出本機 SSD 分區的符號連結路徑、判斷確切的剩餘容量,並設定資訊清單。

找出分區容量

在目標節點上執行下列指令,找出分區剩餘的確切原始區塊容量。

kubectl debug node/NODE_NAME -it --image=ubuntu -- \
    sh -c 'ls -l /host/dev/disk/by-id/ | grep partition; lsblk -o NAME,SIZE,TYPE'

將 NODE_NAME 替換為連接本機 SSD 的節點名稱。

輸出內容會顯示裝置名稱和分區符號連結之間的對應關係,方便您確認哪個分區對應到哪個裝置。此外,也會列出連接至節點的區塊裝置及其大小。

舉例來說,如果您將兩個本機 SSD 連接至節點,並將 200 GB 分配給臨時儲存空間 (capacity=200GB),輸出內容會與下列內容類似:

google-local-ssd-partition0 -> /dev/nvme0n1p2
google-local-ssd-partition1 -> /dev/nvme0n2p2
NAME          SIZE TYPE
...
nvme0n1       375G disk
|-nvme0n1p1   100G part
| `-md0     199.9G raid0
`-nvme0n1p2   275G part
nvme0n2       375G disk
|-nvme0n2p1   100G part
| `-md0     199.9G raid0
`-nvme0n2p2   275G part

請記下 google-local-ssd-partition 符號連結與基礎裝置名稱之間的對應關係,以及該分區的大小。在 PersistentVolume 資訊清單中,您會將大小設為 PARTITION_SIZE,並將符號連結路徑設為 LOCAL_SSD_SYMLINK_PATH。

舉例來說,在上述輸出內容中,/dev/disk/by-id/google-local-ssd-partition0 符號連結指向 nvme0n1p2 分區,其大小為 275G。

kubectl debug 指令會在預設命名空間中留下一個臨時 Pod。為避免這個 Pod 耗用資源,請執行下列指令刪除 Pod:

kubectl delete pod DEBUG_POD_NAME

將 DEBUG_POD_NAME 替換為 kubectl debug 指令建立的 Pod 名稱,該名稱會在您執行指令時顯示。

設定 PersistentVolume 資訊清單

使用找到的分區大小設定磁碟區資訊清單。本機磁碟區必須提供 nodeAffinity 欄位。這有助於確保 Kubernetes 將宣告這個磁碟區的 Pod 排定至實際連接本機 SSD 的特定節點。以下範例顯示原始區塊本機 SSD 分區的資訊清單:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: "example-local-pv"
spec:
  capacity:
    storage: PARTITION_SIZE
  accessModes:
  - "ReadWriteOnce"
  volumeMode: "Block"
  persistentVolumeReclaimPolicy: "Retain"
  storageClassName: "local-storage"
  local:
    path: "LOCAL_SSD_SYMLINK_PATH"
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: "kubernetes.io/hostname"
          operator: "In"
          values:
          - "NODE_NAME"

更改下列內容:

  • PARTITION_SIZE:在第一個步驟中找到的實際剩餘原始區塊容量。請使用 Gi 後置字串 (例如 275Gi),讓值與分區容量完全相符。
  • NODE_NAME:連接本機 SSD 的節點名稱。
  • LOCAL_SSD_SYMLINK_PATH:您在第一個步驟中找到的未格式化本機 SSD 分區符號連結路徑。對於連接至節點集區的每個本機 SSD,主機 OS 會建立符號連結,以存取剩餘的原始區塊容量。路徑採用以零為基礎的索引模式。舉例來說,如果您連接三個本機 SSD,分區的原始區塊路徑如下:
    • /dev/disk/by-id/google-local-ssd-partition0
    • /dev/disk/by-id/google-local-ssd-partition1
    • /dev/disk/by-id/google-local-ssd-partition2

建立 PersistentVolumeClaim

建立 PersistentVolumeClaim 物件來要求磁碟區。對應的規格如下所示:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: "example-local-pvc"
spec:
  accessModes:
  - "ReadWriteOnce"
  volumeMode: "Block"
  storageClassName: "local-storage"
  resources:
    requests:
      storage: PARTITION_SIZE

在 Pod 中使用磁碟區

您可以在 Pod 中使用 PersistentVolume 物件,方法是在 volumeDevices 規格中參照 PersistentVolumeClaim 物件。以下是使用 example-local-pvc 宣告的 Pod 資訊清單範例:

apiVersion: v1
kind: Pod
metadata:
  name: "example-pod"
spec:
  containers:
  - name: "app"
    image: "ubuntu:22.04"
    command: ["/bin/sh", "-c"]
    args: ["tail -f /dev/null"]
    volumeDevices:
    - name: "raw"
      devicePath: "/dev/xvda"
  volumes:
  - name: "raw"
    persistentVolumeClaim:
      claimName: "example-local-pvc"

由於您使用的是 kubernetes.io/no-provisioner 佈建工具,GKE 不會自動清理本機磁碟區。如果刪除 PersistentVolume 物件,則必須手動清除基礎磁碟中的資料,才能安全地重複使用磁碟。

疑難排解

如需疑難排解操作說明,請參閱「排解 GKE 儲存空間問題」。

後續步驟