说明
使用helmfile时,我们首先得了解helm的使用,以及如何开发一个helm chart。
helm是kubernetes的包管理工具。在实际的使用场景中我们涉及同时部署多个chart、区分不同的部署环境、版本控制等需求。基于此需求,可以使用helmfile工具。
helmfile通过helmfile文件帮助用户管理和维护多个helm chart,可以来区分环境、实现版本控制。
github链接:https://github.com/roboll/helmfile
场景说明
我们在公有云场景或者私有化场景中,同一个产品可能涉及多套环境的配置,例如:每套环境部署依赖的环境差异、使用的数据库、消息队列中间件等实例的地址、账号密码等都不同。因此针对不同环境我们需要维护开发环境、测试环境、预生产环境、生产环境甚至多套环境的部署文件以及秘钥文件,每个小小的改动将涉及多套环境配置的修改,这给运维人员增加了极大的负担,以及多套环境的配置如何保持统一,也极大的考验运维人员的细致程度,极大的增加了运维的复杂度。同时涉及的数据库中间件实例的账户密码的存放,也给运维流程增加了巨大的安全隐患。
基于上面的述求,这里可以将业务部署的各服务文件改造成helm chart,同时区分多套环境以及版本控制,我们使用helmfile来统一部署管理。涉及实例涉及的账户密码,我们可以使用helm secrets来实现加密解密,以及来保证运维的安全性,从而极大的减少运维的复杂度。关于helm secrets的使用,我们在其他文章进行的详细的介绍。
安装
helmfile提供了多种安装方式,具体可以参考:https://github.com/roboll/helmfile/releases
helmfile还支持运行在容器中,可以很方便的集成到cicd的流程中:
# helm 2$ docker run --rm --net=host -v ${home}/.kube:/root/.kube -v ${home}/.helm:/root/.helm -v ${pwd}:/wd --workdir /wd quay.io/roboll/helmfile:v0.135.0 helmfile sync# helm 3$ docker run --rm --net=host -v ${home}/.kube:/root/.kube -v ${home}/.config/helm:/root/.config/helm -v ${pwd}:/wd --workdir /wd quay.io/roboll/helmfile:helm3-v0.135.0 helmfile sync
helmfile.yaml介绍
helmfile.yaml 是 helmfile 的核心文件,其用来声明所有的配置。下面会简要介绍一下,具体说明可以参考官方文档:https://github.com/roboll/helmfile#configuration
# 声明 repo 配置repositories:- name: # url: repo url # 可以设置基础配置 或 tls 认证 # certfile: certificate 文件 # keyfile: key 文件 # username: 用户名 # password: 密码# helm 二进制文件的路径helmbinary: path/to/helm3# helm 的一些默认设置,这些配置与 `helm subcommand` 相同,可以通过这个配置声明一些,默认的配置helmdefaults: tillernamespace: tiller-namespace #dedicated default key for tiller-namespace tillerless: false #dedicated default key for tillerless kubecontext: kube-context #dedicated default key for kube-context (--kube-context) cleanuponfail: false #dedicated default key for helm flag --cleanup-on-fail # additional and global args passed to helm (default ) args: - --set k=v # verify the chart before upgrading (only works with packaged charts not directories) (default false) verify: true # wait for k8s resources via --wait. (default false) wait: true # time in seconds to wait for any individual kubernetes operation (like jobs for hooks, and waits on pod/pvc/svc/deployment readiness) (default 300) timeout: 600 # performs pods restart for the resource if applicable (default false) recreatepods: true # forces resource update through delete/recreate if needed (default false) force: false # when using helm 3.2+, automatically create release namespaces if they do not exist (default true) createnamespace: true ...# 为 helmfile 中所有的 release 设置相同的 label,可用于为所有 release 标记相同的版本commonlabels: hello: world# 设置 release 配置(支持多 release)releases: # 远程 chart 示例(chart 已经上传到 remote 仓库) - name: vault # name of this release namespace: vault # target namespace createnamespace: true # helm 3.2+ automatically create release namespace (default true) labels: # arbitrary key value pairs for filtering releases foo: bar chart: roboll/vault-secret-manager # the chart being installed to create this release, referenced by `repository/chart` syntax version: ~1.24.1 # the semver of the chart. range constraint is supported condition: vault.enabled # the values lookup key for filtering releases. corresponds to the boolean value of `vault.enabled`, where `vault` is an arbitrary value missingfilehandler: warn # set to either error or warn. error instructs helmfile to fail when unable to find a values or secrets file. when warn, it prints the file and continues. # values files used for rendering the chart values: # value files passed via --values - vault.yaml # inline values, passed via a temporary values file and --values, so that it doesn't suffer from type issues like --set - address: https://vault.example.com # go template available in inline values and values files. - image: # the end result is more or less yaml. so do `quote` to prevent number-like strings from accidentally parsed into numbers! # see https://github.com/roboll/helmfile/issues/608 tag: {{ requiredenv image_tag | quote }} # otherwise: # tag: {{ requiredenv image_tag }} # tag: !!string {{ requiredenv image_tag }} db: username: {{ requiredenv db_username }} # value taken from environment variable. quotes are necessary. will throw an error if the environment variable is not set. $db_password needs to be set in the calling environment ex: export db_password='password1' password: {{ requiredenv db_password }} proxy: # interpolate environment variable with a fixed string domain: {{ requiredenv platform_id }}.my-domain.com scheme: {{ env scheme | default https }} # use `values` whenever possible! # `set` translates to helm's `--set key=val`, that is known to suffer from type issues like https://github.com/roboll/helmfile/issues/608 set: # single value loaded from a local file, translates to --set-file foo.config=path/to/file - name: foo.config file: path/to/file # set a single array value in an array, translates to --set bar[0]={1,2} - name: bar[0] values: - 1 - 2 # set a templated value - name: namespace value: {{ .namespace }} # will attempt to decrypt it using helm-secrets plugin # 本地 chart 示例(chart 保存在本地) - name: grafana # name of this release namespace: another # target namespace chart: ../my-charts/grafana # the chart being installed to create this release, referenced by relative path to local helmfile values: - ../../my-values/grafana/values.yaml # values file (relative path to manifest) - ./values/{{ requiredenv platform_env }}/config.yaml # values file taken from path with environment variable. $platform_env must be set in the calling environment. wait: true# 可以嵌套其他的 helmfiles,支持从本地和远程拉取 helmfilehelmfiles:- path: path/to/subhelmfile.yaml # label 选择器可以过滤需要覆盖的 release selectors: - name=prometheus # 覆盖 value values: # 使用文件覆盖 - additional.values.yaml # 覆盖单独的 key - key1: val1- # 远程拉取配置 path: git://github.com/cloudposse/helmfiles.git@releases/kiam.yaml?ref=0.40.0# 如果指向不存在路径,则打印告警错误missingfilehandler: error# 多环境管理environments: # 当没有设置 `--environment name` 时,使用 default default: values: # 内容可以是文件路径或者 key:value - environments/default/values.yaml - mychartver: 1.0.0-dev # production 环境,当设置了 `helmfile --environment production sync` 时 production: values: - environment/production/values.yaml - mychartver: 1.0.0 # disable vault release processing - vault: enabled: false ## `secrets.yaml` is decrypted by `helm-secrets` and available via `{{ .environment.values.key }}` secrets: - environment/production/secrets.yaml # 当占不到 `environments.name.values` 时,可以设置为 error, warn, info, debug,默认是 error missingfilehandler: error# 分层管理,可以将所有文件合并,顺序为:environments.yaml < - defaults.yaml < - templates.yaml < - helmfile.yamlbases:- environments.yaml- defaults.yaml- templates.yaml# api 功能apiversions:- example/v1
helmfile调试
这里,编排好相关的helmfile后,我们可以使用下面的命令进行调试
# 查看目录结构$ lsreadme.org environments helm helmfile helmfile.yaml releases# 查看helmfile.yaml$ cat helmfile.yamlenvironments: # 不指定环境时,默认使用默认测试环境 default: values: - environments/test/config.yaml - environments/test/versions.yaml - environments/test//namespaces.yaml secrets: - environments/test/secrets.yaml test: values: - environments/test/config.yaml - environments/test/versions.yaml - environments/test/namespaces.yaml secrets: - environments/test/secrets.yamlhelmdefaults: createnamespace: truereleases: - name: password-secrets kubecontext: {{ .values.kubecontext.service }} namespace: {{ .values.namespaces.service }} chart: helm/charts/secrets values: - releases/secrets.yaml.gotmpl labels: app: secrets - name: web kubecontext: {{ .values.kubecontext.business }} namespace: {{ .values.namespaces.business }} chart: helm/charts/web values: - releases/web.yaml.gotmpl labels: app: web# helmfile调试$ helmfile -e test template
安装chart
helmfile -e test sync
helmfile更新或者删除某个chart
这里可以通过--selector指定label来进行更新或者删除:
# 更新web服务helmfile -e test --selector app=web sync# 删除web服务helmfile -e test --selector app=web delete
查看变更
# 查看文件的变更信息helmfile -e test --selector app=web diff # 只查看文件的变更部分信息helmfile -e test --selector app=web diff --context 4
为什么电路里总要摆两个电容?
2020前三季度国内新能源汽车生产约69.2万辆,同比下降17%
分布式应用dApp,为什么要大量采用加密货币?
区块链通证经济跨链网络Cosmos介绍
用于超薄PC的风扇电机的小型化
如何开发一个helm chart
什么是浪涌保护器? 是否所有的浪涌保护器前都装熔断装置?
2013年美国无线网络投资105亿美元 华为中兴无缘
电信级直流输入电源支持网络增长
食品安全快检设备产品的简单介绍
新型红外光助力提升农药的有效利用率
红米Note 6 Pro的真机照片曝光,这款手机的一大卖点应该是拍照
定时器、计数器
金融领域不应成为隐私安全问题的重灾区
protel99se安装步骤详解
1.8G专网工业路由器促进4G智能电力建设,赋能配电站远程监控管理
美国福禄克公司推出了两款新型红外热像仪
三大领域技术创新支撑AI行业落地
11个单片机MCU常用的基础知识
域名国家工程研究中心发布首款基于龙芯CPU的国产域名服务器