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

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

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

如要進一步瞭解 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:要使用的第一代或第二代機型。您必須指定這個欄位,因為本機 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: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 代

如果您使用第三代或第四代機器系列的機器類型,請使用 --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: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 儲存空間問題」。

後續步驟