写点什么

helm-kubernetes 的包管理器

用户头像
片风
关注
发布于: 2021 年 05 月 26 日
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 等环境,创建目录如下


.├── charts│   └── apollo└── inventories    ├── dev    │   └── apollo.yaml    ├── prod    │   └── apollo.yaml    ├── staging    │   └── apollo.yaml    └── test        └── apollo.yaml
复制代码


安装的时候基于不同的配置文件进行生效:

比如 helm install charts/apollo -f inventories/dev/apollo.yaml


模板文件

Helm chart 模板是用 go 模板语言(go template language)编写的。

使用 helm create chart 可以生成 helm 的初始模板。


.├── charts //存储子chart以及依赖chart├── Chart.yaml // chart定义├── templates // 存储资源的模板文件│   ├── deployment.yaml // deployment资源│   ├── _helpers.tpl // 配置一些常量│   ├── hpa.yaml // hpa资源│   ├── ingress.yaml // ingress资源│   ├── NOTES.txt│   ├── serviceaccount.yaml // sa资源│   ├── service.yaml // service资源│   └── tests│       └── test-connection.yaml└── values.yaml // 定义一些变量的默认值,可以在安装或者升级时进行变量覆盖
复制代码

其中 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 安装之后的列表:


image.png


        里面是有 revision,在更新之后 revision 会递增, 可以基于 revision 进行回滚。


组件管理

Helm 可以通过子 chart 做组件管理。子 chart 是一个独立的 chart, 不依赖于父 chart。父 chart 变量可以覆盖子变量,也可以定义一些 global 的变量, 父子 chart 都可以使用。

子 chart 的变量修改需要在变量前面加上子 chart 名称。

全局变量关键字是 global, chart 访问使用{{ .Values.global.xxx }}。


服务依赖管理

通过 chart 中依赖的配置进行服务依赖管理,比如:


# Chart.yamldependencies:- name: nginx    version: "1.2.3"    repository: "https://example.com/charts"- name: memcached    version: "3.2.1"    repository: "https://another.example.com/charts"
复制代码


需要把对应依赖的远端仓库加载到 repo 列表中,安装的时候依赖 chart 会下载到 charts 文件夹中,自定义安装。

用户头像

片风

关注

还未添加个人签名 2018.08.08 加入

还未添加个人简介

评论

发布
暂无评论
helm-kubernetes的包管理器