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 自动准备好,完全无感知、无缝衔接

三、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.1.201
            - name: NFS_PATH          #NFS服务器数据存储目录,需和valumes参数中配置的保持一致
              value: /home/nfs/sharefile
            - name: ENABLE_LEADER_ELECTION
              value: "true"
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.1.201      #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
在这里插入图片描述


总结

通过本实战,我们基于 NFS 动态供给器(nfs-client-provisioner) 成功搭建了 Kubernetes 存储的动态创建机制,实现了:

  • 使用 PVC 自动生成对应 PV(省去了手动创建的麻烦)
  • 支持灵活配置挂载选项与存储策略(如回收策略、是否归档等)
  • 更符合 DevOps 流水线与云原生架构的自动化理念

📌 动态供给是 Stateful 应用部署中的核心能力,也是你理解 K8s 存储体系的关键一步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值