佈建及使用以本機 SSD 為基礎的原始區塊儲存空間

本頁說明如何在 Google Kubernetes Engine (GKE) 叢集佈建本機 SSD 儲存空間,以及如何設定工作負載,從連接至叢集節點、由本機 SSD 支援的原始區塊儲存空間取用資料。

使用這個本機 SSD 選項,您就能進一步控管基礎儲存空間,並為 Pod 建構自己的節點層級快取,為應用程式提供更優異的效能。您也可以視需要執行 DaemonSet 來設定 RAID 並格式化磁碟,在本機 SSD 磁碟上安裝檔案系統,藉此自訂這個選項。

如果工作負載需要未格式化的原始區塊儲存空間,但節點也需要標準暫時檔案儲存空間,請使用混合本機 SSD 模式。

如要進一步瞭解本機 SSD 對 GKE 原始區塊存取權的支援,請參閱「關於本機 SSD」。

事前準備

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

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

建立叢集或節點集區,並使用本機 SSD 支援的原始區塊儲存空間

使用 gcloud CLI 搭配 --local-nvme-ssd-block 選項,建立具有本機 SSD 支援原始區塊儲存空間的叢集。

您執行用來建立叢集或節點集區的 gcloud CLI 指令,取決於您使用的機型屬於哪個機器系列世代。舉例來說,N1 和 N2 機型分別屬於第一代和第二代機器系列,而 C3 機型則屬於第三代機器系列。

建立具備本機 SSD 的叢集

第 1 代或第 2 代

如果使用第一代或第二代機器系列的機型,請指定 --local-nvme-ssd-block count=NUMBER_OF_DISKS 選項來建立叢集。這個選項會指定要附加至各節點的本機 SSD 磁碟數量。數量上限因機型和區域而異。

如何建立叢集:

gcloud container clusters create CLUSTER_NAME \
    --local-nvme-ssd-block count=NUMBER_OF_DISKS \
    --machine-type=MACHINE_TYPE \
    --release-channel CHANNEL_NAME

更改下列內容:

  • CLUSTER_NAME:叢集名稱。
  • NUMBER_OF_DISKS:要在各節點佈建的本機 SSD 磁碟數量。磁碟數量上限因機型和區域而異。
  • MACHINE_TYPE:要使用的第一代或第二代機型。您必須指定這個欄位,因為本機 SSD 無法與預設的 e2-medium 類型搭配使用。
  • CHANNEL_NAME:發布管道,包含 1.25.3-gke.1800 以上的 GKE 版本。

第 3 代或第 4 代

如果您使用第三代或第四代機器系列的機型,請使用 --local-nvme-ssd-block 選項 (不含計數欄位) 建立叢集。GKE 會根據 VM 形態,自動為叢集佈建本機 SSD 容量。數量上限因機器類型和區域而異。

gcloud container clusters create CLUSTER_NAME \
    --machine-type=MACHINE_TYPE \
    --cluster-version CLUSTER_VERSION \
    --local-nvme-ssd-block

更改下列內容:

  • CLUSTER_NAME:叢集名稱。
  • MACHINE_TYPE:要使用的第三代或第四代機器系列機型。
  • CLUSTER_VERSION:支援第三代或第四代機器系列機型本機 SSD 的 GKE 叢集版本。

建立具備本機 SSD 的節點集區

第 1 代或第 2 代

如要建立使用本機 SSD 磁碟進行原始區塊存取的節點集區,請執行下列指令:

gcloud container node-pools create POOL_NAME \
    --cluster=CLUSTER_NAME \
    --machine-type=MACHINE_TYPE \
    --local-nvme-ssd-block count=NUMBER_OF_DISKS

更改下列內容:

  • POOL_NAME:新節點集區的名稱。
  • CLUSTER_NAME:叢集名稱。
  • MACHINE_TYPE:要使用的第一代或第二代機型。本機 SSD 無法與預設 e2-medium 類型搭配使用,因此必須指定這個欄位。
  • NUMBER_OF_DISKS:要在各節點佈建的本機 SSD 磁碟數量。磁碟數量上限因機型和區域而異。

第 3 代或第 4 代

如果您使用第三代或第四代機器系列的機器類型,請使用 --local-nvme-ssd-block 選項 (不含計數欄位) 建立叢集:

gcloud container node-pools create POOL_NAME \
    --cluster=CLUSTER_NAME \
    --machine-type=MACHINE_TYPE \
    --node-version NODE_VERSION \
    --local-nvme-ssd-block

更改下列內容:

  • POOL_NAME:新節點集區的名稱。
  • CLUSTER_NAME:叢集名稱。
  • MACHINE_TYPE:要使用的第三代或第四代機型。
  • NODE_VERSION:GKE 節點集區版本,支援第三代或第四代機器系列機型的本機 SSD。

節點集區中的節點會以 cloud.google.com/gke-local-nvme-ssd=true 標籤建立。執行下列指令,即可驗證標籤:

kubectl describe node NODE_NAME

對於連接至節點集區的每個本機 SSD,主機 OS 會建立符號連結 (symlink),以便存取序號資料夾下的磁碟,以及具有通用專屬 ID (UUID) 的符號連結。舉例來說,如果您使用 --local-nvme-ssd-block 選項建立含有三個本機 SSD 的節點集區,主機 OS 會為磁碟建立下列符號連結:

  • /dev/disk/by-id/google-local-ssd-block0
  • /dev/disk/by-id/google-local-ssd-block1
  • /dev/disk/by-id/google-local-ssd-block2

同樣地,主機 OS 也會為磁碟建立下列含有 UUID 的符號連結:

  • /dev/disk/by-uuid/google-local-ssds-nvme-block/local-ssd-GENERATED_UUID1
  • /dev/disk/by-uuid/google-local-ssds-nvme-block/local-ssd-GENERATED_UUID2
  • /dev/disk/by-uuid/google-local-ssds-nvme-block/local-ssd-GENERATED_UUID3

這可確保能使用專屬 ID 存取磁碟。

存取本機 SSD 磁碟區

以下範例說明如何存取本機 SSD 支援的原始區塊儲存空間。

本機 PersistentVolume

本機 SSD 磁碟區可使用 PersistentVolumes 掛接為 Pod。

您可以手動建立 PersistentVolume,或執行本機磁碟區靜態佈建工具,從本機 SSD 建立 PersistentVolume。

本機 PersistentVolume 的限制

  • 本機 PersistentVolume 不支援叢集自動調度資源和動態佈建。

  • 升級 GKE 叢集或修復節點會刪除 Compute Engine 執行個體,這也會刪除本機 SSD 磁碟上的所有資料。

  • 如果叢集或節點集區使用本機 SSD 儲存永久資料,請勿啟用節點自動升級或節點自動修復功能。您必須先備份應用程式資料,再將資料還原至新的叢集或節點集區。

  • 刪除、升級、修復或縮減節點時,系統不會自動清除本機 PersistentVolume 物件。建議您定期掃描並刪除與已刪除節點相關聯的過時 Local PersistentVolume 物件。

手動建立 PersistentVolume

您可以為叢集中每個節點上的各個本機 SSD 手動建立 PersistentVolume。

使用 PersistentVolume 物件中的 nodeAffinity 欄位,參照特定節點上的本機 SSD。以下範例顯示在執行 Linux 的節點上,本機 SSD 的 PersistentVolume 規格:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: "example-local-pv"
spec:
  capacity:
    storage: 375Gi
  accessModes:
  - "ReadWriteOnce"
  persistentVolumeReclaimPolicy: "Retain"
  storageClassName: "local-storage"
  local:
    path: "/mnt/disks/ssd0"
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: "kubernetes.io/hostname"
          operator: "In"
          values:
          - "gke-test-cluster-default-pool-926ddf80-f166"

在本範例中,本機 SSD 磁碟會手動設定為 RAID 並格式化,然後掛接在節點 gke-test-cluster-default-pool-926ddf80-f166 的 /mnt/disks/ssd0。nodeAffinity 欄位可用來將工作負載指派給節點,這些節點具有手動設定為 RAID 的本機 SSD。如果叢集中只有一個節點,或您已為所有節點設定 RAID,則不需要 nodeAffinity 欄位。

對應的 PersistenVolumeClaim 規格如下所示:

  kind: PersistentVolumeClaim
  apiVersion: v1
  metadata:
    name: ssd-local-claim
  spec:
    accessModes:
    - ReadWriteOnce
    storageClassName: local-storage
    resources:
      requests:
        storage: 37Gi

如果刪除 PersistentVolume,則必須手動清除磁碟中的資料。

執行本機磁碟區靜態佈建工具

您可以使用本機磁碟區靜態佈建工具,自動為本機 SSD 建立 PersistentVolume。佈建工具是 DaemonSet,可管理各節點上的本機 SSD 磁碟、建立及刪除這些磁碟的 PersistentVolume,並在 PersistentVolume 釋出時清除本機 SSD 磁碟上的資料。

如要執行本機磁碟區靜態佈建工具:

  1. 使用 DaemonSet 設定 RAID 並格式化磁碟:

    1. 下載 gke-daemonset-raid-disks.yaml 規格。
    2. 部署 RAID 磁碟 DaemonSet。DaemonSet 會在所有本機 SSD 磁碟上設定 RAID 0 陣列,並將裝置格式化為 ext4 檔案系統。

      kubectl create -f gke-daemonset-raid-disks.yaml
      
  2. 下載 gke-nvme-ssd-block-raid.yaml 規格,並視需要修改規格的命名空間欄位。

    規格包含下列資源:

    • 佈建工具的 ServiceAccount
    • ClusterRole 和 ClusterRoleBindings,用於授予下列權限:
      • 建立及刪除 PersistentVolume 物件
      • 取得 Node 物件
    • 具有 GKE 佈建工具設定的 ConfigMap
    • 執行佈建工具的 DaemonSet
  3. 部署佈建工具:

    kubectl create -f gke-nvme-ssd-block-raid.yaml
    

    佈建工具成功執行後,會為叢集中的 RAID 本機 SSD 裝置建立 PersistentVolume 物件。

  4. 將下列 PersistentVolumeClaim 資訊清單儲存為 provisioner-pvc-example.yaml:

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: PVC_NAME
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 50Gi
      storageClassName: nvme-ssd-block
    

    將 PVC_NAME 替換為 PersistentVolumeClaim 的名稱。

  5. 建立 PersistentVolumeClaim:

    kubectl create -f provisioner-pvc-example.yaml
    
  6. 將下列 Pod 資訊清單儲存為 provisioner-pod-example.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: POD_NAME
    spec:
      containers:
      - name: "shell"
        image: "ubuntu:22.04"
        command: ["/bin/sh", "-c"]
        args: ["echo 'hello world' > /cache/test.txt && sleep 1 && cat /cache/test.txt && sleep 3600"]
        volumeMounts:
        - mountPath: /cache
          name: local-ssd-storage
      volumes:
      - name: local-ssd-storage
        persistentVolumeClaim:
          claimName: PVC_NAME
    

    將 POD_NAME 替換為 Pod 名稱。

  7. 建立 Pod:

    kubectl create -f provisioner-pod-example.yaml
    

啟用延遲磁碟區繫結

為改善排程,建議您也使用 volumeBindingMode: WaitForFirstConsumer 建立 StorageClass。這會將 PersistentVolumeClaim 繫結延遲到 Pod 排程,以便從可執行 Pod 的適當節點中選擇本機 SSD。這項強化排程行為會考量 Pod CPU 和記憶體要求、節點相依性、Pod 相依性和反相依性,以及多個 PersistentVolumeClaim 要求,並考量哪些節點有可用的本機 SSD,以便為可執行的 Pod 選取節點。

這個範例使用延遲磁碟區繫結模式:

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

如要建立具有延遲繫結功能的 StorageClass,請將 YAML 資訊清單儲存至本機檔案,並使用下列指令套用至叢集:

kubectl apply -f filename

疑難排解

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

後續步驟