美文网首页
6.k8s CI与CD

6.k8s CI与CD

作者: 哆啦A梦_ca52 | 来源:发表于2019-12-01 21:52 被阅读0次
    创建一个在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

    相关文章

      网友评论

          本文标题:6.k8s CI与CD

          本文链接:https://www.haomeiwen.com/subject/euvzwctx.html