在现代云原生架构中,持久化存储的自动化管理是高效运维的关键。Kubernetes 的 StorageClass 机制不仅定义了存储的类型和属性,更核心的是实现了“动态创建(Dynamic Provisioning)”功能,使得用户无需手动创建 PersistentVolume (PV),只需申请 PersistentVolumeClaim (PVC),底层的云存储资源即可自动被创建并绑定。
本文将详细介绍如何在 Kubernetes 集群中配置 StorageClass,实现持久化卷的动态自动创建,以 AWS EBS 为例进行说明(该原理适用于 Azure Disk、GCE Persistent Disk 等所有支持动态 Provisioner 的云存储服务)。
步骤一:理解 StorageClass 的核心参数
StorageClass 是连接 PVC 和底层存储 provisioner 的桥梁。为了实现动态创建,我们必须关注以下关键参数:
- provisioner: 指定哪个外部组件负责创建存储资源。例如,AWS EBS 是 kubernetes.io/aws-ebs。
- reclaimPolicy: 定义当 PVC 被删除后,底层 PV 和云存储资源如何处理。通常设置为 Delete 实现自动化清理。
- allowVolumeExpansion: 允许 PVC 修改后,PV 和底层存储是否可以自动扩容(如果云提供商支持)。
步骤二:定义支持动态创建的 StorageClass
我们将创建一个名为 high-performance-ssd 的 StorageClass,它使用 AWS EBS 的 gp3 类型,并开启自动扩容功能。
# storageclass-dynamic-aws.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: high-performance-ssd
provisioner: kubernetes.io/aws-ebs # AWS EBS Provisioner
parameters:
type: gp3 # 使用通用型 SSD
fsType: ext4
reclaimPolicy: Delete # 自动清理底层 EBS 卷
volumeBindingMode: Immediate
allowVolumeExpansion: true # 启用自动扩容
操作步骤:
kubectl apply -f storageclass-dynamic-aws.yaml
kubectl get sc
# 输出应包含: high-performance-ssd
步骤三:创建 PersistentVolumeClaim (PVC) 进行请求
一旦 StorageClass 定义完成,用户或应用程序只需创建一个指向该 StorageClass 的 PVC,系统就会自动触发 PV 的创建。
我们将请求一个 10Gi 的存储卷。
# pvc-request-10gi.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-app-data-pvc
spec:
storageClassName: high-performance-ssd # 引用我们在步骤二中创建的 StorageClass
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi # 请求10GB存储
操作步骤:
kubectl apply -f pvc-request-10gi.yaml
# 检查 PVC 和 PV 的状态
kubectl get pvc my-app-data-pvc
kubectl get pv
结果验证:
在执行 kubectl get pvc 后,您会看到 PVC 状态迅速变为 Bound (已绑定)。同时,kubectl get pv 会显示一个新的 PV 被自动创建,其名称由 Provisioner 随机生成,并绑定到该 PVC。更重要的是,在您的云控制台(如 AWS EC2/EBS 面板)中,一个新的 10Gi 的 EBS 卷也已经自动创建完成。
步骤四:实现持久化卷的自动扩容(动态扩容)
虽然动态创建解决了资源的按需获取问题,但如果应用需要更多空间,我们还需要 StorageClass 支持卷的“自动扩容”。
由于我们在 StorageClass 定义中已经设置了 allowVolumeExpansion: true,现在只需修改 PVC 的存储请求量即可触发扩容。
假设我们最初请求了 10Gi,现在需要 20Gi:
- 编辑 PVC 定义:
kubectl edit pvc my-app-data-pvc
# 将 spec.resources.requests.storage 从 10Gi 修改为 20Gi
- 检查状态:
kubectl get pvc my-app-data-pvc
Kubernetes 控制器会检测到 PVC 存储请求的增加,并指示底层的 Provisioner(如 EBS)对实际的云存储卷进行扩容。扩容完成后,PV 会自动更新其容量,无需停机(具体取决于存储提供商和文件系统是否支持在线扩容)。
总结
通过配置 StorageClass 和利用云提供商的 Provisioner,Kubernetes 实现了存储资源的完全自动化管理:当 PVC 请求时自动创建 PV 和底层存储(动态创建),并在 PVC 需求增加时自动调整存储容量(自动扩容),极大地简化了云环境下的持久化存储运维工作。
汤不热吧