Helmfile学习实践

前言

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 以外,还需要安装 helmkubectl 以及 helm 插件 helm-diff[2]。

helm-diff 安装方式:

$ helm plugin install https://github.com/databus23/helm-diff

复制

helmfile.yaml

helmfile.yaml 是 helmfile 的核心文件,其用来声明所有的配置。下面会简要介绍一下,详细内容见官方文档[3]。

Apply

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.yamlproduction.yamldefault.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

复制

Hook

Helmfile hook 是一个每次发布的扩展点,它由以下部分组成:

eventscommandargsshowlogs

helmfile 在运行时,会触发各种事件,一旦事件触发,相关的 hook 就会被执行,目前支持的如下事件:

preparepresyncpreuninstallpostuninstallpostsynccleanup

下面这个示例,会打印事件触发时的的上下文信息。

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/

[7] https://helmfile.readthedocs.io/en/latest/#installation

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值