默认 StorageClass 是什么
PVC 里不写 storageClassName 时,集群会去找被标记为默认的 StorageClass,由它来动态供应卷。默认标记写在一个注解上(storageclass.kubernetes.io/is-default-class),因此「默认类」本身是集群级约定而非硬编码。当集群里存在两个默认类时,同一个未声明类名的 PVC 会落到哪个类就不那么可预期了,这是存储行为漂移最常见的来源之一。
基本信息
| 适用对象 | 未声明 storageClassName 的 PVC |
|---|---|
| 标记方式 | 注解 storageclass.kubernetes.io/is-default-class 设为 true |
| 查看 | kubectl get sc,名字后带 (default) 的即当前默认类 |
| 命名空间注解 | storageclass.kubernetes.io/default-class 命名空间级默认(较新特性) |
| 空串语义 | storageClassName 写成空串表示禁用动态供应 |
标记与取消默认
标记与取消默认
kubectl get sc # 名字后带 (default) 的就是默认类
kubectl patch storageclass fast-ssd -p '{"metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
kubectl patch storageclass old-class -p '{"metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
kubectl get sc fast-ssd -o jsonpath='{.metadata.annotations}' # 复核标记是否写入成功典型使用场景
- 统一默认存储:新集群接入后把推荐的存储类设为默认,业务清单不必逐个声明
- 存储迁移:把默认类从旧存储切到新存储,新创建的 PVC 自动落到新存储上
- 静态供应场景:PVC 写成空串,明确表示不参与动态供应,等待管理员手工绑定 PV
- 排查落点异常:PVC 绑到了预期之外的存储类,先检查集群里是否存在多个默认类
- 多租户隔离:不同命名空间通过命名空间级默认类使用各自的存储策略
SC 列表读法
| 列 | 含义 | 关注点 |
|---|---|---|
| NAME | 存储类名称 | 带 (default) 后缀者即默认类 |
| PROVISIONER | 供应者驱动 | 与预期存储后端是否一致 |
| RECLAIMPOLICY | 回收策略 | Delete 会影响数据安全,详见回收策略条目 |
| VOLUMEBINDINGMODE | 绑定时机 | 本地盘类通常为 WaitForFirstConsumer |
| ALLOWVOLUMEEXPANSION | 是否支持扩容 | 决定 PVC 能否在线扩容 |
| AGE | 创建时长 | 新出现的类可能是集群升级或他人变更引入 |
storageClassName 写空串与完全不写是两种语义:不写表示使用默认类,写空串表示不要动态供应。需要在只绑定静态 PV 的场景里禁用动态供应时必须写空串,否则集群会尝试给你新建一个卷。
集群里同时存在两个默认类时,未声明类名的 PVC 落点取决于控制器的选择,不同组件与版本的行为可能不一致。切换默认类后建议同时取消旧类的默认标记,保持唯一性并记录变更。