使用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,如下图

我们经常会错误的配置Chart.Appversion为latest,如下图

原因是:对于helm来说,参数没有任何变化,chart版本也没有变化,所以是不会去更新的


正确用法

我们的chart不会去不停的更新,所以我们要做的是参数的更新。

所以我们要让docker的镜像tag动起来

1.每次的CICD流程除了上传latest镜像以外,还要再上传一个带tag号的镜像,tag号可以用git的commitHash值来区分,一般来说,有个8位的hash值就够了

2.helm的development.yaml里的镜像tag要进行对应的修改,如下

Values.commitHash是来自values.yaml文件中的commitHash参数

3.helm的upgrade命令增加comitHash参数。升级命令里增加set参数

因为commitHash参数的改变,所以对于helm来说,产生了参数变化,helm是会去进行更新操作,这个时候就会去把参数填入development.yaml的image选项里,从而触发拉取新代码,更新应用

 

Posted in docker相关