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
內容解密:
apiVersion和kind定義了資源的型別和版本。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
內容解密:
apiVersion和kind定義了這個 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:在節點的本地儲存上建立一個空目錄。ConfigMap、downwardAPI、Secret:將 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
內容解密:
apiVersion和kind定義了資源的 API 版本和型別。metadata.name指定了 StorageClass 的名稱。provisioner指定了用於組態儲存資源的 CSI Driver。allowVolumeExpansion啟用 PVC 擴充套件功能。