本頁說明如何在 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
,取得最新版本。
建立具有本機 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
:包含 1.25.3-gke.1800 以上 GKE 版本的發布管道。
第 3 代或第 4 代
如果您使用第三代或第四代機器系列的機型,請使用 --local-nvme-ssd-block
選項 (不含 count 欄位) 建立叢集。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
選項 (不含 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
:GKE 節點集區版本,支援第三代或第四代機型系列的機型本機 SSD。
節點集區中的節點會使用 cloud.google.com/gke-local-nvme-ssd=true
標籤建立。您可以執行下列指令來驗證標籤:
kubectl describe node NODE_NAME
對於連結至節點集區的每個本機 SSD,主機 OS 會建立符號連結 (symlink),以便存取序數資料夾下的磁碟,以及具有通用唯一識別碼 (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 的限制
升級 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 的 PersistentVolume。這個佈建工具是一種 DaemonSet,用於管理每個節點的本機 SSD 磁碟、建立及刪除節點的 PersistentVolume,以及在 PersistentVolume 遭到釋出時清除本機 SSD 磁碟上的資料。
如要執行本機磁碟區靜態佈建工具:
使用 DaemonSet 設定 RAID 並格式化磁碟:
- 下載
gke-daemonset-raid-disks.yaml
規格。 部署 RAID 磁碟 DaemonSet。DaemonSet 會在所有本機 SSD 磁碟上設定 RAID 0 陣列,並將裝置格式化為
ext4
檔案系統。kubectl create -f gke-daemonset-raid-disks.yaml
- 下載
下載
gke-nvme-ssd-block-raid.yaml
規格,並視需要修改規格的命名空間欄位。這項規格包含下列資源:
- 佈建工具的 ServiceAccount
- 可取得以下權限的 ClusterRole 和 ClusterRoleBindings:
- 建立及刪除 PersistentVolume 物件
- 取得 Node 物件
- 具有 GKE 佈建工具設定的 ConfigMap
- 執行佈建工具的 DaemonSet
部署佈建工具:
kubectl create -f gke-nvme-ssd-block-raid.yaml
當佈建工具成功運作時,就會為叢集的 RAID 本機 SSD 裝置建立 PersistentVolume 物件。
將下列 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 的名稱。建立 PersistentVolumeClaim:
kubectl create -f provisioner-pvc-example.yaml
將下列 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 的名稱。建立 Pod:
kubectl create -f provisioner-pod-example.yaml
啟用延遲磁碟區繫結
為了改善排程效率,我們建議您也建立具有 volumeBindingMode: WaitForFirstConsumer
的 StorageClass。這會將 PersistentVolumeClaim 繫結延遲到 Pod 排程時間才進行,讓系統能夠從可執行 Pod 的適當節點中選擇本機 SSD。選取可執行 Pod 的節點時,增強排程行為會考量 Pod CPU 和記憶體要求、節點相依性、Pod 相依性與反相依性及多個 PersistentVolumeClaim 要求,以及考量哪些節點具有可用的本機 SSD。
本範例使用延遲磁碟區繫結模式:
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 中的儲存空間問題」。