摘要
StorageClass(别名sc) 介绍
K8s 的存储资源分为两种供应模式:静态供应模式 和 动态供应模式。
静态模式下,管理员需要预先创建许多PV,等待 PVC 来绑定。
动态模式下,Kubernetes 会通过 StorageClass 自动创建 PV,并完成与 PVC 的绑定。
StorageClass 是 Kubernetes 中用来定义 存储后端类型和配置参数
的资源
作用: 自动创建 PV(PersistentVolume)的“模板”或“规则”
使用场景: 配合 PVC 使用时,Kubernetes 可以根据 StorageClass 自动 动态创建 对应的持久卷。
✅ 核心优势:
无需手动创建 PV
支持多种存储后端(NFS、云盘、Ceph、GlusterFS、iSCSI…)
创建 StorageClass
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: nfs-csi provisioner: nfs.csi.k8s.io reclaimPolicy: Delete allowVolumeExpansion: true mountOptions: - hard - nfsvers=4.1 - nolock volumeBindingMode: Immediate parameters: server: 10.211 .55 .88 share: /nfs-server/data
csi-driver-nfs 从 v4.x 起,已经支持 Delete reclaimPolicy 和 allowVolumeExpansion 自动扩容。
生产环境慎用 Delete reclaimPolicy,因为此时删除 PVC 后,nfs-server 上的存储目录也会被删除。
provisioner: 存储制备器
每个 StorageClass 都有一个制备器(Provisioner),用来决定使用哪个卷插件制备 PV。 该字段必须指定。
比如 NFS 存储制备器:provisioner: nfs.csi.k8s.io
,是 K8S 官方维护的 NFS CSI 插件。Github 。
安装 NFS CSI 插件:Install NFS CSI Driver
1 2 3 4 5 6 curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/deploy/install-driver.sh | bash -s master -- kubectl -n kube-system get pod -o wide -l app=csi-nfs-controller kubectl -n kube-system get pod -o wide -l app=csi-nfs-node
1 curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/deploy/uninstall-driver.sh | bash -s master --
示例
1 2 3 4 5 6 kubectl apply -f nfs-storage.yaml $ k get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE nfs-csi nfs.csi.k8s.io Delete Immediate true 5s
1 2 3 4 5 6 7 8 9 10 11 12 13 apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nfs-pvc namespace: default spec: storageClassName: nfs-csi accessModes: - ReadWriteMany resources: requests: storage: 800Mi
1 2 3 4 5 6 7 8 9 10 11 $ k apply -f nfs-pvc.yaml persistentvolumeclaim/nfs-pvc created $ k get pv,pvc NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE persistentvolume/pvc-c1d33fec-5e16-4156-8405-1af4fc171907 800Mi RWX Delete Bound default/nfs-pvc nfs-csi <unset > 2m4s NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE persistentvolumeclaim/nfs-pvc Bound pvc-c1d33fec-5e16-4156-8405-1af4fc171907 800Mi RWX nfs-csi <unset > 2m4s
1 2 3 4 5 6 7 8 9 10 11 kubectl edit pvc nfs-pvc $ k get pv,pvc NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE persistentvolume/pvc-c1d33fec-5e16-4156-8405-1af4fc171907 1Gi RWX Delete Bound default/nfs-pvc nfs-csi <unset > 4m50s NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE persistentvolumeclaim/nfs-pvc Bound pvc-c1d33fec-5e16-4156-8405-1af4fc171907 1Gi RWX nfs-csi <unset > 4m50s
1 2 3 4 5 kubectl delete pvc nfs-pvc $ k get pv,pvc No resources found
设置默认的 StorageClass
1 2 3 4 5 6 7 8 $ kubectl patch storageclass nfs-csi -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}' storageclass.storage.k8s.io/nfs-csi patched $ k get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE nfs-csi (default) nfs.csi.k8s.io Delete Immediate true 14m
StatefulSet: 自动创建 PVC
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 apiVersion: apps/v1 kind: StatefulSet metadata: name: redis-sts namespace: sts-ns spec: revisionHistoryLimit: 10 selector: matchLabels: app: redis updateStrategy: type: RollingUpdate rollingUpdate: partition: 0 serviceName: redis-svc replicas: 2 template: metadata: labels: app: redis spec: containers: - image: redis:6.2 name: redis volumeMounts: - name: redis-data mountPath: /data volumeClaimTemplates: - metadata: name: redis-data spec: accessModes: - ReadWriteMany resources: requests: storage: 500Mi storageClassName: nfs-csi
1 2 3 4 5 6 7 8 9 10 11 12 $ kubectl apply -f redis-statefulset.yaml $ k get pv,pvc -n sts-ns NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE persistentvolume/pvc-748fc0d3-a142-4d08-b5c4-7320daea5618 500Mi RWX Delete Bound sts-ns/redis-data-redis-sts-1 nfs-csi <unset > 19s persistentvolume/pvc-807018bb-ec66-4a5c-87f1-9c11df6f4784 500Mi RWX Delete Bound sts-ns/redis-data-redis-sts-0 nfs-csi <unset > 22s NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE persistentvolumeclaim/redis-data-redis-sts-0 Bound pvc-807018bb-ec66-4a5c-87f1-9c11df6f4784 500Mi RWX nfs-csi <unset > 22s persistentvolumeclaim/redis-data-redis-sts-1 Bound pvc-748fc0d3-a142-4d08-b5c4-7320daea5618 500Mi RWX nfs-csi <unset > 20s
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 kubectl delete -f redis-statefulset.yaml $ k get pv,pvc -n sts-ns NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE persistentvolume/pvc-748fc0d3-a142-4d08-b5c4-7320daea5618 500Mi RWX Delete Bound sts-ns/redis-data-redis-sts-1 nfs-csi <unset > 6m30s persistentvolume/pvc-807018bb-ec66-4a5c-87f1-9c11df6f4784 500Mi RWX Delete Bound sts-ns/redis-data-redis-sts-0 nfs-csi <unset > 6m33s NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE persistentvolumeclaim/redis-data-redis-sts-0 Bound pvc-807018bb-ec66-4a5c-87f1-9c11df6f4784 500Mi RWX nfs-csi <unset > 6m33s persistentvolumeclaim/redis-data-redis-sts-1 Bound pvc-748fc0d3-a142-4d08-b5c4-7320daea5618 500Mi RWX nfs-csi <unset > 6m31s k delete pvc -n sts-ns redis-data-redis-sts-0 k delete pvc -n sts-ns redis-data-redis-sts-1