@
byzf 1. Hack 或 Solution ,取决于一个语言有没有足够的规范来约束用法、语法更新频率是否够高,强约束性和能够及时更新特性的高级语言,是很少、或仅能短暂存在 Hack 的,比如 Jenkins 用的 Groovy 。Yaml 作为一种 markup language ,本质上是一份描述文件,Helm 在描述文件的基础上提供了逻辑判断、运算符的中间层逻辑,而最终文件仍然是 markup language 逻辑的声明式描述文件,这种软件对于编码语言的弱约束带来的极高自由度是一定会存在 Hack 的,而且并不能称为 Hack ,因为解析编码语言的处理器本身并没有缺失对应的处理逻辑,而是直接告诉你万物皆允。
通常在 Nested Chart 里,子 Chart 里的配置在母 Values 里缺失的情况非常常见,这种可以在母 Values 里用 key override 的方式直接覆盖。如果子 Chart 没有,或者 Chart 作者提供的判断逻辑对你而言不适用,你可以直接改造子 Chart ,并在 Values 中新增对应的键值。
2. Helm 作为一个包管理器角色事实上是有些过誉了,Helm 做不到传统意义上的包管理器比如 yum 的逻辑复杂度,这类包管理器通常会存在大量的自检、判断、依赖检查、善后检查。Helm 更近似 npm 这种依赖作者的 manifest 进行包安装、包卸载的简单管理器。Helm 的出发点和主要服务目的,是简化零散 K8s 资源的管理、安装、卸载,并在这之上被社区发展出了版本管理、回滚(实则是操作 RS )等添头。使用 Operator 管理是正确的,而且与 Helm 并不冲突,Helm 在原始文件的管理阶段,比如你 operator 的 deployment 仍然可以通过 Helm 来部署,而 Operator 的核心目的实际上是试图解决 StatefulSet 在扩容上的棘手问题,出于该核心目的衍生出了部署逻辑,Operator 才因而存在可以 gracefully 部署、清除应用以及跟该应用相关联的 K8S res 的能力,这与 Helm 是两个不同的出发点,两者在某些角度上来看存在功能的重叠,但实则是不同的处理逻辑。
我们这边使用 Helm 的方式,是公司有专门的 infra team 管理 Chart ,Chart 的来源可能是自编或 bitnami 等他人写好的,每一个 Chart 都会 Clone 到本地,固化 Values 数值变动(或准备多份 Values ),然后提供 git repo 给 cluster operator 部署。如果 remote 有更新,就 diff 对比变动,然后择选合并到本地,并且创建新的版本分支且 M 到 Main ;如果内部有需求,则根据内部需求修改 Values 或者改造 Chart 本身。