helm-kubernetes 的包管理器
Helm 简介
Helm 官方定义为 kubernetes 的包管理器,有点类似 Linux 里面的 RPM。在使用 kubernetes 做应用管理的时候,kubernetes 中定义了很多资源类型,比如官方支持的 pod, deployment, statefulset, service, ingress 等, 还有一些通过 crd 创建的,比如 virtualservice, destinationrule 等,这些资源类型配置,维护以及编排可以通过 yaml 文件进行管理。但这些 yaml 文件本身的管理需要一个合适的工具,这个工具需要提供如下功能:
模板渲染 这些资源文件在不同环境可以生效不同的配置,不同场景下不同编排逻辑
模板管理 资源文件本身的版本控制,发布,回滚等功能,以及分享,复用功能
组件管理 中间件服务可能存在不同的组件,需要对不同组件进行编排,维护,比如 rocketmq,存在组件 rocketmq-nameserv, rocketmq-broker, rocketmq-console 等组件
服务依赖管理 在各个资源文件里面,资源之间是没有关系的,实际上各个服务是可能存在一些依赖关系的
helm 就是解决类似问题的一个工具。
helm 有三大概念,chart, repository, 以及 release。
Chart 代表 helm 包, 包含 kubernetes 内运行的应用,工具以及服务的所有资源定义。
Repository(仓库) 存放和共享 chart 的地方,公有的 chart 仓库为 https://artifacthub.io/,可以在该仓库上搜索到社区提交的不同服务的 chart;也可以创建私有仓库。Harbor1.10 以上就提供了 helm chart 仓库功能; 一般的 web 服务器也可以作为 helm chart 仓库,需要 web 服务器在 charts 目录下有 index.yaml 文件可以访问以及 chart 目录。
Release 运行在 kubernetes 的 chart 实例,同一个 chart 可以在 kubernetes 集群安装多次,每一次都会生成一个新的 release
模板渲染
helm 把整个资源文件(yaml 文件)拆分成模板文件 templates 以及值 values。values 文件里面是可变的一些配置,template 文件是整个配置模板,基于不同 values 数据以及同一个 template 文件渲染出不同的资源配置文件。
Helm chart 模板是用 go 模板语言(go template language)编写的。所有模板文件都存储在 chart 的 templates / 文件夹中。当 Helm 渲染 charts 时,它将通过模板引擎传递该目录中的每个文件。
模板的值有两种提供方法:
chart 开发人员可能会在 chart 内部提供一个 values.yaml 文件。该文件可以包含默认值。
chart 用户可能会提供一个包含值的 YAML 文件。这可以通过命令行提供
helm install -f
。当用户提供自定义值时,这些值将覆盖 chart 中
values.yaml
文件中的值。chart 用户可以在安装 chart 的时候通过--set 临时调整数值,比如 helm install --set key1=val1,key2=val2
最佳实践
Helm chart 只会保存公共的模板逻辑,对于不同环境之间不同的 value 设置,建议维护不同的配置文件。比如 dev, test, staging, prod 等环境,创建目录如下
安装的时候基于不同的配置文件进行生效:
比如 helm install charts/apollo -f inventories/dev/apollo.yaml
模板文件
Helm chart 模板是用 go 模板语言(go template language)编写的。
使用 helm create chart 可以生成 helm 的初始模板。
其中 templates 模板可以根据服务不同新增以及减少资源文件。具体模板文件的编写参见https://helm.sh/zh/docs/chart_template_guide/getting_started/。
版本管理
在应用的 chart 进行更新之后,可以修改 chart 版本,然后提交到 chart 仓库(在提交之前需要通过 helm package 进行打包)。在运行环境中就可以使用 helm install/upgrade 进行应用部署,部署的 chart 可以选择从仓库进行拉取。chart 更新只会发生变更的资源,对于一些不变的资源不会进行更新(原理同 kubectl apply)。
在一些把 configmap 挂载为配置文件的应用,configmap 变动需要重启应用生效的,需要手动进行应用重启。
chart 安装之后的列表:
里面是有 revision,在更新之后 revision 会递增, 可以基于 revision 进行回滚。
组件管理
Helm 可以通过子 chart 做组件管理。子 chart 是一个独立的 chart, 不依赖于父 chart。父 chart 变量可以覆盖子变量,也可以定义一些 global 的变量, 父子 chart 都可以使用。
子 chart 的变量修改需要在变量前面加上子 chart 名称。
全局变量关键字是 global, chart 访问使用{{ .Values.global.xxx }}。
服务依赖管理
通过 chart 中依赖的配置进行服务依赖管理,比如:
需要把对应依赖的远端仓库加载到 repo 列表中,安装的时候依赖 chart 会下载到 charts 文件夹中,自定义安装。
评论