helm滚动更新mysql_使用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,就能每次部署的时候拉取最新的镜像。

接下来,我们看看默认配置

f7702e81050c94e5d41410b726db0d0a.png

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

c6da5ef01143e5a661b15a70c8d19f1f.png

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

Python

helm upgrade [RELEASE] [CHART] [flags]

例如: helm upgrade lizhenwei nginx-chart

1

2

helmupgrade[RELEASE][CHART][flags]

例如:helmupgradelizhenweinginx-chart

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

正确用法

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

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

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

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

Python

image: "{{ .Values.image.repository }}:{{ .Values.commitHash }}"

1

image:"{{ .Values.image.repository }}:{{ .Values.commitHash }}"

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

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

Python

helm upgrade -i dev-ui sfere/cloudview-ui --set commitHash=$commitHash

1

helmupgrade-idev-uisfere/cloudview-ui--setcommitHash=$commitHash

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

联系作者,QQ: 357244849


版权声明:本文为weixin_40001395原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。