背景:
首先,我们先来了解一下Helm,它是一个Kubernetes的包管理器,可以通过Helm来安装、更新和升级包。而且它还提供了许多小巧实用的命令,确保了应用顺利地部署和升级。
如果您是一名研发人员,一定会遇到这样一个问题:如何将自己的开发成果快速、安全地交付给客户?这时候,CICD就能派上用场了!利用CICD进行自动化的部署和测试,能够快速地将应用交付给客户,且可以降低错误率和提高产品质量。
而基于Helm的CICD应用交付,能够让我们更加方便地进行应用部署和集成测试。通过Helm命令,可以轻松地将应用打包成chart,由CI/CD平台负责自动部署和测试,确保应用的稳定性和正确性。
同时,利用Helm,我们可以快速地进行应用的升级、回滚等操作。这对于快速迭代的产品来说,是非常重要的;而且我们还可以通过Helm release管理来实现应用版本控制,保证应用的稳定和安全。
技术栈:Jenkins + Gitlab + Harbor + Helm + Kubernetes
主要流程:
- 1、开发人员提交代码到 Gitlab 代码仓库;
- 2、通过 Gitlab 配置的 Jenkins Webhook 触发 Pipeline 自动构建;
- 3、Jenkins 触发构建构建任务,根据 Pipeline 脚本定义分步骤构建;
- 4、先进行代码静态分析,单元测试;
- 5、然后进行 Maven 构建(Java 项目);
- 6、根据构建结果构建 Docker 镜像;
- 7、推送 Docker 镜像到 Harbor 仓库;
- 8、触发更新服务阶段,使用 Helm 安装/更新 Release;
- 9、查看服务是否更新成功
一、配置harbor支持helm chart存储¶
如下图登录harbor 仓库 ,选取项目这一栏没有helm chart 这个关键字就说明harbor仓 库支持暂不支持存放chart。

开启Charts功能:
#停掉已安装的harbor
[root@harbor-01 ~]# cd /opt/harbor/
[root@harbor-01 harbor]# docker-compose down -v
#启动时带上参数 --with-chartmuseum
[root@harbor-01 harbor]# ./install.sh --with-chartmuseum
等命令执行完再登录就能看到 上图中的helm chart字样了

二、配置国内Chart仓库¶
添加国内Chart仓库
[root@master01 ~]# helm repo add stable http://mirror.azure.cn/kubernetes/charts
[root@master01 ~]# helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
验证,观察到已添加成功
[root@master01 ~]# helm repo list
NAME URL
ingress-nginx https://kubernetes.github.io/ingress-nginx
stable http://mirror.azure.cn/kubernetes/charts
aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
三、安装push插件¶
GitHub - chartmuseum/helm-push:https://github.com/chartmuseum/helm-push/releases
使用如下的方式下载 helm-push 安装包:
方式1-在线安装:
helm plugin install https://github.com/chartmuseum/helm-push
方式2-离线安装:
helm-push_0.10.0_linux_amd64.tar.gz 下载链接:
https://github.com/chartmuseum/helm-push/releases/download/v0.10.0/helm-push_0.10.0_linux_amd64.tar.gz
安装位置: helm env 获取的 HELM_PLUGINS 这个变量的值当前用户主目录的.local 目录下
#创建 helm-push 目录
[root@master01 5]# mkdir -p /root/.local/share/helm/plugins/helm-push
#把你下载好的tar包拷到创建的/root/5/目录下
[root@master01 5]# cp helm-push_0.10.0_linux_amd64.tar.gz /root/.local/share/helm/plugins/helm-push
#到目录下解压文件
[root@master01 5]# cd /root/.local/share/helm/plugins/helm-push
[root@master01 helm-push]# tar -zxvf helm-push_0.10.0_linux_amd64.tar.gz
#执行 helm plugin list 就能看到已经安装好的push插件了,这里一定要记住名字是cm-push而不是push
[root@master01 helm-push]# helm plugin list
NAME VERSION DESCRIPTION
cm-push 0.10.0 Push chart package to ChartMuseum
四、添加repo¶
添加repo示例说明:
# helm repo add --username admin --password xxxxxx devopsrepo http://harbor.zhang-qing.com/chartrepo/demo
添加repo示例说明:
[root@master01 helm-push]# helm repo add devopsrepo https://harbor.zhang-qing.com/chartrepo/demo \
--username admin \
--password 'Harbor12345'
验证
[root@master01 helm-push]# helm repo list | grep devops
devopsrepo https://harbor.zhang-qing.com/chartrepo/demo
五、推送与安装Chart¶
# 生成指定包
[root@master01 ~]# cd /root/5/demo-helm/
[root@master01 demo-helm]# helm package .
Successfully packaged chart and saved it to: /root/5/demo-helm/demohelm-0.2.2.tgz
#添加repo
[root@master01 helm-push]# helm repo add devopsrepo http://harbor.zhang-qing.com/chartrepo/demo \
--username admin \
--password 'Harbor12345'
# 上传包到harbor仓库
[root@master01 demo-helm]#
helm cm-push demohelm-0.2.2.tgz https://harbor.zhang-qing.com/chartrepo/demo \
--username=admin \
--password='Harbor12345'
Pushing demohelm-0.2.2.tgz to https://harbor.zhang-qing.com/chartrepo/demo...
Done.
浏览器输入https://harbor.zhang-qing.com/登录harbor,账号密码为admin/Harbor12345

六、问题处理¶
问题现象:
在推送和安装Chart时出现,如下报错信息
[root@master01 demo-helm]#
helm cm-push demohelm-0.2.2.tgz https://harbor.zhang-qing.com/chartrepo/demo \
--username=admin \
--password='Harbor12345'
Error: 308: could not properly parse response JSON: <html>
<head><title>308 Permanent Redirect</title></head>
<body>
<center><h1>308 Permanent Redirect</h1></center>
<hr><center>nginx/1.22.0</center>
</body>
</html>
...
...
问题处理:
将http://harbor.zhang-qing.com/chartrepo/demo替换为https://harbor.zhang-qing.com/chartrepo/demo
[root@master01 demo-helm]#
helm cm-push demohelm-0.2.2.tgz https://harbor.zhang-qing.com/chartrepo/demo \
--username=admin \
--password='Harbor12345'