說明
使用helmfile時,我們首先得了解helm的使用,以及如何開發(fā)一個helm chart。
helm是kubernetes的包管理工具。在實際的使用場景中我們涉及同時部署多個chart、區(qū)分不同的部署環(huán)境、版本控制等需求?;诖诵枨螅梢允褂胔elmfile工具。
helmfile通過helmfile文件幫助用戶管理和維護(hù)多個helm chart,可以來區(qū)分環(huán)境、實現(xiàn)版本控制。
github鏈接:https://github.com/roboll/helmfile
場景說明
我們在公有云場景或者私有化場景中,同一個產(chǎn)品可能涉及多套環(huán)境的配置,例如:每套環(huán)境部署依賴的環(huán)境差異、使用的數(shù)據(jù)庫、消息隊列中間件等實例的地址、賬號密碼等都不同。因此針對不同環(huán)境我們需要維護(hù)開發(fā)環(huán)境、測試環(huán)境、預(yù)生產(chǎn)環(huán)境、生產(chǎn)環(huán)境甚至多套環(huán)境的部署文件以及秘鑰文件,每個小小的改動將涉及多套環(huán)境配置的修改,這給運維人員增加了極大的負(fù)擔(dān),以及多套環(huán)境的配置如何保持統(tǒng)一,也極大的考驗運維人員的細(xì)致程度,極大的增加了運維的復(fù)雜度。同時涉及的數(shù)據(jù)庫中間件實例的賬戶密碼的存放,也給運維流程增加了巨大的安全隱患。
基于上面的述求,這里可以將業(yè)務(wù)部署的各服務(wù)文件改造成helm chart,同時區(qū)分多套環(huán)境以及版本控制,我們使用helmfile來統(tǒng)一部署管理。涉及實例涉及的賬戶密碼,我們可以使用helm secrets來實現(xiàn)加密解密,以及來保證運維的安全性,從而極大的減少運維的復(fù)雜度。關(guān)于helm secrets的使用,我們在其他文章進(jìn)行的詳細(xì)的介紹。
安裝
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 #可以設(shè)置基礎(chǔ)配置或tls認(rèn)證 #certFile:certificate文件 #keyFile:key文件 #username:用戶名 #password:密碼 #helm二進(jìn)制文件的路徑 helmBinary:path/to/helm3 #helm的一些默認(rèn)設(shè)置,這些配置與`helmSUBCOMMAND`相同,可以通過這個配置聲明一些,默認(rèn)的配置 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設(shè)置相同的label,可用于為所有release標(biāo)記相同的版本 commonLabels: hello:world #設(shè)置release配置(支持多release) releases: #遠(yuǎn)程chart示例(chart已經(jīng)上傳到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,支持從本地和遠(yuǎn)程拉取helmfile helmfiles: -path:path/to/subhelmfile.yaml #label選擇器可以過濾需要覆蓋的release selectors: -name=prometheus #覆蓋value values: #使用文件覆蓋 -additional.values.yaml #覆蓋單獨的key -key1:val1 -#遠(yuǎn)程拉取配置 path:git://github.com/cloudposse/helmfiles.git@releases/kiam.yaml?ref=0.40.0 #如果指向不存在路徑,則打印告警錯誤 missingFileHandler:Error #多環(huán)境管理 environments: #當(dāng)沒有設(shè)置`--environmentNAME`時,使用default default: values: #內(nèi)容可以是文件路徑或者key:value -environments/default/values.yaml -myChartVer:1.0.0-dev #"production"環(huán)境,當(dāng)設(shè)置了`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 #當(dāng)占不到`environments.NAME.values`時,可以設(shè)置為"Error","Warn","Info","Debug",默認(rèn)是"Error" missingFileHandler:Error #分層管理,可以將所有文件合并,順序為:environments.yaml - defaults.yaml - templates.yaml - helmfile.yaml bases: -?environments.yaml -?defaults.yaml -?templates.yaml #?API?功能 apiVersions: -?example/v1
helmfile調(diào)試
這里,編排好相關(guān)的helmfile后,我們可以使用下面的命令進(jìn)行調(diào)試
#查看目錄結(jié)構(gòu) $ls README.orgenvironmentshelmhelmfilehelmfile.yamlreleases #查看helmfile.yaml $cathelmfile.yaml environments: #不指定環(huán)境時,默認(rèn)使用默認(rèn)測試環(huán)境 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調(diào)試 $helmfile-etesttemplate
安裝chart
helmfile-etestsync
helmfile更新或者刪除某個chart
這里可以通過--selector指定label來進(jìn)行更新或者刪除:
#更新web服務(wù) helmfile-etest--selectorapp=websync #刪除web服務(wù) helmfile-etest--selectorapp=webdelete
查看變更
#查看文件的變更信息 helmfile-etest--selectorapp=webdiff #只查看文件的變更部分信息 helmfile-etest--selectorapp=webdiff--context4
-
數(shù)據(jù)庫
+關(guān)注
關(guān)注
7文章
3845瀏覽量
64595 -
容器
+關(guān)注
關(guān)注
0文章
499瀏覽量
22094
原文標(biāo)題:helmfile使用
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論