6.k8s CI与CD

创建一个在linux37的私有项目
新建文件
添加文件代码

测试代码是否可以克隆

root@wang:~/3# git clone git@192.168.200.147:linux37/app.git
创建放置脚本的文件夹
root@jenkins:~# mkdir  /root/scripts
创建打包目录
root@jenkins:~/scripts# mkdir /data/gitdata/linux37/app -pv
创建代码克隆脚本
root@jenkins:~/scripts# cat linux37-k8s-tomcat-app1.sh 
#!/bin/bash
#Author:wyh
#Date: 2019-08-03
#Version: v1

#记录脚本开始执行时间
starttime=`date +'%Y-%m-%d %H:%M:%S'`

#变量
SHELL_DIR="/root/scripts"
SHELL_NAME="$0"
K8S_CONTROLLER1="192.168.200.198"
K8S_CONTROLLER2="192.168.200.197"
DATE=`date +%Y-%m-%d_%H_%M_%S`
METHOD=$1
Branch=$2

if test -z $Branch;then
  Branch=develop
fi


function Code_Clone(){
  Git_URL="git@192.168.200.147:linux37/app.git"
  DIR_NAME=`echo ${Git_URL} |awk -F "/" '{print $2}' | awk -F "." '{print $1}'`
  DATA_DIR="/data/gitdata/linux37"
  Git_Dir="${DATA_DIR}/${DIR_NAME}"
  cd ${DATA_DIR} &&  echo "即将清空上一版本代码并获取当前分支最新代码" && sleep 1 && rm -rf ${DIR_NAME}
  echo "即将开始从分支${Branch} 获取代码" && sleep 1
  git clone -b ${Branch} ${Git_URL} 
  echo "分支${Branch} 克隆完成,即将进行代码编译!" && sleep 1
  #cd ${Git_Dir} && mvn clean package
  #echo "代码编译完成,即将开始将IP地址等信息替换为测试环境"
  #####################################################
  sleep 1  && echo "代码编译完成,即将开始打包"
  cd ${Git_Dir}
  tar czf ${DIR_NAME}.tar.gz  ./*
}

#将打包好的压缩文件拷贝到k8s 控制端服务器
function Copy_File(){
  echo "压缩文件打包完成,即将拷贝到k8s 控制端服务器${K8S_CONTROLLER1}" && sleep 1
  scp ${Git_Dir}/${DIR_NAME}.tar.gz root@${K8S_CONTROLLER1}:/opt/k8s-data/dockerfile/web/linux37/tomcat-app1
  echo "压缩文件拷贝完成,服务器${K8S_CONTROLLER1}即将开始制作Docker 镜像!" && sleep 1
}

#到控制端执行脚本制作并上传镜像
function Make_Image(){
  echo "开始制作Docker镜像并上传到Harbor服务器" && sleep 1
  ssh root@${K8S_CONTROLLER1} "cd /opt/k8s-data/dockerfile/web/linux37/tomcat-app1  && bash build-command.sh ${DATE}"
  echo "Docker镜像制作完成并已经上传到harbor服务器" && sleep 1
}

#到控制端更新k8s yaml文件中的镜像版本号,从而保持yaml文件中的镜像版本号和k8s中版本号一致
function Update_k8s_yaml(){
  echo "即将更新k8s yaml文件中镜像版本" && sleep 1
  ssh root@${K8S_CONTROLLER1} "cd /opt/k8s-data/yaml/web/linux37/tomcat-app1  && sed -i 's/image: harbor.magedu.*/image: harbor.magedu.net\/linux37\/linux37-tomcat:${DATE}/g' tomcat-app1.yaml"
  echo "k8s yaml文件镜像版本更新完成,即将开始更新容器中镜像版本" && sleep 1
}

#到控制端更新k8s中容器的版本号,有两种更新办法,一是指定镜像版本更新,二是apply执行修改过的yaml文件
function Update_k8s_container(){
  #第一种方法
   ssh root@${K8S_CONTROLLER1} "kubectl set image deployment/linux37-tomcat-app1-deployment  linux37-tomcat-app1-container=harbor.magedu.net/linux37/linux37-tomcat:${DATE} -n linux37"
  #第二种方法,推荐使用第一种
  #ssh root@${K8S_CONTROLLER1} "cd /opt/k8s-data/yaml/web-test/tomcat-app1 && kubectl  apply -f web-test.yam --record" 
  echo "k8s 镜像更新完成" && sleep 1
  echo "当前业务镜像版本: harbor.magedu.net/linux37/linux37-tomcat:${DATE}"
  #计算脚本累计执行时间,如果不需要的话可以去掉下面四行
  endtime=`date +'%Y-%m-%d %H:%M:%S'`
  start_seconds=$(date --date="$starttime" +%s);        
  end_seconds=$(date --date="$endtime" +%s);
  echo "本次业务镜像更新总计耗时:"$((end_seconds-start_seconds))"s"
}

#基于k8s 内置版本管理回滚到上一个版本
function rollback_last_version(){
  echo "即将回滚之上一个版本"
  ssh root@${K8S_CONTROLLER1}  "kubectl rollout undo deployment/linux37-tomcat-app1-deployment  -n linux37"
  sleep 1
  echo "已执行回滚至上一个版本"
}

#使用帮助
usage(){
  echo "部署使用方法为 ${SHELL_DIR}/${SHELL_NAME} deploy branch"
  echo "回滚到上一版本使用方法为 ${SHELL_DIR}/${SHELL_NAME} rollback_last_version"
}

#主函数
main(){
  case ${METHOD}  in
  deploy)
    Code_Clone;
#    Copy_File;
#    Make_Image; 
#    Update_k8s_yaml;
#    Update_k8s_container;
  ;;
  rollback_last_version)
    rollback_last_version;
  ;;
  *)
    usage;
  esac;
}

main $1 $2 $3

执行打包脚本
root@jenkins:~/scripts# bash linux37-k8s-tomcat-app1.sh deploy master
即将清空上一版本代码并获取当前分支最新代码
即将开始从分支master 获取代码
Cloning into 'app'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
分支master 克隆完成,即将进行代码编译!
代码编译完成,即将开始打包
查看打包目录
root@jenkins:/data/gitdata/linux37/app# ls
app.tar.gz  index.html
root@jenkins:/data/gitdata/linux37/app# cp app.tar.gz /opt/
拷贝过去
root@master:/opt# scp -r k8s-data 192.168.200.197:/opt/
拷贝密钥过去
root@jenkins:~/scripts# ssh-copy-id 192.168.200.198
把拷贝代码的添加过去,打包镜像也添加上
root@jenkins:~/scripts# vim linux37-k8s-tomcat-app1.sh 
 95     Copy_File;
 96     Make_Image;
 97     Update_k8s_yaml;
 98     Update_k8s_container;

修改build文件,加上tag标签
root@master:/opt/k8s-data/dockerfile/web/linux37/tomcat-app1# vim build-command.sh 
#/bin/bash
TAG=$1
docker build -t   harbor.wyh.net/linux37/linux37-tomcat:${TAG} .
docker push harbor.wyh.net/linux37/linux37-tomcat:${TAG}
修改Dockerfile  解压路径
root@master:/opt/k8s-data/dockerfile/web/linux37/tomcat-app1# vim Dockerfile 
ADD app.tar.gz /data/tomcat/webapps/app

执行镜像脚本

root@jenkins:~/scripts# bash linux37-k8s-tomcat-app1.sh deploy master 
即将清空上一版本代码并获取当前分支最新代码
即将开始从分支master 获取代码
Cloning into 'app'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
分支master 克隆完成,即将进行代码编译!
代码编译完成,即将开始打包
压缩文件打包完成,即将拷贝到k8s 控制端服务器192.168.200.198
app.tar.gz                                                                                       100%  139   193.2KB/s   00:00    
压缩文件拷贝完成,服务器192.168.200.198即将开始制作Docker 镜像!
开始制作Docker镜像并上传到Harbor服务器
Sending build context to Docker daemon  39.94kB
Step 1/9 : FROM harbor.wyh.net/linux37/linux37-centos7.6-tomcat:8.5.45
 ---> 2bc25989d3eb
Step 2/9 : maintainer zhangshijie "50589143@qq.com"
 ---> Running in 338f123645a9
Removing intermediate container 338f123645a9
 ---> cd52e0f15ef2
Step 3/9 : ADD app.tar.gz /data/tomcat/webapps/app
 ---> 41ebc73587b0
Step 4/9 : ADD run_tomcat.sh /apps/tomcat/bin/run_tomcat.sh
 ---> 37452f5430b7
Step 5/9 : ADD server.xml /apps/tomcat/conf/server.xml
 ---> 9fa537c0e1ca
Step 6/9 : ADD catalina.sh  /apps/tomcat/bin/catalina.sh
 ---> fc6bfedf1640
Step 7/9 : RUN chown www.www /apps/tomcat /data/tomcat /apps/apache-tomcat-8.5.45 -R
 ---> Running in ed1f3c01ddc3
Removing intermediate container ed1f3c01ddc3
 ---> 7e4194983f2b
Step 8/9 : EXPOSE 8080 8443
 ---> Running in 8d7350f4410c
Removing intermediate container 8d7350f4410c
 ---> 008fa5c88de5
Step 9/9 : CMD ["/apps/tomcat/bin/run_tomcat.sh"]
 ---> Running in 50c57445c8d0
Removing intermediate container 50c57445c8d0
 ---> 8a8f5c56e00a
Successfully built 8a8f5c56e00a
Successfully tagged harbor.wyh.net/linux37/linux37-tomcat:2019-12-01_09_10_49
The push refers to repository [harbor.wyh.net/linux37/linux37-tomcat]
Get https://harbor.wyh.net/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
Docker镜像制作完成并已经上传到harbor服务器


查看镜像

root@master:/opt/k8s-data/dockerfile/web/linux37/tomcat-app1# docker images
REPOSITORY                                                                   TAG                   IMAGE ID            CREATED             SIZE
harbor.wyh.net/linux37/linux37-tomcat                                        2019-12-01_09_10_49   8a8f5c56e00a        2 minutes ago       977MB
启动容器
root@master:/opt/k8s-data/dockerfile/web/linux37/tomcat-app1# docker run -it --rm -p 8081:8080 harbor.wyh.net/linux37/linux37-tomcat:2019-12-01_09_10_49


查看宿主机的8081端口

修改脚本主要是镜像地址

root@jenkins:~/scripts# cat linux37-k8s-tomcat-app1.sh
#!/bin/bash
#Author: ZhangShiJie
#Date: 2019-08-03
#Version: v1

#记录脚本开始执行时间
starttime=`date +'%Y-%m-%d %H:%M:%S'`

#变量
SHELL_DIR="/root/scripts"
SHELL_NAME="$0"
K8S_CONTROLLER1="192.168.200.198"
K8S_CONTROLLER2="192.168.200.197"
DATE=`date +%Y-%m-%d_%H_%M_%S`
METHOD=$1
Branch=$2

if test -z $Branch;then
  Branch=develop
fi


function Code_Clone(){
  Git_URL="git@192.168.200.147:linux37/app.git"
  DIR_NAME=`echo ${Git_URL} |awk -F "/" '{print $2}' | awk -F "." '{print $1}'`
  DATA_DIR="/data/gitdata/linux37"
  Git_Dir="${DATA_DIR}/${DIR_NAME}"
  cd ${DATA_DIR} &&  echo "即将清空上一版本代码并获取当前分支最新代码" && sleep 1 && rm -rf ${DIR_NAME}
  echo "即将开始从分支${Branch} 获取代码" && sleep 1
  git clone -b ${Branch} ${Git_URL} 
  echo "分支${Branch} 克隆完成,即将进行代码编译!" && sleep 1
  #cd ${Git_Dir} && mvn clean package
  #echo "代码编译完成,即将开始将IP地址等信息替换为测试环境"
  #####################################################
  sleep 1  && echo "代码编译完成,即将开始打包"
  cd ${Git_Dir}
  tar czf ${DIR_NAME}.tar.gz  ./*
}

#将打包好的压缩文件拷贝到k8s 控制端服务器
function Copy_File(){
  echo "压缩文件打包完成,即将拷贝到k8s 控制端服务器${K8S_CONTROLLER1}" && sleep 1
  scp ${Git_Dir}/${DIR_NAME}.tar.gz root@${K8S_CONTROLLER1}:/opt/k8s-data/dockerfile/web/linux37/tomcat-app1
  echo "压缩文件拷贝完成,服务器${K8S_CONTROLLER1}即将开始制作Docker 镜像!" && sleep 1
}

#到控制端执行脚本制作并上传镜像
function Make_Image(){
  echo "开始制作Docker镜像并上传到Harbor服务器" && sleep 1
  ssh root@${K8S_CONTROLLER1} "cd /opt/k8s-data/dockerfile/web/linux37/tomcat-app1  && bash build-command.sh ${DATE}"
  echo "Docker镜像制作完成并已经上传到harbor服务器" && sleep 1
}

#到控制端更新k8s yaml文件中的镜像版本号,从而保持yaml文件中的镜像版本号和k8s中版本号一致
function Update_k8s_yaml(){
  echo "即将更新k8s yaml文件中镜像版本" && sleep 1
  ssh root@${K8S_CONTROLLER1} "cd /opt/k8s-data/yaml/web/linux37/tomcat-app1  && sed -i 's/image: harbor.wyh.*/image: harbor.wyh.net\/linux37\/linux37-tomcat:${DATE}/g' tomcat-app1.yaml"
  echo "k8s yaml文件镜像版本更新完成,即将开始更新容器中镜像版本" && sleep 1
}

#到控制端更新k8s中容器的版本号,有两种更新办法,一是指定镜像版本更新,二是apply执行修改过的yaml文件
function Update_k8s_container(){
  #第一种方法
   ssh root@${K8S_CONTROLLER1} "kubectl set image deployment/linux37-tomcat-app1-deployment  linux37-tomcat-app1-container=harbor.wyh.net/linux37/linux37-tomcat:${DATE} -n linux37"
  #第二种方法,推荐使用第一种
  #ssh root@${K8S_CONTROLLER1} "cd /opt/k8s-data/yaml/web-test/tomcat-app1 && kubectl  apply -f web-test.yam --record" 
  echo "k8s 镜像更新完成" && sleep 1
  echo "当前业务镜像版本: harbor.wyh.net/linux37/linux37-tomcat:${DATE}"
  #计算脚本累计执行时间,如果不需要的话可以去掉下面四行
  endtime=`date +'%Y-%m-%d %H:%M:%S'`
  start_seconds=$(date --date="$starttime" +%s);        
  end_seconds=$(date --date="$endtime" +%s);
  echo "本次业务镜像更新总计耗时:"$((end_seconds-start_seconds))"s"
}

#基于k8s 内置版本管理回滚到上一个版本
function rollback_last_version(){
  echo "即将回滚之上一个版本"
  ssh root@${K8S_CONTROLLER1}  "kubectl rollout undo deployment/linux37-tomcat-app1-deployment  -n linux37"
  sleep 1
  echo "已执行回滚至上一个版本"
}

#使用帮助
usage(){
  echo "部署使用方法为 ${SHELL_DIR}/${SHELL_NAME} deploy branch"
  echo "回滚到上一版本使用方法为 ${SHELL_DIR}/${SHELL_NAME} rollback_last_version"
}

#主函数
main(){
  case ${METHOD}  in
  deploy)
    Code_Clone;
    Copy_File;
    Make_Image; 
    Update_k8s_yaml;
    Update_k8s_container;
  ;;
  rollback_last_version)
    rollback_last_version;
  ;;
  *)
    usage;
  esac;
}
main $1 $2 $3


root@jenkins:~/scripts# bash linux37-k8s-tomcat-app1.sh deploy master

访问30002的端口,页面也更新

把nginx修改成v3

root@master:/opt/k8s-data/yaml/web/linux37/nginx# vim nginx.yaml 
  9   replicas: 1
改为1个
 20         image: harbor.wyh.net/linux37/nginx:v3
执行
root@master:/opt/k8s-data/yaml/web/linux37/nginx# kubectl apply -f nginx.yaml 

查看nginx页面轮训不同
image.png
克隆
root@jenkins:/3# git clone git@192.168.200.147:linux37/app.git
修改代码为v2
root@jenkins:/3/app# vim index.html 
linux37 app1 k8s v2

root@jenkins:/3/app# mkdir wyh
root@jenkins:/3/app# vim wyh/index.html
wyh
添加到本地仓库
root@jenkins:/3/app# git add ./*
提交到gitlab上
root@jenkins:/3/app# git commit -m "v2"
创建一个自由风格到项目

image.png
传递的参数

执行master

image.png

image.png
回滚代码
image.png
image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容