本機 SSD

本頁提供 Kubernetes 的本機 SSD 支援總覽,並說明如何透過 Google Kubernetes Engine 使用本機 SSD。

總覽

「本機 SSD」向叢集中的每個節點提供高效能的臨時儲存空間,與標準磁碟相比,本機 SSD 提供的總處理量較高且延遲時間較短。適合採用本機 SSD 的工作負載包括本機快取和處理程序。

只要不違反叢集的機器類型限制及超出專案的配額,就可以建立具有本機 SSD 的節點集區。

限制

使用本機 SSD 時,請注意下列限制:

  • 由於本機 SSD 是以實體方式連結至節點的主機虛擬機器執行個體,因此其中儲存的任何資料「只存在於該節點上」。儲存在磁碟上的資料屬於本機資料,因此您的應用程式必須具有彈性,而不會在這類資料無法使用時受到影響。
  • 儲存在本機 SSD 上的資料是暫時的。如果寫入本機 SSD 的 Pod 被重新排程而遷離該節點,則這個 Pod 可能會無法存取儲存在該磁碟上的資料。此外,如果終止、升級或修復節點,則「資料會遭到清除」
  • 本機 SSD 不能新增到現有的節點集區。

建立具有本機 SSD 的叢集

您可以透過 Google Cloud Platform 主控台或 gcloud 指令列工具來建立具有本機 SSD 的叢集。

gcloud

如要使用 gcloud 建立具有本機 SSD 的叢集或節點集區,請指定 --local-ssd count 標記。

如要建立叢集且其中的預設集區使用本機 SSD 磁碟,請執行下列指令:

gcloud container clusters create [CLUSTER_NAME] \
    --num-nodes 2 --local-ssd-count [NUMBER_OF_DISKS]

其中 [NUMBER_OF_DISKS] 是使用絕對值的所需磁碟數量。

如要在現有叢集中建立具有本機 SSD 磁碟的節點集區:

gcloud beta container node-pools create [POOL_NAME] --cluster [CLUSTER_NAME] \
    --num-nodes 1 --local-ssd-count [NUMBER_OF_DISKS]

--local-ssd-count 會指定每個節點要建立的本機 SSD 數量。數量上限會依據機器類型和地區而有所不同 (請參閱本機 SSD)。建立節點時,系統會自動將本機 SSD 格式化並掛接在主機 OS 的子目錄 /mnt/disks/,而且每個本機 SSD 都會掛接在「ssd#」目錄中。

主控台

您可以從 GCP 主控台的 GKE 選單中建立具有本機 SSD 的叢集或節點集區。

如要建立叢集且其中的預設集區使用本機 SSD 磁碟,請執行下列步驟:

  1. 前往 GCP 主控台的 Google Kubernetes Engine 選單。

    造訪 Google Kubernetes Engine 選單

  2. 按一下 [建立叢集]

  3. 在「節點集區」選單中,按一下 [進階編輯]

  4. 在「節點數」中輸入「2」。

  5. 在「本機 SSD」中輸入所需數量的 SSD 做為絕對數目。

  6. 按一下 [儲存],然後按一下 [完成]

如要在現有叢集中建立具有本機 SSD 磁碟的節點集區:

  1. 前往 GCP 主控台的 Google Kubernetes Engine 選單。

    造訪 Google Kubernetes Engine 選單

  2. 選取需要的叢集。

  3. 按一下 [編輯]

  4. 在「節點集區」下,按一下 [新增節點集區]

  5. 在「大小」中輸入「1」。

  6. 在「本機 SSD 磁碟」(每節點)中輸入所需數量的 SSD 做為絕對數目。

  7. 按一下 [Save] (儲存)

使用本機 SSD

本節說明如何透過 GKE 使用本機 SSD。

您可以使用以下其中一種方法來存取本機 SSD:

  • Hostpath 磁碟區,這方法適用於:

    • 使用 DaemonSet 的工作負載。
    • 使用專屬節點集區的工作負載。在 DaemonSet 的所有執行個體中,所有本機 SSD 的存取路徑都必須相同。
  • 從 Kubernetes 1.10 開始提供的本機 PersistentVolume 測試版,這方法適用於:

    • 使用 StatefulSet 和 volumeClaimTemplate 的工作負載。
    • 共用節點集區的工作負載。您可以透過 PersistentVolumeClaim (PVC) 來保留每個本機 SSD,而且特定的主機路徑不會在 Pod 規格中直接進行編碼。
    • 對同一個本機 SSD 需要資料引力的 Pod。Pod 一律會安排到與本機 PersistentVolume 相同的節點。

使用 hostPath 磁碟區的範例

如果您建立具有三個本機 SSD 的節點集區,則主機 OS 會在 /mnt/disks/ssd0/mnt/disks/ssd1/mnt/disks/ssd2 位置掛接磁碟。您的 Kubernetes 容器會透過物件設定檔中定義的 hostPath 參數來存取磁碟。

這個 Pod 設定檔範例會參照本機 SSD:/mnt/disks/ssd0

apiVersion: v1
kind: Pod
metadata:
  name: "test-ssd"
spec:
  containers:
  - name: "shell"
    image: "ubuntu:14.04"
    command: ["/bin/sh", "-c"]
    args: ["echo 'hello world' > /test-ssd/test.txt && sleep 1 && cat /test-ssd/test.txt"]
    volumeMounts:
    - mountPath: "/test-ssd/"
      name: "test-ssd"
  volumes:
  - name: "test-ssd"
    hostPath:
      path: "/mnt/disks/ssd0"
  nodeSelector:
    cloud.google.com/gke-local-ssd: "true"

使用本機 PersistentVolume 的範例

自 Kubernetes 1.10 版本起,本機 SSD 可指定成 PersistentVolume

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

注意事項

目前本功能不支援自動調度叢集資源動態佈建

升級 GKE 叢集或修復節點將會刪除 Compute Engine 執行個體,而且本機 SSD 上的所有資料也會一併刪除。

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

手動建立 PersistentVolume

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

使用 PersistentVolume 物件中的 nodeAffinity 欄位來參照特定節點上的本機 SSD。舉例來說,下列的 PersistentVolume 規格是針對掛接在 gke-test-cluster-default-pool-926ddf80-f166 節點上 /mnt/disks/ssd0 位置的本機 SSD。

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"

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

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

您可以使用本機磁碟區靜態佈建工具,自動建立本機 SSD 的 PersistentVolume。這個佈建工具是一種 DaemonSet,用於管理每個節點的本機 SSD、建立及刪除節點的 PersistentVolume,以及在 PersistentVolume 遭到釋出時清除本機 SSD 上的資料。

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

  1. external-storage repo 下載 provisioner_generated_gce_ssd_count.yaml 規格,並視需要修改規格的 namespace 欄位。

    這項規格包含以下項目:

    • 佈建工具的 ServiceAccount
    • 可取得以下權限的 ClusterRole 和 ClusterRoleBindings:
      • 建立及刪除 PersistentVolume 物件
      • 取得 Node 物件
    • 具有 GKE 佈建工具設定的 ConfigMap
    • 執行佈建工具的 DaemonSet
  2. 將您的身分與存取權管理 (IAM) 帳戶連結至 Kubernetes cluster-admin 角色。這是取得 ClusterRole 建立權限的必要動作。

  3. 部署佈建工具:

    kubectl apply -f provisioner_generated_gce_ssd_count.yaml

當佈建工具成功運作時,就會為叢集的每個本機 SSD 建立 PersistentVolume 物件。

啟用延遲磁碟區繫結

為了改善排程效率,我們建議您也建立具有 volumeBindingMode: WaitForFirstConsumer 的 StorageClass。這會將 PersistentVolumeClaim (PVC) 繫結延遲到 Pod 排程時間才進行,讓系統能夠從可執行 Pod 的適當節點中選擇本機 SSD。增強排程行為代表系統會考量 Pod CPU 和記憶體要求、節點相依性、Pod 相依性與反相依性及多個 PVC 要求,以及考量哪些節點具有可用的本機 SSD。

local_class.yaml

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

如要建立具有延遲繫結的 StorageClass,請執行下列指令:

kubectl apply -f local_class.yaml

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Kubernetes Engine 說明文件