为何Helm Chart不包含PV?背后是否有相关最佳实践?
资源层级与职责划分:PV是集群级资源,归集群管理员负责管理,属于基础设施层;而Helm Chart聚焦于命名空间级的应用部署,只负责定义应用所需的存储声明(PVC),把PV的创建交给集群运维方,符合“应用与基础设施解耦”的最佳实践。
存储环境的异构性:不同集群的存储方案差异极大——云环境的EBS/GCE Persistent Disk、本地节点存储、分布式存储(Ceph/GlusterFS)等,每种存储对应的PV配置(
storageClassName、accessModes、nodeAffinity等)完全不同。如果在Helm Chart里加默认PV模板,大概率只能适配某一种存储环境,在其他集群部署时直接失败,反而破坏了Helm的通用性。权限限制:创建PV需要集群级的API权限(
persistentvolumes/create),而普通用户部署Helm Chart通常只有所属命名空间的权限。硬加PV模板会导致部署时出现权限不足的报错,违背了Kubernetes的最小权限原则。动态存储的普及:现在绝大多数Kubernetes集群都配置了StorageClass,PVC可以自动触发动态PV创建。Helm Chart里的PVC模板已经预留了
storageClassName配置项(很多Chart会默认使用集群的默认存储类),完全能实现“开箱即用”,不需要手动定义PV。
如果强行在Chart里加入默认PV模板,反而会带来问题:比如强制绑定特定存储类型,限制用户的灵活性;如果集群已有动态存储类,手动创建的PV可能和动态生成的PV冲突,导致PVC绑定异常。
内容的提问来源于stack exchange,提问作者Yonah Dissen

