内容提要
Kubernetes存储用于解决容器重启后数据保留及Pod内多容器共享数据的问题,需使用Volume。存储类型包括本地存储、网络存储(in-tree/out-of-tree)、Projected Volume和PV/PVC体系。PVC声明存储需求,PV承载实际存储,二者职责分离并由控制器绑定。PV支持静态和动态供给,动态供给更灵活。PV关键字段有Capacity、AccessModes、回收策略、StorageClassName和NodeAffinity。
延伸解读
为什么需要PVC与PV分离
文章指出,PVC与PV的职责分离让用户只需声明存储大小、访问模式等业务需求,而PV及其后端存储信息由集群管理员统一管理。这种设计类似面向对象中的接口与实现,既简化了用户操作,又便于控制安全访问策略。
静态供给的局限与动态供给的优势
静态Volume需要管理员预先分配不同大小的PV,但用户需求多样,容易导致PVC找不到合适的PV。动态Volume则允许管理员创建存储模板,用户通过PVC指定模板和需求,K8S自动生成并绑定PV,更灵活地满足实际使用。
PV关键字段如何影响绑定与调度
PV的Capacity和AccessModes必须与PVC匹配才能绑定,绑定时会优先选择访问模式列表最短且容量最小的PV。回收策略决定PV释放后的处理方式,StorageClassName用于关联存储类,NodeAffinity则限制可访问该卷的节点,进而影响Pod调度。
Q&A
Kubernetes中为什么需要Volume?
Volume用于解决容器重启后数据保留以及同一个Pod内多个容器共享数据的问题。
Kubernetes支持哪些存储类型?
包括本地存储、网络存储(分为in-tree和out-of-tree)、Projected Volume(如secret、configmap、downwardAPI、ServiceAccountToken)以及PVC与PV体系。
为什么有了PV还需要PVC?
PVC用于声明用户需要的存储大小、访问模式等业务需求,PV承载实际存储信息,由管理员统一管理。这样实现了职责分离,简化了用户对存储的使用,并通过控制器将PVC与合适的PV绑定。
静态Volume和动态Volume有什么区别?
静态Volume需要管理员预先分配不同大小的PV,用户提交PVC后系统根据规则绑定,但容易因需求多样导致找不到合适PV。动态Volume则只需创建存储模板,用户PVC指定模板和需求,K8S自动生成PV并绑定,更灵活。
PV的AccessModes如何影响绑定?
PV的AccessModes必须与PVC的AccessModes匹配才能绑定。PV Controller会优先选择AccessModes列表最短且匹配PVC的PV集合,然后从中选择容量最小且满足PVC需求的PV。
PV的回收策略有哪些?
PV的回收策略由PersistentVolumeReclaimPolicy字段定义,用于指定PV被释放(绑定的PVC被删除)后的回收再利用方式。
Pod中多个容器如何共享数据?
可以在Pod中定义Volume,并在多个容器的volumeMounts中挂载同一个Volume,通过subPath隔离不同容器在同一个Volume上的数据存储路径。