使用helm动态更新k8s里的docker镜像关键点
需求分析
1.我们使用helm来实现应用程序的更新。
2.应用程序更新的关键就是镜像。每次我们的代码合入develop分支之后,都会产生一个新的docker镜像。
3.我们需要让helm知道我们使用了最新的docker镜像。这样部署的应用才是最新的。
4.helm包是通过nexus上传的,从设计上来说,不适合每一次cd流程就产生一个helm包并上传,helm本身也没有提供上传接口。helm包的设计是希望一个helm包能一直通用于某一类程序。
5.综上所述,我们的cd流程的关键是,在helm包不更新的情况下,让helm包能每次cd流程后,通过developmengt.yaml使用最新的docker镜像在K8S上进行部署
使用误区
误以为developmengt.yaml里配置container.image的tag为latest,imagePullPolicy为always,就能每次部署的时候拉取最新的镜像。
接下来,我们看看默认配置
我们经常会错误的配置Chart.Appversion为latest,如下图
helm upgrade [RELEASE] [CHART] [flags] 例如: helm upgrade lizhenwei nginx-chart
原因是:对于helm来说,参数没有任何变化,chart版本也没有变化,所以是不会去更新的
正确用法
我们的chart不会去不停的更新,所以我们要做的是参数的更新。
所以我们要让docker的镜像tag动起来。
1.每次的CICD流程除了上传latest镜像以外,还要再上传一个带tag号的镜像,tag号可以用git的commitHash值来区分,一般来说,有个8位的hash值就够了
2.helm的development.yaml里的镜像tag要进行对应的修改,如下
image: "{{ .Values.image.repository }}:{{ .Values.commitHash }}"
Values.commitHash是来自values.yaml文件中的commitHash参数
3.helm的upgrade命令增加comitHash参数。升级命令里增加set参数
helm upgrade -i dev-ui sfere/cloudview-ui --set commitHash=$commitHash
因为commitHash参数的改变,所以对于helm来说,产生了参数变化,helm是会去进行更新操作,这个时候就会去把参数填入development.yaml的image选项里,从而触发拉取新代码,更新应用