知识卡片

Helm模拟Linux包管理器思路却难以应对有状态应用

普通读书笔记卡

内容

Helm走的是比[[Kustomize用Base Overlay分离信息但不解决应用全生命周期 管理]]更系统的路线:直接照搬Linux发行版包管理工具(apt-get/dpkg、 yum/rpm)的成熟思路——用户只要知道应用名,就能从仓库下载、安装、升级、 部署、卸载、回滚,依赖信息和版本变更由工具自己管理。对应地,Helm设计了 Chart(应用封装格式,一个目录集合,含Chart.yaml描述应用信息、 requirements.yaml声明依赖坐标、values.yaml给出可配置项默认值、 templates目录存放资源模板)和Repository(应用仓库,支持公共/私有仓库, 还能通过Hub聚合形成更大的分布式仓库)。部署时Helm把管理员设置的值覆盖 到values.yaml默认值上,再以字符串替换的形式传给模板,生成最终要部署的 资源文件。但Linux和Kubernetes部署应用有个关键差异:Linux里99%的应用只 装一份,Kubernetes里为保证可用性,同一个应用部署多份副本才是常态。Helm 为此引入了Release概念(每次安装产生一个版本,相当于该Chart的安装实例), 对无状态服务这已经足够支撑多实例并行工作。但对有状态服务(如需要绑定 特定存储位置的数据库),多个Release之间会各自和特定资源产生依赖关系, Helm本身管不好这种依赖——这道坎正是Operator要专门解决的痛点。

参考来源

- 位置:《凤凰架构:构建可靠的大型分布式系统》第11章"虚拟化容器"11.3.2节 "Helm与Chart"(源文件:_epub-src对应OEBPS/Text/chapter140.xhtml) - 结论依据:原文说明Helm模仿Linux包管理器思路设计Chart和Repository, 介绍Release概念解决Kubernetes应用多实例部署的特殊性,并明确指出Helm 无法很好地管理有状态服务与特定资源的依赖关系,这成为Operator要解决 的痛点,直接支撑本卡片结论。 - 原始内容:Helm一开始的目标就很明确:如果说Kubernetes是云原生操作 系统,那Helm就要成为这个操作系统上的应用商店与包管理工具……Helm无法 很好地管理这种有状态的依赖关系,所以这一类问题就成为Operator要解决 的痛点。