2025 k8s存储实战:StorageClass实现动态供给的核心机制
·
k8s存储实战:StorageClass实现动态供给的核心机制
一、StorageClass是什么
StorageClass 是 Kubernetes 中用来定义“动态存储供给”策略的资源对象。 它本质上是一种 “存储模板”,告诉 Kubernetes 在需要时如何自动创建 PersistentVolume(PV),以满足用户通过 PersistentVolumeClaim(PVC)提出的存储需求。

二、为什么需要StorageClass
在没有 StorageClass 之前,我们只能用静态方式来创建存储:
运维人员先手动创建好一个个 PersistentVolume(PV) 开发者写 PVC 去匹配已有的 PV 一旦需求变多、环境变复杂(比如多种存储类型),就变得又麻烦又容易错 StorageClass 帮你解决了这些问题,它的价值可以总结为三点:
✅ 自动创建 PV:实现 PVC 的动态供给 ✅ 支持多种存储后端:如 NFS、Ceph、阿里云盘、腾讯云 CSI、iSCSI等 ✅ 提升 DevOps 自动化能力:PVC 写好了,PV 自动准备好,完全无感知、无缝衔接
三 、节点前置需求部署(NFS 部署)
需要在每台集群节点上开通nfs服务 # 安装NFS服务端 yum install -y nfs-utils # 编辑导出配置 下面的目录根据具体的目录进行调整 echo "/home/nfs/sharefile *(rw,sync,no_root_squash,no_subtree_check)" | sudo tee -a /etc/exports # 应用配置 sudo exportfs -a sudo systemctl restart nfs-server # 查看当前NFS共享规则 cat /etc/exports # 检查生效的共享目录 sudo exportfs -v # 测试客户端挂载(在另一台机器执行) mkdir -p /mnt/nfs-test mount -t nfs <NFS服务器IP>:/data/nfs/sharefile /mnt/nfs-test
四、StroageClass实战部署(基于NFS)
📌 本文以 nfs-client-provisioner 为例,使用 NFS 实现 Kubernetes 存储的动态供给。它可以根据 PVC 请求,在指定的 NFS 目录下自动创建对应的子目录并绑定成 PV,实现“即需即得”的存储。
1. 创建RBAC(nfs-rbac.yaml)
apiVersion: v1 kind: ServiceAccount metadata: name: nfs-client-provisioner namespace: kube-system --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: nfs-client-provisioner-runner rules: - apiGroups: [""] resources: ["persistentvolumes"] verbs: ["get", "list", "watch", "create", "delete"] - apiGroups: [""] resources: ["persistentvolumeclaims"] verbs: ["get", "list", "watch", "update"] - apiGroups: ["storage.k8s.io"] resources: ["storageclasses"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["events"] verbs: ["create", "update", "patch"] --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: run-nfs-client-provisioner subjects: - kind: ServiceAccount name: nfs-client-provisioner namespace: kube-system roleRef: kind: ClusterRole name: nfs-client-provisioner-runner apiGroup: rbac.authorization.k8s.io --- kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: leader-locking-nfs-client-provisioner namespace: kube-system rules: - apiGroups: [""] resources: ["endpoints"] verbs: ["get", "list", "watch", "create", "update", "patch"] --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: leader-locking-nfs-client-provisioner namespace: kube-system subjects: - kind: ServiceAccount name: nfs-client-provisioner namespace: kube-system roleRef: kind: Role name: leader-locking-nfs-client-provisioner apiGroup: rbac.authorization.k8s.io
2. 创建nfs动态卷供给器(nfs-provisioner-deploy.yaml)
kind: Deployment apiVersion: apps/v1 metadata: name: nfs-client-provisioner namespace: kube-system spec: replicas: 1 selector: matchLabels: app: nfs-client-provisioner strategy: type: Recreate #设置升级策略为删除再创建(默认为滚动更新) template: metadata: labels: app: nfs-client-provisioner spec: serviceAccountName: nfs-client-provisioner #上一步创建的ServiceAccount名称 containers: - name: nfs-client-provisioner image: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0 volumeMounts: - name: nfs-client-root mountPath: /persistentvolumes env: - name: PROVISIONER_NAME #Provisioner的名称,以后设置的storageclass要和这个保持一致 value: storage-nfs - name: NFS_SERVER #NFS服务器地址,需和valumes参数中配置的保持一致 value: 192.168.240.128 - name: NFS_PATH #NFS服务器数据存储目录,需和valumes参数中配置的保持一致 value: /home/nfs/sharefile - name: ENABLE_LEADER_ELECTION value: "true" volumes: - name: nfs-client-root nfs: server: 192.168.240.128 #NFS服务器地址 path: /home/nfs/sharefile #NFS共享目录
3. 创建StorageClass(nfs-storageclass.yaml)
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: namespace: kube-system name: nfs-storage annotations: storageclass.kubernetes.io/is-default-class: "false" #是否设置为默认的storageclass provisioner: storage-nfs # 动态卷分配者名称,必须和上面创建的deploy中环境变量“PROVISIONER_NAME”变量值一致 parameters: archiveOnDelete: "true" #设置为false时删除PVC不会保留数据,true则保留数据 mountOptions: - hard #指定为硬挂载方式 reclaimPolicy: Retain #配置回收策略,表示PVC删除后PV不会被自动删除,数据依然保留
4. 创建PVC(storage-pvc.yaml)
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: storage-pvc namespace: kube-system spec: storageClassName: nfs-storage #需要与上面创建的storageclass的名称一致 accessModes: - ReadWriteOnce resources: requests: storage: 1Mi
5. 部署所有资源
将上述 YAML 文件保存后,使用以下命令统一部署
kubectl apply -f nfs-rbac.yaml
kubectl apply -f nfs-provisioner-deploy.yaml
kubectl apply -f nfs-storageclass.yaml
kubectl apply -f storage-pvc.yaml
6. 验证pvc绑定
kubectl get svc -n kube-system (状态为Bound即为成功)

更多推荐
所有评论(0)