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

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

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

如要進一步瞭解 GKE 原始區塊存取的本機 SSD 支援情況,請參閱「關於本機 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:要使用的第一代或第二代機型。您必須指定這個欄位,因為預設 e2-medium 類型無法搭配本機 SSD 使用。
  • CHANNEL_NAME:包含 GKE 1.25.3-gke.1800 以上版本的發布管道。

第 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:GKE 叢集版本,支援在第三代或第四代機器系列的機器類型上使用本機 SSD。

建立使用本機 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 代

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

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:支援第三代或第四代機型系列機型本機 SSD 的 GKE 節點集區版本。

節點集區中的節點會使用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

您可以使用 PersistentVolumes,將本機 SSD 磁碟區掛接為 Pod。

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

本機 PersistentVolume 的限制

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

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

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

  • 節點遭到刪除、升級、修復或縮減時,本機 PersistentVolume 物件不會自動清除。建議您定期掃描並刪除與已刪除節點相關聯的過時本機 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 的 PersistentVolumes。佈建工具是 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 和 ClusterRoleBinding,可授予下列權限:
      • 建立及刪除 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:14.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 儲存空間問題」。

後續步驟