0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何开发一个helm chart

马哥Linux运维 来源:马哥Linux运维 2023-05-16 09:28 次阅读

说明

使用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运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    LabVIEW的实用技巧——chart 如何不连续显示数据

    chart的内部数据结构是FIFO缓冲区,默认长度是1024,它即可可以输入单点数据也可以输入数组类型数据,即可以显示单条曲线,也可以同时显示多条曲线.以单条曲线为例,有的时候,需要根据外部要求
    发表于 06-10 14:20

    波形绘制——Waveform Chart

    轴则为个数或时间。这两元件最大的差别在于使用的方式,Chart 元件会有资料保留的特性,所以就算是每次都只输入点,它还是可以帮你画出
    发表于 12-29 12:03

    chart imx119 型號!!!!!

    chart imx119 型號!!!!!
    发表于 07-04 13:05

    使用Helm 在容器服务k8s集群键部署wordpress

    :包含了创建Kubernetes的应用实例的必要信息config:包含了应用发布配置信息release:是chart及其配置的
    发表于 03-29 13:38

    鸿蒙应用开发JS-chart数据分享体验

    `chart小案例,在生活中图表的展示出来的数据直观、形象、生动、具体等特点。 Html代码:<!-- xxx.hml --><div class
    发表于 04-18 11:26

    LabVIEW在程序运行中改变Chart的历史长度

    的点数。在Waveform Chart的属性节点中有叫X Scale » ScaleMarkers[]的属性可以用来设定要显示的Chart的X轴的点数。在程序运行的时候,只要把
    发表于 05-04 21:00

    c#桌面应用开发chart控件使用,添加数据到chart中发现它直添加是为什么?

    c#桌面应用开发chart控件使用,在添加数据到chart中,发现它直添加,我想让它只保存最新的n个数据,那么前面的数据该怎么删除
    发表于 10-30 08:18

    NVIDIA EGX超级计算平台借助企业级Kubernetes简化边缘AI部署

    新型GPU Operator、Helm chart与NGC-Ready系统帮助各企业迁移至边缘与混合平台。
    发表于 10-24 10:51 715次阅读

    Helm Kubernetes包管理器

    helm.zip
    发表于 04-27 14:25 2次下载
    <b class='flag-5'>Helm</b> Kubernetes包管理器

    fl_chart Flutter图表库

    ./oschina_soft/fl_chart.zip
    发表于 06-17 14:55 0次下载
    fl_<b class='flag-5'>chart</b> Flutter图表库

    Helm常用命令(chart安装、升级、回滚、卸载等操作)

    Helm 针对 Kubernetes 的 Helm 包管理器。
    的头像 发表于 09-13 14:54 6117次阅读

    Helm些概念及用法

    应用,使用 Helm (https://helm.sh)是很不错的选择,它具备如下的能力: 简化部署 :Helm允许使用单个命令轻松部署
    的头像 发表于 05-30 09:51 1109次阅读
    <b class='flag-5'>Helm</b>的<b class='flag-5'>一</b>些概念及用法

    Helm部署MinIO集群

    Helm部署MinIO集群
    的头像 发表于 12-03 09:44 785次阅读
    <b class='flag-5'>Helm</b>部署MinIO集群

    请问如何使用Helm在K8s上集成Prometheus呢?

    ArtifactHub 为 Helm Chart 提供了公共和私有资源库。我们将使用这些 Helm Chart 来设置 Kubernetes 集群中的 pod 和服务。
    的头像 发表于 01-10 17:24 621次阅读
    请问如何使用<b class='flag-5'>Helm</b>在K8s上集成Prometheus呢?

    HarmonyOS开发案例:【 switch、chart组件的使用】

    基于switch组件和chart组件,实现线形图、占比图、柱状图,并通过switch切换chart组件数据的动静态显示。
    的头像 发表于 04-25 20:58 562次阅读
    HarmonyOS<b class='flag-5'>开发</b>案例:【 switch、<b class='flag-5'>chart</b>组件的使用】