写在前面:

在生产环境中,我们通常会使用Jenkins流水线部署k8s群集,这里主要介绍使用Jenkins的pipline可选择分支实现k8s群集的发布、更新、回滚功能

部署环境

角色

IP地址

部署软件

硬件

系统

master

192.168.154.134

docker 、k8s

2C2G

CentOS 7.6

node02

192.168.154.132

docker 、k8s

2C2G

CentOS 7.6

node01

192.168.154.129

docker、docker-compose、harbor 、k8s

2C2G

CentOS 7.6

gitlab

192.168.154.131

gitlab 、git、mysql

2C3G

CentOS 7.6

jenkins

192.168.154.128

jdk、git、jenkins、docker、maven

2C2G

CentOS 7.6

实验目的

1.分支可选

有2个分支branch=(master,develop),可以任意选择分支构建

2个分支的区别

为了做实验,修改背景图片来做区别

master 分支:背景图片上面版本号:v1.0

develop 分支:背景图片上面版本号:v2.0

3.构建方法可选

每个分支都有2个构建方法action=(release,rollback),可以任意选择方法

4.两个方法的区别

方法release:正常版本发布

方法rollback:出现问题时,紧急回滚上一个版本

实现选择各分支和各方法,随意组合,构建版本

部署过程

环境服务部署:

一、编写流水线脚本

1.编写Jenkinsfile

pipeline {

agent any

// 拉取代码

stages {

stage('GetCode') {

when { environment name: 'action', value: 'release' }

steps {

println("your choices are Branch:${branch} action:${action} version:1.0 ! ")

sleep 3

}

}

// 代码编译

stage('Maven Build') {

when { environment name: 'action', value: 'release' }

steps {

sh '''

export JAVA_HOME=/usr/local/java

/usr/local/apache-maven-3.6.3/bin/mvn clean install -Ptest

'''

}

}

// 项目打包成镜像并推送到仓库

stage('Build and Push Image') {

when { environment name: 'action', value: 'release' }

steps {

sh '''

REPOSITORY=192.168.154.129/maven-test01/maven-quartz:v1 #develop是v2

docker build -t $REPOSITORY .

docker login 192.168.154.129 -u admin -p Harbor12345

docker push $REPOSITORY

'''

}

}

// 部署到K8S主机

stage('Deploy to k8s') {

when { environment name: 'action', value: 'release' }

steps {

sh '''

scp k8s.sh root@192.168.154.134:/root/

ssh root@192.168.154.134 "chmod +x k8s.sh && sh /root/k8s.sh"

'''}

}

// K8S紧急时回滚

stage('Rollback to k8s') {

when { environment name: 'action', value: 'rollback' }

steps {

echo "k8s images is rolled back! "

sh '''

ssh root@192.168.154.134 "kubectl rollout undo deployment/tomcat-dpm -n default"

'''

}

}

}

}

注意:使用ssh命令不能远程使用k8s相关命令,需要修改master服务器的环境变量

vim /root/.bashrc

末尾添加:

export KUBECONFIG=/etc/kubernetes/admin.conf

45ce9d093ca3db5acb06e8a312063901.png

source /root/.bashrc #刷新

2.编写Dockerfile

#从harbor拉取镜像

FROM 192.168.154.129/maven-test01/tomcat:v1

#镜像构建人信息(可选)

MAINTAINER zhao

#删除webapps目录下文件

RUN rm -rf /usr/local/tomcat/webapps/*

#复制打的最新war包到webapps目录

ADD target/quartz.war /usr/local/tomcat/webapps/

3.编写镜像shell脚本

#/bin/bash

#定义文件数变量

value1=`ls /root/tomcat-deployment.yml |wc -l`

value2=`ls /root/tomcat-service.yml |wc -l`

#检测tomcat-deployment.yml脚本是否存在

if [ "$vlaue1" == "0" ]; then

scp tomcat-deployment.yml root@192.168.154.134:/root/

kubectl create -f tomcat-deployment.yml

echo "tomcat-deployment.yml is created!"

fi

#检测tomcat-service.yml脚本是否存在

if [ "$vlaue2" == "0" ]; then

scp tomcat-service.yml root@192.168.154.134:/root/

kubectl create -f tomcat-service.yml

echo "tomcat-service.yml is created!"

fi

#检测2个脚本存在的情况

if [ "$value1" == "1" ] && [ "$value2" == "1" ]; then

kubectl set image deployment tomcat-dpm tomcat-cluster=192.168.154.129/maven-test01/maven-quartz:v1 #develop是v2

echo "k8s image is updated !"

fi

#查看pod

kubectl get pod -o wide

#查看service

kubectl get svc

4.编写 tomcat-deployment.yml

apiVersion: extensions/v1beta1

kind: Deployment

metadata:

name: tomcat-dpm

spec:

replicas: 2

template:

metadata:

labels: # Pod副本拥有的标签,对应RC的Selector

app: tomcat-cluster

spec:

containers:

- name: tomcat-cluster

image: 192.168.154.129/maven-test01/maven-quartz:v1 #develop分支 是v2

imagePullPolicy: Always

ports:

- containerPort: 8080 # 容器应用监听的端口号

imagePullSecrets:

- name: login

5.编写 tomcat-service.yml

apiVersion: v1

kind: Service

metadata:

name: tomcat-service

labels:

app: tomcat-service

spec:

type: NodePort

selector:

app: tomcat-cluster

ports:

- port: 8000

targetPort: 8080

nodePort: 32500

二、代码环境和分支准备

1.将编写好代码和脚本上传到gitlab仓库

2.gitalb 创建develop分支,上传代码和脚本文件

8ed7138ca6573254aa58fcd5aac00cb7.png

备注:develop分支和master内容一样(除了背景图)

三、新建Jenkins项目

1.新建流水线项目

9bd6dbb373cb3fe2d75b718048522139.png

2.添加参数模块

3412ca7941708395f86dd2f5c4eba929.png

763dbe564ad3178ff89e43bb284da8d9.png

3.配置流水线

1af59197ee9d50861772309c039cf816.png

8a18cce984165820537db9ff9086470a.png

四、构建测试

一、选择master分支, release 方法

8a5d0171fce936465bf1111b5827bfa5.png

查看构建信息

f0891bcdf17569e68e2968e2a0fdad09.png

959dc33d8f0edb3e27d5bb0bbb57d47a.png

预期效果:页面显示版本为v1.0

验证:

1.在master查看

e7d0668d065b45e74c3c77f45ae5c22f.png

07614c86e96faa524f8c153164654738.png

2.在node上面查看

460a2bf21f29c7d9e5be2598779d1689.png

4dc0ff6d28198f6e505343ffb8b1f87e.png

3.页面查看

30a39805f67466df1c7933b99a216dc4.png

80994736f6b737458bdb0cdfd16c3bc4.png

结果:和预期一样,成功!

二、选择develop分支, release 方法

2612e63ee8de0aa3b75a702cb444a167.png

查看构建信息

311ad69ec53426b8f88bde440663834a.png

预期效果: 页面显示版本为v2.0

验证:

网页查看

2ccb89f916c24959c6428f57481a7856.png

结果:和预期一样,成功!

三、选择develop分支, rollback方法

ee8de7606040dd525de820f3256344ac.png

预期效果:页面显示版本为v1.0 (上一次master构建)

验证

75ddf4cfc60efa23e09d6e336d51eeef.png

结果:和预期一样,成功!

四、选择master分支, rollback方法

cb2d67bdc0c760626dccd3f92b890d08.png

预期效果:页面显示版本为v2.0 (在master构建后回滚)

验证

cee759077cee160556de36e167ec63b6.png

实验结果:和预期一样,成功!

五、注意事项

问题点

问题一:无法远程连接gitlab

a18c73ee325da6cea070b2cc74232b4c.png

解决方法:

1.在分支里面填写变量名字$branch

9c0c2703acb8db24daa01b932c1de9fe.png

问题二:pipline脚本无法远程使用k8s命令

解决方法:参考上面的注意事项

问题三:没有构建参数选项

安装 Build With Parameters 、Persistent Parameter 插件(添加构建参数过程)

安装Git Parameter 插件(选择分支)

一定要重启Jenkins,才能生效

六、重难点

1.pipline 脚本选择方法参数(action)

解决方法:添加when条件

release 方法条件: when { environment name: 'action', value: 'release' }

rollback 方法条件: when { environment name: 'action', value: 'rollback' }

插入位置:在 stag和steps之间

2.shell 脚本的发布与更新

解决方法:使用if判断

发布条件:没有 tomcat-deployment.yml 和tomcat-serive.yml 脚本

更新条件:有 tomcat-deployment.yml 和tomcat-serive.yml 脚本且运行

3.k8s回滚实现

实现前提条件:

1.已经创建pod和service

2.使用k8s更新命令后的镜像

3.使用k8s回滚命令

4.pod和service脚本编写

1.编写脚本,可参考博客 https://blog.51cto.com/13760351/2504882

2.尽量将脚本写在gitlab中,不要写在k8s节点里面,避免一个个创建,修改。

七、总结

1.这个实验,我花了快一周的时间去完成的,之间出现很多问题,也解决了。

2.若后续再添加其他参数构建,部署方法类似

3.推荐做实验的电脑内存大于16G,要不然会很卡。

4.其实也可以只用shell脚本实现这些功能,我这里主要是为了学习pipline脚本编写能力。

参考博客:https://blog.51cto.com/14234542/2495985

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐