Kubernetes 的動態儲存資源組態機制簡化了儲存管理的複雜性,讓開發者無需手動組態 PV 即可動態取得儲存資源。PVC 成為請求和使用儲存資源的核心物件,透過 StorageClass 的定義,Kubernetes 能夠自動化地建立和繫結 PV,滿足應用程式對持久化儲存的需求。這篇文章將會逐步示範如何在 minikube 環境中使用動態儲存組態,並解釋 StorageClass、PVC 和 PV 之間的互動關係。同時,也會探討一些進階儲存主題,例如短暫卷的使用、CSI 卷克隆的應用,以及如何擴充套件 PVC 的容量,讓讀者更全面地理解 Kubernetes 的儲存管理機制。

動態儲存資源組態與 PersistentVolumeClaim 的角色

在 Kubernetes 中,動態儲存資源組態(Dynamic Storage Provisioning)是一種強大的功能,能夠根據需求自動建立儲存資源,而無需手動組態 PersistentVolume(PV)。在這個過程中,PersistentVolumeClaim(PVC)物件扮演著至關重要的角色。

理解 StorageClass 和其作用

StorageClass 是 Kubernetes 中的一個資源物件,它定義了儲存資源的型別和組態。當建立 PVC 時,可以指定要使用的 StorageClass。StorageClass 物件包含了一個 provisioner,它負責與底層儲存技術進行互動,例如 Amazon EBS 或 Google Persistent Disk。

在我們的實驗環境中,我們使用的是 minikube 叢集,預設的 StorageClass 名為 standard,它使用 k8s.io/minikube-hostpath 作為 provisioner。這個 provisioner 負責在主機檔案系統上自動建立 hostPath 型別的 PV。

# gce-pd-sc.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: slow
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard

內容解密:

  • apiVersionkind 定義了資源的型別和版本。
  • metadata 包含了資源的中繼資料,例如名稱。
  • provisioner 指定了要使用的儲存技術,例如 Google Persistent Disk。
  • parameters 定義了儲存資源的組態,例如型別。

PersistentVolumeClaim 的新角色

當使用動態儲存資源組態時,PVC 物件將扮演新的角色。由於 PV 是由 StorageClass 自動建立的,因此 PVC 成為唯一需要管理的物件。

讓我們透過建立一個 NGINX Pod 來示範這個過程,該 Pod 將掛載一個動態建立的 hostPath 型別 PV。

首先,建立一個新的 namespace:

$ kubectl create ns dynamicstorage
namespace/dynamicstorage created

然後,檢查叢集中是否有可用的 StorageClass:

$ kubectl get sc
NAME                 PROVISIONER                RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
standard (default)   k8s.io/minikube-hostpath   Delete          Immediate           false                  21d

內容解密:

  • kubectl get sc 命令用於取得叢集中的 StorageClass 資源。
  • NAME 列出了 StorageClass 的名稱。
  • PROVISIONER 指定了要使用的儲存技術。

接下來,建立一個 PVC 物件,它將動態建立一個 hostPath 型別的 PV:

# pvc-dynamic.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-dynamic-hostpath-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: standard # 非常重要!
  resources:
    requests:
      storage: 1Gi
  selector:
    matchLabels:
      type: hostpath
      env: prod
$ kubectl apply -f pvc-dynamic.yaml -n dynamicstorage
persistentvolumeclaim/my-dynamic-hostpath-pvc created

檢查 PV 和 PVC 的狀態:

$ kubectl get pod,pvc,pv -n dynamicstorage
NAME                                      STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
persistentvolumeclaim/my-dynamic-hostpath-pvc   Bound    pvc-4597ab27-c894-40de-a7ac-1b6ca961bcdc   1Gi        RWO            standard       <unset>                 7s

NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM                                       STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE

內容解密:

  • kubectl get pod,pvc,pv 命令用於取得 Pod、PVC 和 PV 的狀態。
  • STATUS 列出了資源的狀態,例如 Bound 或 Pending。
  • VOLUME 列出了 PV 的名稱。

動態儲存與進階儲存主題

在 Kubernetes 中,動態儲存供應(Dynamic Provisioning)提供了一種自動化的方式來建立和管理持久化儲存(Persistent Storage)。透過 StorageClass,我們可以根據需求動態地建立 PersistentVolume(PV)並將其與 PersistentVolumeClaim(PVC)繫結。

動態儲存供應實務

首先,我們需要建立一個 StorageClass 物件,定義如何動態供應 PV。然後,透過建立 PVC 來請求儲存資源,Kubernetes 便會根據 StorageClass 的定義自動建立相應的 PV 並與 PVC 繫結。

以下是一個 Pod 使用動態建立的 PVC 的 YAML 定義範例:

# pod-with-dynamic-pvc.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-dynamic-storage
spec:
  containers:
  - image: nginx
    name: nginx
    volumeMounts:
    - mountPath: "/var/www/html"
      name: mypersistentvolume
  volumes:
  - name: mypersistentvolume
    persistentVolumeClaim:
      claimName: my-dynamic-hostpath-pvc

內容解密:

  • apiVersionkind 定義了這個 YAML 檔案所代表的 Kubernetes 物件型別。
  • metadata 部分包含了 Pod 的名稱。
  • spec 部分定義了 Pod 的規格,包括容器列表和掛載的卷。
  • containers 部分列出了 Pod 中的容器,這裡使用了一個 Nginx 容器。
  • volumeMounts 定義了容器內部的掛載點,將 mypersistentvolume 掛載到 /var/www/html
  • volumes 部分定義了 Pod 使用的卷,這裡使用了一個 PersistentVolumeClaim 卷,名稱為 my-dynamic-hostpath-pvc

建立 Pod 後,我們可以透過以下命令檢查 Pod、PVC 和 PV 的狀態:

$ kubectl apply -f pod-with-dynamic-pvc.yaml -n dynamicstorage
$ kubectl get pod,pvc,pv -n dynamicstorage

刪除測試與回收策略

預設情況下,StorageClass 的回收策略(Reclaim Policy)被設定為 Delete,這意味著當 PVC 被刪除時,相應的 PV 也會被自動刪除。如果需要保留資料,可以修改回收策略。

測試刪除 Pod 和 PVC 後,PV 的狀態變化:

$ kubectl delete po nginx-dynamic-storage -n dynamicstorage
$ kubectl delete pvc my-dynamic-hostpath-pvc -n dynamicstorage
$ kubectl get pod,pvc,pv -n dynamicstorage

進階儲存主題

短暫卷(Ephemeral Volumes)

短暫卷提供了臨時儲存給 Pod,適合用於需要暫存空間或只讀資料的應用。與 PV 不同,短暫卷會在 Pod 終止時自動刪除。

短暫卷的型別包括:

  • emptyDir:在節點的本地儲存上建立一個空目錄。
  • ConfigMapdownwardAPISecret:將 Kubernetes 物件中的資料注入到 Pod 中。
  • CSI 短暫卷:由外部 CSI 驅動程式提供。
  • 通用短暫卷:由支援 PV 的儲存驅動程式提供。

CSI 卷克隆(CSI Volume Cloning)

CSI 卷克隆允許從現有的 PersistentVolumeClaim 複製出一個新的 PVC。

以下是一個 PVC 克隆的 YAML 定義範例:

# pv-cloning.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: cloned-pvc
  namespace: mynamespace
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: custom-storage-class
  resources:
    requests:
      storage: 5Gi
  dataSource:
    kind: PersistentVolumeClaim
    name: original-pvc

內容解密:

  • dataSource 部分指定了克隆的來源 PVC,即 original-pvc
  • storageClassName 指定了用於克隆的 StorageClass。
  • 克隆出來的 PVC 名稱為 cloned-pvc,具有與來源 PVC 相同的儲存容量和存取模式。

CSI 卷克隆的好處包括簡化工作流程、提高效率以及方便對生產資料進行故障排除和測試。更多關於 CSI 卷克隆的資訊,請參考 Kubernetes官方檔案

第9章:Kubernetes 中的持久儲存管理

Kubernetes 提供了多種持久儲存管理機制,包括 PersistentVolume(PV)、PersistentVolumeClaim(PVC)、StorageClass、VolumeSnapshot 和 Volume Cloning 等。這些機制使得在 Kubernetes 中管理和使用持久儲存變得更加靈活和高效。

PersistentVolume 和 PersistentVolumeClaim

PersistentVolume(PV)是一種資源型別,代表底層儲存資源,如主機路徑、NFS、Amazon EBS 和 Google PD 等。PersistentVolumeClaim(PVC)則是使用者對儲存資源的請求。PVC 可以請求特定大小和存取模式的儲存資源,Kubernetes 會自動將 PVC 繫結到符合要求的 PV。

StorageClass 和動態資源組態

StorageClass 是 Kubernetes 中的另一種資源型別,用於定義儲存資源的型別和組態。動態資源組態允許 Kubernetes 自動建立 PV,以滿足 PVC 的請求。這種機制可以簡化儲存資源的管理,並提高資源利用率。

VolumeSnapshot 和 Volume Cloning

VolumeSnapshot 提供了一種標準化的方式來建立某個時間點的 Volume 資料副本。與 PV 和 PVC 類別似,Kubernetes 使用 VolumeSnapshot、VolumeSnapshotContent 和 VolumeSnapshotClass 資源來管理 Volume 快照。Volume Cloning 則允許建立一個現有 PV 的副本。

CSI Driver 和 Sidecar Container

CSI Driver 是 Kubernetes 中的一種外掛程式,用於管理儲存資源。Sidecar Container(如 csi-snapshotter)則是 CSI Driver 的一部分,用於處理 CreateSnapshot 和 DeleteSnapshot 等操作。

擴充套件 PersistentVolumeClaim

Kubernetes 支援擴充套件 PVC 的大小,但目前僅限於由 CSI Driver 組態的 Volume。要啟用 PVC 擴充套件,需要在 StorageClass 中設定 allowVolumeExpansion 欄位為 true。然後,可以編輯 PVC 物件並指定更大的大小,Kubernetes 將啟動擴充套件程式。

設定範例

# storageclass-expandable.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: expandable-sc
provisioner: vendor-name.example/magicstorage
allowVolumeExpansion: true

內容解密:

  • apiVersionkind 定義了資源的 API 版本和型別。
  • metadata.name 指定了 StorageClass 的名稱。
  • provisioner 指定了用於組態儲存資源的 CSI Driver。
  • allowVolumeExpansion 啟用 PVC 擴充套件功能。

進一步閱讀