赞
踩
Helm 作为 Kubernetes 的包管理工具和 CNCF 毕业项目,在业界被广泛使用。但在实际使用场景中的一些需求 helm 并不能很好的满足,需要进行一些修改和适配,如同时部署多个 chart、不同部署环境的区分以及 chart 的版本控制。Helmfile
就是一个能够很好解决这些问题的小工具。
Helmfile 通过 helmfile.yaml
文件帮助用户管理和维护众多 helm chart,其最主要作用是:
•集成在 CI/CD 系统中,提高部署的可观测性和可重复性,区分环境,免去各种 --set
造成的困扰。•方便对 helm chart 进行版本控制,如指定版本范围、锁定版本等。•定期同步,避免环境中出现不符合预期的配置。
helmfile 提供了多种安装方式,除了直接在 release 页面[1]下载,还可以通过如下方式安装:
•macOS (使用 homebrew): brew install helmfile
•Windows (使用 scoop): scoop install helmfile
•Archlinux: pacman -S helmfile
•openSUSE: zypper in helmfile
同时还支持作为容器运行,可以非常方便的集成到 CI/CD 系统中:
除了安装 helmfile 以外,还需要安装 helm
、kubectl
以及 helm 插件 helm-diff
[2]。
helm-diff 安装方式:
$ helm plugin install https://github.com/databus23/helm-diff
复制
helmfile.yaml
是 helmfile 的核心文件,其用来声明所有的配置。下面会简要介绍一下,详细内容见官方文档[3]。
helmfile apply
是 helmfile 中最常用命令,体验与 kubectl apply
类似,根据 helmfile.yaml
中声明的配置可以一键执行相应的动作,如:添加 repo、安装或更新 release 等。
helmfile.yaml
如下:
repositories:- name: stable url: https://charts.helm.sh/stablereleases:- name: prom-norbac-ubuntu namespace: prometheus chart: stable/prometheus set: - name: rbac.create value: false
复制
执行 helmfile apply
之后,helmfile 会进行如下操作:
1.添加 repositories
中声明的 repo2.运行 helm diff
进行对比3.根据 release
中声明的配置,安装或更新 chart
效果如下(由于输出内容过多,这里只节选了部分输出):
helmfile 和 helm templete 一样可以使用 Go templates[4],同时还有一个特殊的功能 requiredEnv
,该函数允许声明模板渲染所需的特定环境变量,如果环境变量未设置或为空,则渲染失败返回错误信息。
可以在 helmfile 中直接使用环境变量,使用方式如下:
helm 还有一些进阶使用方式,如:版本控制、环境区分、hook、交互式操作、集成 kustomize 等。这里简单介绍几种,更多功能请看官方文档[5]。
helmfile 支持 Semver 2.0[6] 的版本号,可以锁定主版本,防止误升级导致的错误。
releases: - name: vault namespace: vault version: ~1.24.1 # 限制版本 >=1.24.1 && < 1.25.0
复制
同时还能通过 helmfile deps
命令生成 lock 文件,在 CD 时,除非修改 lock 文件,否无法发布新版本。helmfile.lock
内容如下:
version: v0.135.0dependencies:- name: prometheus repository: https://charts.helm.sh/stable version: 11.12.1digest: sha256:a5158f1361f2bbc4e73a80a22dd92b44538bdebeb2419658c36e31aa603b05fdgenerated: "2020-12-23T16:26:57.42503+08:00"
复制
当需要更新时,再次执行 helmfile deps
即可。
这也是个使用率较高的功能,使用 environments
配置·。如果不指定 --environment NAME
参数,默认使用 default
配置。
这里假设有三个文件,helmfile.yaml
、production.yaml
和 default.yaml
:
# helmfile.yamlenvironments: default: values: - default.yaml production: values: - production.yaml releases:- name: myapp-{{ .Values.releaseName }} # 根据环境名,可能是 `dev` 或 `prod` values: - url: { .Values.domain }} # 根据环境名,可能是 `dev.example.com` 或 `prod.example.com`{{ if eq .Environment.Name "production" }} # 使用 Go template 的 - values/production-specified-values.yaml{{ end }}
复制
# production.yamldomain: prod.example.comreleaseName: prod
复制
# default.yamldomain: dev.example.comreleaseName: dev
复制
在执行 helmfile
时,只需使用 --environment
指定需要安装的环境:
$ helmfile --environment production apply
复制
Helmfile hook 是一个每次发布的扩展点,它由以下部分组成:
•events
•command
•args
•showlogs
helmfile 在运行时,会触发各种事件,一旦事件触发,相关的 hook
就会被执行,目前支持的如下事件:
•prepare
•presync
•preuninstall
•postuninstall
•postsync
•cleanup
下面这个示例,会打印事件触发时的的上下文信息。
environments: default: prod:releases:- name: myapp chart: mychart # *snip* hooks: - events: ["prepare", "cleanup"] showlogs: true command: "echo" args: ["{{`{{.Environment.Name}}`}}", "{{`{{.Release.Name}}`}}", "{{`{{.HelmfileCommand}}`}}\"]
复制
执行命令,可以看到 command 执行成功:
$ helmfile -e prod synchelmfile.yaml: basePath=.hook[prepare] logs | prod myapp sync
复制
这也是个十分好用的功能,可以为不同的事件配置不同的 hook,这样在 CD 出现问题时,通过 hook 可以第一时间收到通知,并快速定位问题。
Helmfile 是一个很不错 Helm 生态工作,很大程度上弥补了 Helm 的不足。提高部署的可观测性和可重复性,提高了效率,最终实现 Release AS Code。
[1]
release 页面: https://github.com/roboll/helmfile/releases
[2]
helm-diff
: https://github.com/databus23/helm-diff
[3]
官方文档: https://github.com/roboll/helmfile#configuration
[4]
Go templates: https://godoc.org/text/template
[5]
官方文档: https://github.com/roboll/helmfile
[6]
Semver 2.0: https://semver.org/lang/zh-CN/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。