知识卡片

动态存储分配用StorageClass消除人工预分配这个中间层

结构图卡

内容

[[PersistentVolume与Claim的双向声明设计分离运维与开发的关注点]]描述的 静态存储分配(Static Provisioning)有个自动化短板:Pod挂载某个Volume 时要求它必须真实存在,而Kubernetes能自动扩缩Pod数量,一旦自动扩出新 Pod,却没办法让它自动挂载一个还没被分配的PersistentVolume——要么让 多个Pod共用同一个PVC(牺牲隔离性),要么要求管理员提前手工建好所有 可能用到的PV(牺牲自动化),两条路都不符合工业级编排系统的定位。2017 年Kubernetes 1.6引入动态存储分配(Dynamic Provisioning):用户声明 存储需求时,不再靠系统撮合一个人工预置好的PV,而是由StorageClass资源 指定的资源分配器(Provisioner)自动在存储池或云存储系统里按需创建 符合要求的PV。管理员的工作从”手工建好一堆PV等着被认领”变成”配置好 StorageClass告诉系统该用哪个Provisioner”;用户依然通过PVC声明需求, 但要指明用哪个StorageClass处理。这样PersistentVolume这个概念对最终 用户变得完全不可见——它只是处理过程里的中间产物,用户只需要知道PVC 描述需求、StorageClass满足需求,这正是”只描述意图、不关心中间过程” 这条声明式API精髓的具体体现。动态分配还带来更精细的可管理性——比如 回收策略不再依赖粗暴的Recycle(rm -rf),而是交给Provisioner的代码 去实现更精细的删除逻辑,Kubernetes官方现已建议废弃Recycle策略。静态 分配没有被完全取代,只是收缩到管理员能手工管理的小型集群这个场景里, 更像是对历史的一种兼容而非并列的解决方案。

结构图

flowchart LR
    A[管理员配置StorageClass] --> B[用户创建PVC并指定StorageClass]
    B --> C[StorageClass接管撮合工作]
    C --> D[调用Provisioner自动在存储系统创建PV]
    D --> E[PV挂载给Pod, 对用户不可见]

参考来源

- 位置:《凤凰架构:构建可靠的大型分布式系统》第13章"持久化存储"13.1.3节 "动态存储分配"(源文件:_epub-src对应OEBPS/Text/chapter157.xhtml) - 结论依据:原文说明自动扩缩的Pod无法挂载未预分配的PV这一静态分配的 短板,进而详述StorageClass如何接管PVC撮合、自动调用Provisioner创建 PV,并指出这让PersistentVolume对用户不可见、体现声明式编程精髓, 直接支撑本卡片的结构梳理。 - 原始内容:使用Dynamic Provisioning来分配存储无疑是更合理的设计,不仅 省去了管理员的人工操作的中间层,而且不再需要将PersistentVolume这样 的概念暴露给最终用户……只描述意图而不关心中间具体的处理过程是声明式 编程的精髓。