我们后续部署的程序可能包含很多个子程序,单一的yaml文件部署会让我们的启动脚本变的很繁琐,这里就直接改为使用helm去部署
一、部署helm工具
1、拉取软件包
//自己的小站101.43.4.210/helm-v3.5.1-linux-amd64.tar.gz
wget https://get.helm.sh/helm-v3.5.1-linux-amd64.tar.gz
tar -zxvf helm-v3.5.1-linux-amd64.tar.gz
cp linux-amd64/helm /usr/bin/
2、查看版本
helm version
二、自定义Chart包
通常来说,我们这个Chart包是给集群master节点用的,大部分情况我们都不会频繁的修改Chart包,这里可以直接定义到master节点也可以用,这里为了演示就直接以CD的形式发送到节点上去部署
mkdir -p helm/mytest
1、指定Chart包的版本信息
vi Chart.yaml
apiVersion: v2
name: mytest
appVersion: "v1.0.1"
version: "v1.0.1"
2、定义要使用的变量
vi values.yaml
name: "mytest"
namespace: "devops"
containers:
name: "mytest"
image: "mytest:v1.0.1"
containerPort: "9999"
nodePort: "30008"
3、定义Chart包中要部署的模板文件
vi templates/mytest-dev.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.name }}
namespace: {{ .Values.namespace }}
spec:
selector:
matchLabels:
app: {{ .Values.name }}-init
template:
metadata:
labels:
app: {{ .Values.name }}-init
spec:
containers:
- name: {{ .Values.containers.name }}
image: {{ .Values.containers.image }}
ports:
- name: http
containerPort: {{ .Values.containers.containerPort }}
---
apiVersion: v1
kind: Service
metadata:
name: {{ .Values.name }}-svc
namespace: {{ .Values.namespace }}
spec:
ports:
- port: {{ .Values.containers.containerPort }}
targetPort: http
nodePort: {{ .Values.containers.nodePort }}
selector:
app: {{ .Values.name }}-init
type: NodePort
4、定义打包时要忽略的配置
vi .helmignore
# Patterns to ignore when building packages.
# This supports shell glob matching, relative path matching, and
# negation (prefixed with !). Only one pattern per line.
.DS_Store
# Common VCS dirs
.git/
.gitignore
.bzr/
.bzrignore
.hg/
.hgignore
.svn/
# Common backup files
*.swp
*.bak
*.tmp
*.orig
*~
# Various IDEs
.project
.idea/
*.tmproj
.vscode/
创建完之后要上传到gitlab仓库中使用
helm文档参考
https://docs.helm.sh/zh/docs/chart_template_guide/functions_and_pipelines/
三、jenkins添加构建后操作
1、gitlab新建v4.0.0标签
我们添加helm是在v3版本之后添加的,这里要在gitlab再打一个tag
2.1、定义要拷贝的配置
//要拷贝的源文件
//这里指定将helm项目下的文件都拷贝过去
//默认不拷贝目录,这里要再加个templates
helm/mytest/* helm/mytest/templates/*
2.2、指定EXEC程序
helm upgrade -i ${JOB_NAME} /usr/local/test/helm/mytest/
//这里helm upgrade 是代表更新的意思, -i 表示如果没有部署则会部署,如果部署了就会更新
//这样一来,每次我们有变更下
如上,我们配置后直接构建V4版本会通过helm工具直接去部署/更新新的配置
2.3、添加helm指定使用镜像的版本
这里实际上就是通过修改helm的语句在更新的时候覆盖value.yaml的变量来实现的
添加覆盖的配置
helm upgrade -i ${JOB_NAME} --set containers.image=101.43.4.210:30007/repo/${JOB_NAME}:${tag} /usr/local/test/helm/mytest/
//我们原先value.yaml的配置是 mytest:v1.0.1
//这里我们在启动的时候指定value.yaml下的镜像的变量进行覆盖使用
//这个操作不会修改value.yaml的值,模板中其他变量还是用的value.yaml下的值
如此一来,我们从V4版本之后就可以通过helm快速进行版本更新了( •̀ ω •́ )y
存在的问题
1、步骤太长了,我们实现上面的步骤点了很多东西,如果那里出错了我们无法快速的排查问题
//pipline 流水线
2、我们在任务中关于harbor仓库的地址是写死的,如果要修改就需要一步一步切进去很麻烦
//jenkinsfile