StorageClass自动化存储
如果你了解PV和PVC的基本用法——管理员手动创建PV,开发人员通过PVC申请使用,就可以继续往下看了。在实际生产环境中,尤其是大型集群里,手动管理PV就像用筷子吃米饭,一粒一粒夹,效率太低了!而通过StorageClass,可以告别手动创建PV!一键实现动态存储供给,让存储管理像喝水一样简单。
一、核心概念:StorageClass是什么?
StorageClass是Kubernetes中用于自动化存储资源供给的API对象,主要解决传统存储管理的两个痛点:
- 无需手动创建PV(PersistentVolume),PVC(PersistentVolumeClaim)申请后会自动触发PV创建。
- 可按业务需求定义不同存储类型(如SSD、HDD、高性能云盘),实现存储资源的分类管理。
其核心逻辑是:PVC指定StorageClass → SC关联存储插件(Provisioner)→ 插件自动创建PV并绑定PVC。
二、前置条件:操作前需准备什么?
在开始前,确保你的环境满足以下条件,避免操作受阻:
- 已部署Kubernetes集群(1.14+版本,支持CSI插件)。
- 已安装对应存储的CSI插件(如阿里云CSI、AWS EBS CSI、本地存储CSI等),这是SC实现自动 provision 的核心依赖。
- 拥有集群管理员权限(需创建SC、PVC、Pod等资源)。
- 本地已配置
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),通过volumeMounts和volumes挂载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的自动化能力:
- 删除PVC测试回收策略:若SC的
reclaimPolicy为Delete,删除PVC后,自动创建的PV也会被删除;若为Retain,PV会保留(需手动删除)。
kubectl delete pvc pvc-demo
kubectl get pv # 观察PV状态变化
- 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"
五、常见问题排查
- PVC一直处于Pending状态:
- 检查SC的
provisioner是否与CSI插件匹配(kubectl get csidrivers查看已安装的CSI)。 -
检查存储资源是否充足(如云盘是否有配额限制)。
-
PVC扩容失败:
- 确认SC的
allowVolumeExpansion已设为true。 - 确认存储后端支持扩容(如部分本地存储不支持)。
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名称
部署与验证步骤
- 安装local-path-provisioner(若未安装):
# 适用于K8s集群的安装命令(来自官方仓库)
kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.24/deploy/local-path-storage.yaml
- 部署存储类、PVC和Pod:
kubectl apply -f local-storageclass.yaml
kubectl apply -f local-pvc.yaml
kubectl apply -f local-pod.yaml
- 验证部署结果:
# 查看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后数据会保留在节点路径中,可手动恢复。
这套模板适用于开发测试、单机部署或对存储性能要求高但无需跨节点共享的场景,如本地数据库、日志存储等。