存储类 #

一、StorageClass概述 #

StorageClass是Kubernetes中定义存储类型的资源,支持动态存储供给。

1.1 StorageClass功能 #

text
StorageClass功能
    │
    ├── 定义存储类型
    │   ├── 存储性能等级
    │   └── 存储后端类型
    │
    ├── 动态供给
    │   └── 自动创建PV
    │
    ├── 存储参数
    │   └── 后端存储配置
    │
    └── 回收策略
        └── 默认回收策略

1.2 动态供给流程 #

text
动态供给流程
    │
    ├── 1. 创建PVC,指定StorageClass
    │
    ├── 2. Provisioner检测PVC
    │
    ├── 3. 自动创建底层存储
    │
    ├── 4. 自动创建PV
    │
    └── 5. 绑定PVC和PV

二、创建StorageClass #

2.1 基本示例 #

yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: Immediate

2.2 字段说明 #

字段 说明
provisioner 存储供给器
parameters 存储参数
reclaimPolicy 回收策略
allowVolumeExpansion 允许扩容
volumeBindingMode 绑定模式

2.3 默认StorageClass #

yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: kubernetes.io/aws-ebs

三、常用Provisioner #

3.1 云平台Provisioner #

yaml
# AWS EBS
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: aws-ebs
provisioner: ebs.csi.aws.com
parameters:
  type: gp3
  fsType: ext4
---
# GCE PD
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: gce-pd
provisioner: pd.csi.storage.gke.io
parameters:
  type: pd-standard
---
# Azure Disk
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azure-disk
provisioner: disk.csi.azure.com
parameters:
  storageaccounttype: Standard_LRS

3.2 NFS Provisioner #

yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-client
provisioner: nfs-client
parameters:
  archiveOnDelete: "true"

3.3 Local Provisioner #

yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

3.4 Ceph RBD #

yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ceph-rbd
provisioner: rbd.csi.ceph.com
parameters:
  clusterID: ceph-cluster
  pool: rbd
  imageFormat: "2"
  imageFeatures: layering
  csi.storage.k8s.io/provisioner-secret-name: ceph-secret
  csi.storage.k8s.io/provisioner-secret-namespace: default

四、绑定模式 #

4.1 Immediate模式 #

yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: immediate-sc
provisioner: kubernetes.io/aws-ebs
volumeBindingMode: Immediate
text
Immediate模式
    │
    ├── PVC创建后立即绑定
    │
    └── 不考虑Pod调度位置

4.2 WaitForFirstConsumer模式 #

yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: wait-sc
provisioner: kubernetes.io/aws-ebs
volumeBindingMode: WaitForFirstConsumer
text
WaitForFirstConsumer模式
    │
    ├── 等待Pod使用PVC
    │
    └── 在Pod所在节点创建存储

五、卷扩容 #

5.1 启用扩容 #

yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: expandable-sc
provisioner: kubernetes.io/aws-ebs
allowVolumeExpansion: true

5.2 扩容操作 #

bash
# 编辑PVC扩容
kubectl edit pvc <pvc-name>

# 修改storage字段
spec:
  resources:
    requests:
      storage: 20Gi

# 查看扩容状态
kubectl describe pvc <pvc-name>

六、使用StorageClass #

6.1 创建PVC #

yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: dynamic-pvc
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: standard
  resources:
    requests:
      storage: 10Gi

6.2 在Pod中使用 #

yaml
apiVersion: v1
kind: Pod
metadata:
  name: dynamic-pod
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: data
      mountPath: /usr/share/nginx/html
  volumes:
  - name: data
    persistentVolumeClaim:
      claimName: dynamic-pvc

七、完整示例 #

7.1 NFS动态存储 #

yaml
# NFS Provisioner Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-client-provisioner
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      containers:
      - name: nfs-client-provisioner
        image: quay.io/external_storage/nfs-client-provisioner:latest
        volumeMounts:
        - name: nfs-root
          mountPath: /persistentvolumes
        env:
        - name: PROVISIONER_NAME
          value: nfs-client
        - name: NFS_SERVER
          value: 192.168.1.100
        - name: NFS_PATH
          value: /data/nfs
      volumes:
      - name: nfs-root
        nfs:
          server: 192.168.1.100
          path: /data/nfs
---
# StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-storage
provisioner: nfs-client
parameters:
  archiveOnDelete: "true"
---
# PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
  - ReadWriteMany
  storageClassName: nfs-storage
  resources:
    requests:
      storage: 5Gi

八、StorageClass管理 #

8.1 查看StorageClass #

bash
# 查看StorageClass列表
kubectl get storageclass
kubectl get sc

# 输出示例
NAME            PROVISIONER             AGE
standard        kubernetes.io/aws-ebs   10d
nfs-storage     nfs-client              5d

# 查看详情
kubectl describe sc <sc-name>

8.2 设置默认StorageClass #

bash
# 设置默认
kubectl annotate storageclass <sc-name> storageclass.kubernetes.io/is-default-class=true

# 取消默认
kubectl annotate storageclass <sc-name> storageclass.kubernetes.io/is-default-class-

8.3 删除StorageClass #

bash
# 删除StorageClass
kubectl delete sc <sc-name>

# 注意:删除SC不会影响已创建的PV

九、故障排查 #

9.1 常见问题 #

bash
# 查看PVC状态
kubectl describe pvc <pvc-name>

# 查看Provisioner日志
kubectl logs -l app=nfs-client-provisioner

# 查看事件
kubectl get events --field-selector involvedObject.name=<pvc-name>

9.2 问题诊断 #

问题 原因 解决方案
PVC一直Pending Provisioner异常 检查Provisioner状态
供给失败 参数错误 检查StorageClass参数
权限问题 Secret配置错误 检查Secret配置

十、最佳实践 #

10.1 命名规范 #

text
命名建议
    │
    ├── 按性能等级命名
    │   ├── fast-ssd
    │   ├── standard-hdd
    │   └── archive
    │
    └── 按用途命名
        ├── database
        ├── web-content
        └── logs

10.2 多存储类配置 #

yaml
# 高性能SSD
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp3
  iopsPerGB: "10"
---
# 标准存储
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard-hdd
provisioner: kubernetes.io/aws-ebs
parameters:
  type: sc1

十一、总结 #

11.1 核心要点 #

要点 说明
Provisioner 存储供给器
动态供给 自动创建PV
绑定模式 Immediate/WaitForFirstConsumer
卷扩容 allowVolumeExpansion

11.2 下一步 #

掌握了StorageClass后,让我们学习 动态存储供给,深入了解动态存储的实现机制。

最后更新:2026-03-28