一、Kubernetes 存儲類(StorageClass)詳解
1. 什么是 StorageClass?
在 Kubernetes 中,StorageClass
(存儲類)是一種用于動態創建 PersistentVolume
(PV)的資源對象。它允許管理員根據不同的存儲需求創建不同的存儲策略,用戶只需要聲明 PersistentVolumeClaim
(PVC)并指定 StorageClass
,Kubernetes 就能自動分配相應的存儲。
2. 為什么需要 StorageClass?
在沒有 StorageClass
的情況下,管理員需要手動創建 PersistentVolume
,并與 PersistentVolumeClaim
進行匹配。這種方式適用于靜態存儲,但在大規模集群或云環境下,動態創建存儲更加靈活。因此,StorageClass
解決了以下問題:
-
自動化存儲分配:無需手動創建 PV,而是由 Kubernetes 負責創建和管理。
-
支持不同的存儲后端:適用于 AWS EBS、Google Persistent Disk、Azure Disk、NFS、Ceph 等多種存儲方案。
-
提供不同的存儲策略:支持不同的存儲性能(高 IOPS、低延遲)、快照、備份等需求。
3. StorageClass 的關鍵字段
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: fast-storage
provisioner: kubernetes.io/aws-ebs
parameters:type: gp2
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
主要字段解析:
-
provisioner
:指定存儲供應商,例如 AWS EBS(kubernetes.io/aws-ebs
)、Google Cloud Persistent Disk(kubernetes.io/gce-pd
)等。 -
parameters
:存儲類的參數,例如磁盤類型、性能級別等。 -
reclaimPolicy
(回收策略):定義存儲釋放后的行為。-
Delete
(刪除):刪除 PV 和底層存儲。 -
Retain
(保留):數據仍然保留,需要手動清理。 -
Recycle
(回收):(已廢棄)清理數據后重新使用。
-
-
volumeBindingMode
(卷綁定模式):-
Immediate
(立即綁定):PVC 創建時立即綁定。 -
WaitForFirstConsumer
(等待首個消費者):只有 Pod 使用 PVC 時才會綁定 PV,適用于多可用區調度。
-
-
allowVolumeExpansion
(允許擴容):是否允許存儲動態擴展。
4. 常見存儲供應商
存儲后端 | Provisioner | 適用場景 |
---|---|---|
AWS EBS | kubernetes.io/aws-ebs | AWS 云環境,塊存儲 |
GCE PD | kubernetes.io/gce-pd | GCP 云存儲 |
Azure Disk | kubernetes.io/azure-disk | Azure 云存儲 |
NFS | kubernetes.io/nfs | 共享存儲 |
Ceph | ceph.com/rbd | 分布式存儲 |
5. PVC 使用 StorageClass 示例
創建 PVC 時使用 StorageClass
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: example-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 10GistorageClassName: fast-storage
Pod 掛載 PVC 示例
apiVersion: v1
kind: Pod
metadata:name: example-pod
spec:containers:- name: app-containerimage: nginxvolumeMounts:- mountPath: "/usr/share/nginx/html"name: storagevolumes:- name: storagepersistentVolumeClaim:claimName: example-pvc
6. StorageClass 的應用場景
-
自動化存儲管理:減少手動創建 PV 的復雜性,適用于云環境。
-
多種存儲策略:支持不同的存儲性能需求,如 SSD、高吞吐磁盤等。
-
多可用區支持:結合
WaitForFirstConsumer
模式,提高存儲調度靈活性。 -
動態擴展存儲:支持 PVC 擴容,提高存儲彈性。
7. 總結
-
StorageClass
允許 Kubernetes 動態創建 PV,簡化存儲管理。 -
適用于云存儲、分布式存儲和本地存儲等多種場景。
-
通過
reclaimPolicy
、volumeBindingMode
和allowVolumeExpansion
提供靈活的存儲策略。 -
在 CI/CD、數據庫存儲、日志存儲等場景下廣泛應用。
二、在 Kubernetes 中使用 NFS 作為存儲類(StorageClass)
1. 部署 NFS 服務器與客戶端
在 Kubernetes 集群的某個節點上安裝 NFS 服務器。(但是在每個節點都要安裝NFS客戶端)
安裝 NFS 服務器(以 Ubuntu 為例)
sudo apt update && sudo apt install -y nfs-kernel-server
sudo mkdir -p /mnt/nfs-share
sudo chmod 777 /mnt/nfs-share
sudo echo "/mnt/nfs-share *(rw,sync,no_root_squash,no_subtree_check)" | sudo tee -a /etc/exports
sudo exportfs -rav
sudo systemctl restart nfs-kernel-server
安裝 NFS 客戶端
sudo apt update && sudo apt install -y nfs-common
2. 創建 NFS StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs-storage
provisioner: nfs-provisioner
parameters:archiveOnDelete: "false"
3. 部署 NFS Provisioner(Dynamic Provisioning)
apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-provisioner
spec:replicas: 1selector:matchLabels:app: nfs-provisionertemplate:metadata:labels:app: nfs-provisionerspec:containers:- name: nfs-provisionerimage: quay.io/external_storage/nfs-client-provisioner:latestvolumeMounts:- mountPath: /persistentvolumesname: nfs-volumeenv:- name: NFS_SERVERvalue: "<NFS服務器IP>"- name: NFS_PATHvalue: "/mnt/nfs-share"volumes:- name: nfs-volumenfs:server: "<NFS服務器IP>"path: "/mnt/nfs-share"
4. 創建 PersistentVolumeClaim (PVC)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nfs-pvc
spec:accessModes:- ReadWriteManyresources:requests:storage: 5GistorageClassName: nfs-storage
5. 在 Pod 中掛載 PVC
apiVersion: v1
kind: Pod
metadata:name: nfs-pod
spec:containers:- name: app-containerimage: nginxvolumeMounts:- mountPath: "/usr/share/nginx/html"name: nfs-storagevolumes:- name: nfs-storagepersistentVolumeClaim:claimName: nfs-pvc
6. 驗證 NFS 掛載是否成功
kubectl apply -f nfs-storageclass.yaml
kubectl apply -f nfs-provisioner.yaml
kubectl apply -f nfs-pvc.yaml
kubectl apply -f nfs-pod.yaml
kubectl get pods
kubectl exec -it nfs-pod -- df -h
如果成功,Pod 內 /usr/share/nginx/html
目錄將會掛載到 NFS 服務器的 /mnt/nfs-share
,多個 Pod 可以共享此存儲。