StorageClass


StorageClass自动化存储

如果你了解PV和PVC的基本用法——管理员手动创建PV,开发人员通过PVC申请使用,就可以继续往下看了。在实际生产环境中,尤其是大型集群里,手动管理PV就像用筷子吃米饭,一粒一粒夹,效率太低了!而通过StorageClass,可以告别手动创建PV!一键实现动态存储供给,让存储管理像喝水一样简单。

一、核心概念:StorageClass是什么?

StorageClass是Kubernetes中用于自动化存储资源供给的API对象,主要解决传统存储管理的两个痛点:

  1. 无需手动创建PV(PersistentVolume),PVC(PersistentVolumeClaim)申请后会自动触发PV创建。
  2. 可按业务需求定义不同存储类型(如SSD、HDD、高性能云盘),实现存储资源的分类管理。

其核心逻辑是:PVC指定StorageClass → SC关联存储插件(Provisioner)→ 插件自动创建PV并绑定PVC

二、前置条件:操作前需准备什么?

在开始前,确保你的环境满足以下条件,避免操作受阻:

  1. 已部署Kubernetes集群(1.14+版本,支持CSI插件)。
  2. 已安装对应存储的CSI插件(如阿里云CSI、AWS EBS CSI、本地存储CSI等),这是SC实现自动 provision 的核心依赖。
  3. 拥有集群管理员权限(需创建SC、PVC、Pod等资源)。
  4. 本地已配置kubectl命令行工具,且能正常连接集群。

三、实操步骤:从创建到验证全流程

步骤1:创建StorageClass(核心配置)

首先编写SC的YAML文件(以阿里云云盘为例,其他存储仅需修改provisioner和参数),文件名建议为storageclass-aliyun-disk.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: aliyun-disk-ssd  # SC的名称,后续PVC需通过此名称关联
provisioner: diskplugin.csi.alibabacloud.com  # 存储插件的Provisioner名称(需与已安装的CSI匹配)
parameters:
  type: cloud_ssd  # 存储类型,阿里云SSD云盘(不同存储参数不同,如AWS用"type: gp2")
reclaimPolicy: Delete  # PV回收策略:Delete(PVC删除时自动删PV)/ Retain(保留PV)
allowVolumeExpansion: true  # 是否允许PVC动态扩容(关键参数,需开启)
  • 关键参数说明
  • provisioner:必须与已安装的CSI插件名称一致(如本地存储用k8s.io/minikube-hostpath)。
  • reclaimPolicy:生产环境建议用Retain,避免误删PVC导致数据丢失。
  • allowVolumeExpansion:开启后可后续扩展PVC容量,无需重建存储。

创建SC并验证:

# 创建SC
kubectl apply -f storageclass-aliyun-disk.yaml

# 查看SC状态(STATUS为Available表示可用)
kubectl get sc

步骤2:创建PVC关联StorageClass

编写PVC的YAML文件(pvc-demo.yaml),通过storageClassName字段绑定上一步创建的SC。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-demo  # PVC名称,后续Pod挂载时使用
spec:
  accessModes:
    - ReadWriteOnce  # 访问模式:单节点读写(常用,其他模式为ReadOnlyMany、ReadWriteMany)
  storageClassName: aliyun-disk-ssd  # 关联的SC名称(必须与SC的metadata.name一致)
  resources:
    requests:
      storage: 20Gi  # 申请的存储容量

创建PVC并验证自动创建PV:

# 创建PVC
kubectl apply -f pvc-demo.yaml

# 查看PVC状态(STATUS为Bound表示已绑定PV)
kubectl get pvc

# 查看自动创建的PV(会发现PV名称自动生成,且STATUS为Bound)
kubectl get pv

步骤3:创建Pod使用存储

编写Pod的YAML文件(pod-demo.yaml),通过volumeMountsvolumes挂载PVC。

apiVersion: v1
kind: Pod
metadata:
  name: pod-demo
spec:
  containers:
  - name: nginx
    image: nginx:latest  # 用Nginx镜像示例
    volumeMounts:
    - name: data-volume  # 卷名称,需与下方volumes.name一致
      mountPath: /usr/share/nginx/html  # Pod内的挂载路径
  volumes:
  - name: data-volume
    persistentVolumeClaim:
      claimName: pvc-demo  # 关联的PVC名称(必须与PVC的metadata.name一致)

创建Pod并验证挂载:

# 创建Pod
kubectl apply -f pod-demo.yaml

# 查看Pod状态(STATUS为Running表示正常)
kubectl get pod

# 进入Pod验证挂载(查看挂载路径是否存在)
kubectl exec -it pod-demo -- ls /usr/share/nginx/html

步骤4:验证自动化效果

完成以上步骤后,可通过两个操作验证SC的自动化能力:

  1. 删除PVC测试回收策略:若SC的reclaimPolicyDelete,删除PVC后,自动创建的PV也会被删除;若为Retain,PV会保留(需手动删除)。
kubectl delete pvc pvc-demo
kubectl get pv  # 观察PV状态变化
  1. PVC动态扩容:修改PVC的storage字段(如从20Gi改为30Gi),应用后查看容量是否更新。
# 编辑PVC,修改resources.requests.storage为30Gi
kubectl edit pvc pvc-demo

# 查看扩容结果(CAPACITY字段会从20Gi变为30Gi)
kubectl get pvc

四、进阶配置:满足复杂业务需求

1. 定义多类型StorageClass

针对不同业务场景(如数据库用SSD、日志存储用HDD),可创建多个SC:

  • SSD类型SC:aliyun-disk-ssd(对应type: cloud_ssd)。
  • HDD类型SC:aliyun-disk-hdd(对应type: cloud_efficiency)。
  • 使用时,PVC通过storageClassName选择对应的存储类型即可。

2. 设置SC为默认存储类

若希望PVC不指定storageClassName时,自动使用某个SC,可添加storageclass.kubernetes.io/is-default-class: "true"注解:

metadata:
  name: aliyun-disk-ssd
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"

五、常见问题排查

  1. PVC一直处于Pending状态
  2. 检查SC的provisioner是否与CSI插件匹配(kubectl get csidrivers查看已安装的CSI)。
  3. 检查存储资源是否充足(如云盘是否有配额限制)。

  4. PVC扩容失败

  5. 确认SC的allowVolumeExpansion已设为true
  6. 确认存储后端支持扩容(如部分本地存储不支持)。

StorageClass实战

以下是专为本地存储设计的完整YAML模板集合,基于local-path-provisioner插件实现(最常用的本地存储自动供给方案),包含StorageClass、PVC和Pod的配置,可直接用于单节点或多节点集群的本地存储场景。

前置条件

需先安装local-path-provisioner插件(若未安装,可参考文末的快速安装命令)。

1. StorageClass 配置(本地存储类)

local-storageclass.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-path  # 存储类名称,后续PVC需引用此名称
provisioner: rancher.io/local-path  # local-path-provisioner的固定provisioner名称
parameters:
  # 存储路径格式:默认在节点的/var/lib/rancher/k3s/storage/下创建以"命名空间-PVC名称"为名的目录
  pathPattern: "${.PVC.namespace}/${.PVC.name}"
  storageType: directory  # 存储类型为目录(可选:directory/file)
reclaimPolicy: Delete  # PVC删除时自动清理存储(测试环境推荐),生产环境可改为Retain
volumeBindingMode: WaitForFirstConsumer  # 关键参数:等待第一个使用该PVC的Pod调度后再创建PV,确保与Pod在同一节点
allowVolumeExpansion: false  # 本地存储通常不支持动态扩容(根据实际需求调整)

核心参数说明

  • volumeBindingMode: WaitForFirstConsumer:必须设置,避免PV创建在与Pod不同的节点导致挂载失败。
  • pathPattern:定义本地存储在节点上的实际路径,默认路径可通过修改provisioner配置调整。

2. PVC 配置(关联本地存储类)

local-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-pvc-demo  # PVC名称,Pod将引用此名称
  namespace: default  # 可根据实际命名空间调整
spec:
  accessModes:
    - ReadWriteOnce  # 本地存储仅支持单节点读写(RWO),不支持多节点共享
  storageClassName: local-path  # 关联上面创建的本地存储类
  resources:
    requests:
      storage: 10Gi  # 申请10GB本地存储(根据需求调整)

3. Pod 配置(使用本地存储)

local-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: local-storage-demo-pod
  namespace: default
spec:
  containers:
  - name: demo-container
    image: busybox:latest  # 轻量镜像,方便测试
    command: ["sleep", "3600"]  # 保持容器运行
    volumeMounts:
    - name: local-storage-vol  # 卷名称,需与下方volumes.name一致
      mountPath: /data  # 容器内的挂载路径(数据将存储于此)
  volumes:
  - name: local-storage-vol
    persistentVolumeClaim:
      claimName: local-pvc-demo  # 关联上面创建的PVC名称

部署与验证步骤

  1. 安装local-path-provisioner(若未安装)
# 适用于K8s集群的安装命令(来自官方仓库)
kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.24/deploy/local-path-storage.yaml
  1. 部署存储类、PVC和Pod
kubectl apply -f local-storageclass.yaml
kubectl apply -f local-pvc.yaml
kubectl apply -f local-pod.yaml
  1. 验证部署结果
# 查看StorageClass
kubectl get sc local-path

# 查看PVC状态(STATUS为Bound表示成功)
kubectl get pvc local-pvc-demo

# 查看Pod状态(STATUS为Running表示正常)
kubectl get pod local-storage-demo-pod

# 验证存储挂载(进入Pod查看/data目录)
kubectl exec -it local-storage-demo-pod -- ls /data

扩展说明

  • 存储路径查看:在Pod所在节点上,可通过/var/lib/rancher/k3s/storage/default-local-pvc-demo路径找到实际存储的数据(路径格式与pathPattern对应)。
  • 多节点场景:若集群有多个节点,PV会自动创建在Pod调度的节点上,无需手动指定节点。
  • 数据持久化:若reclaimPolicy设为Retain,删除PVC后数据会保留在节点路径中,可手动恢复。

这套模板适用于开发测试、单机部署或对存储性能要求高但无需跨节点共享的场景,如本地数据库、日志存储等。