在生产环境中,咱们一般会使用Jenkins流水线部署k8s群集,这里主要介绍使用Jenkins的pipline可选择分支实现k8s群集的发布、更新、回滚功能。java
角色 | 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 |
有2个分支branch=(master,develop),能够任意选择分支构建node
为了作实验,修改背景图片来作区别
master 分支:背景图片上面版本号:v1.0
develop 分支:背景图片上面版本号:v2.0mysql
每一个分支都有2个构建方法action=(release,rollback),能够任意选择方法git
方法release:正常版本发布
方法rollback:出现问题时,紧急回滚上一个版本web
实现选择各分支和各方法,随意组合,构建版本sql
参考博客 http://www.javashuo.com/article/p-nubvpgfx-ve.htmldocker
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服务器的环境变量shell
vim /root/.bashrc
末尾添加:apache
export KUBECONFIG=/etc/kubernetes/admin.conf
source /root/.bashrc #刷新vim
#从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/
#/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
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
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
备注:develop分支和master内容同样(除了背景图)
预期效果:页面显示版本为v1.0
结果:和预期同样,成功!
预期效果: 页面显示版本为v2.0
结果:和预期同样,成功!
预期效果:页面显示版本为v1.0 (上一次master构建)
结果:和预期同样,成功!
预期效果:页面显示版本为v2.0 (在master构建后回滚)
实验结果:和预期同样,成功!
1.在分支里面填写变量名字$branch
安装 Build With Parameters 、Persistent Parameter 插件(添加构建参数过程)
安装Git Parameter 插件(选择分支)
必定要重启Jenkins,才能生效
release 方法条件: when { environment name: 'action', value: 'release' }
rollback 方法条件: when { environment name: 'action', value: 'rollback' }
插入位置:在 stag和steps之间
发布条件:没有 tomcat-deployment.yml 和tomcat-serive.yml 脚本
更新条件:有 tomcat-deployment.yml 和tomcat-serive.yml 脚本且运行
1.已经建立pod和service
2.使用k8s更新命令后的镜像
3.使用k8s回滚命令
1.编写脚本,可参考博客 https://blog.51cto.com/13760351/2504882
2.尽可能将脚本写在gitlab中,不要写在k8s节点里面,避免一个个建立,修改。
1.这个实验,我花了快一周的时间去完成的,之间出现不少问题,也解决了。
2.若后续再添加其余参数构建,部署方法相似
3.推荐作实验的电脑内存大于16G,要否则会很卡。
4.其实也能够只用shell脚本实现这些功能,我这里主要是为了学习pipline脚本编写能力。
参考博客:http://www.javashuo.com/article/p-avfqciyb-bd.html