说明
使用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的流程中:
#helm2 $dockerrun--rm--net=host-v"${HOME}/.kube:/root/.kube"-v"${HOME}/.helm:/root/.helm"-v"${PWD}:/wd"--workdir/wdquay.io/roboll/helmfile:v0.135.0helmfilesync
#helm3 $dockerrun--rm--net=host-v"${HOME}/.kube:/root/.kube"-v"${HOME}/.config/helm:/root/.config/helm"-v"${PWD}:/wd"--workdir/wdquay.io/roboll/helmfile:helm3-v0.135.0helmfilesync
helmfile.yaml介绍
helmfile.yaml 是 helmfile 的核心文件,其用来声明所有的配置。下面会简要介绍一下,具体说明可以参考官方文档:https://github.com/roboll/helmfile#configuration
#声明repo配置 repositories: -name:#url:repourl #可以设置基础配置或tls认证 #certFile:certificate文件 #keyFile:key文件 #username:用户名 #password:密码 #helm二进制文件的路径 helmBinary:path/to/helm3 #helm的一些默认设置,这些配置与`helmSUBCOMMAND`相同,可以通过这个配置声明一些,默认的配置 helmDefaults: tillerNamespace:tiller-namespace#dedicateddefaultkeyfortiller-namespace tillerless:false#dedicateddefaultkeyfortillerless kubeContext:kube-context#dedicateddefaultkeyforkube-context(--kube-context) cleanupOnFail:false#dedicateddefaultkeyforhelmflag--cleanup-on-fail #additionalandglobalargspassedtohelm(default"") args: -"--setk=v" #verifythechartbeforeupgrading(onlyworkswithpackagedchartsnotdirectories)(defaultfalse) verify:true #waitfork8sresourcesvia--wait.(defaultfalse) wait:true #timeinsecondstowaitforanyindividualKubernetesoperation(likeJobsforhooks,andwaitsonpod/pvc/svc/deploymentreadiness)(default300) timeout:600 #performspodsrestartfortheresourceifapplicable(defaultfalse) recreatePods:true #forcesresourceupdatethroughdelete/recreateifneeded(defaultfalse) force:false #whenusinghelm3.2+,automaticallycreatereleasenamespacesiftheydonotexist(defaulttrue) createNamespace:true ... #为helmfile中所有的release设置相同的label,可用于为所有release标记相同的版本 commonLabels: hello:world #设置release配置(支持多release) releases: #远程chart示例(chart已经上传到remote仓库) -name:vault#nameofthisrelease namespace:vault#targetnamespace createNamespace:true#helm3.2+automaticallycreatereleasenamespace(defaulttrue) labels:#Arbitrarykeyvaluepairsforfilteringreleases foo:bar chart:roboll/vault-secret-manager#thechartbeinginstalledtocreatethisrelease,referencedby`repository/chart`syntax version:~1.24.1#thesemverofthechart.rangeconstraintissupported condition:vault.enabled#Thevalueslookupkeyforfilteringreleases.Correspondstothebooleanvalueof`vault.enabled`,where`vault`isanarbitraryvalue missingFileHandler:Warn#settoeither"Error"or"Warn"."Error"instructshelmfiletofailwhenunabletofindavaluesorsecretsfile.When"Warn",itprintsthefileandcontinues. #Valuesfilesusedforrenderingthechart values: #Valuefilespassedvia--values -vault.yaml #Inlinevalues,passedviaatemporaryvaluesfileand--values,sothatitdoesn'tsufferfromtypeissueslike--set -address:https://vault.example.com #Gotemplateavailableininlinevaluesandvaluesfiles. -image: #TheendresultismoreorlessYAML.Sodo`quote`topreventnumber-likestringsfromaccidentallyparsedintonumbers! #Seehttps://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"}} #valuetakenfromenvironmentvariable.Quotesarenecessary.Willthrowanerroriftheenvironmentvariableisnotset.$DB_PASSWORDneedstobesetinthecallingenvironmentex:exportDB_PASSWORD='password1' password:{{requiredEnv"DB_PASSWORD"}} proxy: #Interpolateenvironmentvariablewithafixedstring domain:{{requiredEnv"PLATFORM_ID"}}.my-domain.com scheme:{{env"SCHEME"|default"https"}} #Use`values`wheneverpossible! #`set`translatestohelm's`--setkey=val`,thatisknowntosufferfromtypeissueslikehttps://github.com/roboll/helmfile/issues/608 set: #singlevalueloadedfromalocalfile,translatesto--set-filefoo.config=path/to/file -name:foo.config file:path/to/file #setasinglearrayvalueinanarray,translatesto--setbar[0]={1,2} -name:bar[0] values: -1 -2 #setatemplatedvalue -name:namespace value:{{.Namespace}} #willattempttodecryptitusinghelm-secretsplugin #本地chart示例(chart保存在本地) -name:grafana#nameofthisrelease namespace:another#targetnamespace chart:../my-charts/grafana#thechartbeinginstalledtocreatethisrelease,referencedbyrelativepathtolocalhelmfile values: -"../../my-values/grafana/values.yaml"#Valuesfile(relativepathtomanifest) -./values/{{requiredEnv"PLATFORM_ENV"}}/config.yaml#Valuesfiletakenfrompathwithenvironmentvariable.$PLATFORM_ENVmustbesetinthecallingenvironment. wait:true #可以嵌套其他的helmfiles,支持从本地和远程拉取helmfile helmfiles: -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: #当没有设置`--environmentNAME`时,使用default default: values: #内容可以是文件路径或者key:value -environments/default/values.yaml -myChartVer:1.0.0-dev #"production"环境,当设置了`helmfile--environmentproductionsync`时 production: values: -environment/production/values.yaml -myChartVer:1.0.0 #disablevaultreleaseprocessing -vault: enabled:false ##`secrets.yaml`isdecryptedby`helm-secrets`andavailablevia`{{.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.yaml bases: - environments.yaml - defaults.yaml - templates.yaml # API 功能 apiVersions: - example/v1
helmfile调试
这里,编排好相关的helmfile后,我们可以使用下面的命令进行调试
#查看目录结构 $ls README.orgenvironmentshelmhelmfilehelmfile.yamlreleases #查看helmfile.yaml $cathelmfile.yaml environments: #不指定环境时,默认使用默认测试环境 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.yaml helmDefaults: createNamespace:true releases: -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-etesttemplate
安装chart
helmfile-etestsync
helmfile更新或者删除某个chart
这里可以通过--selector指定label来进行更新或者删除:
#更新web服务 helmfile-etest--selectorapp=websync #删除web服务 helmfile-etest--selectorapp=webdelete
查看变更
#查看文件的变更信息 helmfile-etest--selectorapp=webdiff #只查看文件的变更部分信息 helmfile-etest--selectorapp=webdiff--context4
-
数据库
+关注
关注
7文章
3760浏览量
64267 -
容器
+关注
关注
0文章
492浏览量
22041
原文标题:helmfile使用
文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论