在 Kubernetes 中,StorageClass 是用來描述儲存類型的對象,它定義了儲存提供者的類型和設定,使用戶可以動態地請求不同類型的儲存資源。這篇文章將深入介紹 Kubernetes 的 StorageClass 及其設定,幫助你理解如何動態管理和設定儲存。
StorageClass 是 Kubernetes 中的一種資源對象,提供了一個機制來描述不同儲存類型。它允許用戶在部署應用程式時,動態地申請不同的儲存類型,而不需要知道底層的儲存細節。這樣的抽象層讓儲存管理更靈活且易於管理。
以下是 Kubernetes 中 Pod 與 PersistentVolume 之間的儲存經由StorageClass 的過程示意:
這張圖展示了容器如何通過 PersistentVolumeClaim (PVC) 和 StorageClass,最終取得所需的持久化儲存資源。從圖中可以看到,Pod 內的容器將本地的 /var/dir
掛載到定義的 Volume,而這個 Volume 由 PVC 描述並由 StorageClass 管理,最終映射到具體的 PersistentVolume 上。
這樣的儲存設計讓 Kubernetes 的儲存資源管理變得靈活且動態化,大大提高了儲存管理的效率與應用程式的可用性。
kubernetes.io/aws-ebs
、kubernetes.io/gce-pd
、kubernetes.io/nfs
。在 Kubernetes 中,Default StorageClass 是 Cluster 中用來為 PersistentVolumeClaim (PVC) 提供預設儲存的 StorageClass。當用戶創建 PVC 時,如果沒有指定 storageClassName
,Kubernetes 會自動選擇被標記為 default
的 StorageClass 來滿足該 PVC 的儲存需求。這使得儲存設定更加簡便,特別是對於需要動態設定儲存的應用。
在 Cluster 中存在多個 StorageClass 時,Cluster管理員可以選擇一個作為預設的 StorageClass,在指定了預設之後,即使用戶沒有明確指定 storageClassName
,Kubernetes 也會自動使用該預設的 StorageClass 來動態設定 PersistentVolume (PV)。
可以使用以下指令查看 Cluster 中的 StorageClass 並確認哪一個是預設的:
kubectl get storageclass
輸出結果中,帶有 (default)
標記的 StorageClass 就是目前 Cluster 中的預設 StorageClass。
如果你想設定某個 StorageClass 為預設,可以使用以下指令:
kubectl patch storageclass <storageclass-name> -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
Cluster中只能有一個 Default StorageClass:如果同時有多個 StorageClass 被設置為預設,可能會導致 PVC 創建時的儲存設定錯誤。
動態設定儲存:當 PVC 沒有指定 storageClassName
時,Kubernetes 會使用預設的 StorageClass 動態創建 PV 並綁定到該 PVC 上。
Cluster管理員的角色:Cluster 管理員應該根據應用場景和需求選擇最合適的 StorageClass 作為預設,確保預設儲存符合大部分應用的需求。
以下是一個基於 NFS 的 StorageClass 設定範例:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-csi
provisioner: nfs.csi.k8s.io
parameters:
server: 192.168.1.99
share: /
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
- nfsvers=4.1
server
:指向 NFS 伺服器的服務名稱或 IP 位址。share
:使用 NFS 伺服器的根目錄作為共享路徑。若有特定的導出目錄,則應該在此設置正確路徑。reclaimPolicy: Delete
:當 PVC 被刪除時,對應的 PV 也將被自動刪除。如果需要保留 PV,可以設置為 Retain
。volumeBindingMode: Immediate
:在 PVC 創建時立即綁定 PV。若希望延遲綁定至實際使用時,可設置為 WaitForFirstConsumer
。mountOptions: nfsvers=4.1
:指定 NFS 的版本為 4.1,根據你的 NFS 伺服器和需求可進行調整。如果要將這個 StorageClass 設定為預設,可以使用以下標籤:
annotations:
storageclass.kubernetes.io/is-default-class: "true"
以下是一個基於 NFS 的預設 StorageClass 設定範例:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-csi
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: nfs.csi.k8s.io
parameters:
server: 192.168.1.99
share: /
reclaimPolicy: Delete
volumeBindingMode: Immediate
這樣一來,當用戶創建 PVC 而未指定 storageClassName
時,Kubernetes 會自動使用這個 NFS StorageClass 來創建 PV。
kubectl apply -f nfs-storageclass.yaml
成功部署後的訊息:
storageclass.storage.k8s.io/nfs-csi created
以下是一個基於 NFS StorageClass 的 PersistentVolumeClaim 設定:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
storageClassName: nfs-csi
創建 PersistentVolumeClaim:
kubectl apply -f pvc-example.yaml
創建成功的訊息:
persistentvolumeclaim/nfs-pvc created
檢查 PVC 狀態:
kubectl get pvc
當 PVC 狀態為 Bound 時,表示其已經成功綁定並可正常使用。
以下指令可以查看目前的 Storageclass :
kubectl get storageclass
查看指定 StorageClass 的詳細資訊:
kubectl describe storageclass nfs-storage-class
kubectl edit storageclass nfs-storage-class
今天我們學習了如何使用 Kubernetes 的 StorageClass 來動態設定儲存,以及如何創建和使用 NFS StorageClass。這些知識將幫助你更靈活地管理 Kubernetes 中的動態儲存資源,從而提高應用程式的可靠性和可用性。
接下來,我們將探討更多 Kubernetes 的核心概念和實踐,如 ReplicaSet 和 StatefulSet,這將進一步深化你對 Kubernetes 的理解和應用。