暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

k8s部署-30-k8s与cicd持续集成、交付、部署的总流程(五)

运维家 2022-04-07
404

 

还记得下面这张图嘛?这是我们cicd中第一篇文章中我们一起画的,现在已经处理完harbor了,那么接下来我们是不是就该使用k8s来构建,然后健康检查了呢?

 


k8s-deploy

这里我们也使用脚本来进行配置,那么首先我们是不是一样的工作,先修改流水线上的配置呢?流水线修改如下:
    node {
    env.BUILD_DIR = "/root/script/namespace"
    env.MODEL = "springboot"
    stage('Git') { for display purposes
    git "https://gitee.com/xuexi100/yanshi.git"
    }
    stage('Maven') {
    sh "cd ${MODEL}; mvn clean; mvn package"
    }
    stage('build-image') {
    sh "sh root/script/build-springboot.sh"
    }
    stage('k8s-deploy'){
    sh "sh root/script/k8s-deploy.sh"
    }
    }


    老样子,梳理脚本思路,首先我们需要一个k8s的yaml文件,对吧,而且我们还需要一个镜像的名字,但是我们镜像的名字是“build-springpoot”中生成的,我们该如何获取呢?先不管,首先知道我们需要这两个东西,然后再解决。
      1、k8s的yaml文件
        在这里我们直接复制过来,然后把里面的相关值,配置成变量,就可以多次使用了。
      2、image的name
        这里的话,我们需要修改上个脚本,将镜像名字放到一个文件中,这样子我们是不是就可以获取到了。


      那么先修改“build-springpoot.sh”脚本吧。
        # 在脚本文件的最后添加如下信息
        # 获取镜像名字
        echo ${Image_Name} > root/script/IMAGE_NAME


        然后搞定yaml模板,把之前文章中的这个yaml拿过来稍微改动一下,如下。
          [root@node1 ~]# cd root/script/
          [root@node1 script]# mkdir template
          [root@node1 script]# cd template/
          [root@node1 template]#
          #deploy
          apiVersion: apps/v1
          kind: Deployment
          metadata:
          name: {{NAME}}
          spec:
          selector:
          matchLabels:
          app: {{NAME}}
          replicas: 1
          template:
          metadata:
          labels:
          app: {{NAME}}
          spec:
          containers:
          - name: {{NAME}}
          image: {{IMAGE}}
          ports:
          - containerPort: 8080
          ---
          #service
          apiVersion: v1
          kind: Service
          metadata:
          name: {{NAME}}
          spec:
          ports:
          - port: 80
          protocol: TCP
          targetPort: 8080
          selector:
          app: {{NAME}}
          type: ClusterIP


          ---
          #ingress
          apiVersion: extensions/v1beta1
          kind: Ingress
          metadata:
          name: {{NAME}}
          spec:
          rules:
          - host: {{HOST}}
          http:
          paths:
          - path:
          backend:
          serviceName: {{NAME}}
          servicePort: 80
          [root@node1 template]#


          可以看到我们在构建模板中设置了三个变量,其中有一个host,我们貌似没有地方可以获取,而且他是可以自定义的,那么我们就还需要修改下流水线配置如下,再新建个环境变量:
            node {
            env.BUILD_DIR = "/root/script/namespace"
            env.MODEL = "springboot"
            env.HOST = "springboot.yunweijia.com"
            stage('Git') { for display purposes
            git "https://gitee.com/xuexi100/yanshi.git"
            }
            stage('Maven') {
            sh "cd ${MODEL}; mvn clean; mvn package"
            }
            stage('build-image') {
            sh "sh root/script/build-springboot.sh"
            }
            stage('k8s-deploy'){
            sh "sh root/script/k8s-deploy.sh"
            }
            }

            然后我们开始写脚本内容:
              [root@node1 template]# cd ..
              [root@node1 script]# pwd
              /root/script
              [root@node1 script]#
              [root@node1 script]# vim k8s-deploy.sh
              #!/bin/bash
              name=${JOB_NAME}
              image=$(cat root/script/IMAGE_NAME)
              host=${HOST}


              # 输出变量
              echo "deploying~~~"
              echo "k8s_NAME: ${name}"
              echo "k8s_IMAGE: ${image}"
              echo "k8s_HOST: ${host}"


              # 复制yaml文件过来
              rm -f springboot.yaml
              cp root/script/template/springboot.yaml .


              # 替换变量
              sed -i "s,{{NAME}},${name},g" springboot.yaml
              sed -i "s,{{IMAGE}},${image},g" springboot.yaml
              sed -i "s,{{HOST}},${host},g" springboot.yaml


              # 使配置生效
              kubectl apply -f springboot.yaml


              # 查看yaml文件
              cat springboot.yaml
              [root@node1 script]# chmod +x k8s-deploy.sh


              整理完毕后我们去jenkins上“Build Now”一下子,看看结果:


              可以看到是没问题的,然后我们再去查看下这个pod是否存在:
                [root@node1 script]# kubectl get pod
                NAME READY STATUS RESTARTS AGE
                deploy-springboot-5cf68f977b-rrcc2 1/1 Running 0 4m10s
                nginx-ds-q2pjt 1/1 Running 16 10d
                nginx-ds-zc5qt 1/1 Running 21 16d
                [root@node1 script]#


                说明是没有问题的。


                health check

                接下来我们就应该配置健康检查了是吧,这里我们就不新建脚本了,就集合在上一个"k8s-deploy.sh"这个脚本中吧,集成结果如下:
                  #!/bin/bash
                  name=${JOB_NAME}
                  image=$(cat /root/script/IMAGE_NAME)
                  host=${HOST}


                  # 输出变量
                  echo "deploying~~~"
                  echo "k8s_NAME: ${name}"
                  echo "k8s_IMAGE: ${image}"
                  echo "k8s_HOST: ${host}"


                  # 复制yaml文件过来
                  rm -f springboot.yaml
                  cp /root/script/template/springboot.yaml .


                  # 替换变量
                  sed -i "s,{{NAME}},${name},g" springboot.yaml
                  sed -i "s,{{IMAGE}},${image},g" springboot.yaml
                  sed -i "s,{{HOST}},${host},g" springboot.yaml


                  # 使配置生效
                  kubectl apply -f springboot.yaml


                  # 查看yaml文件
                  cat springboot.yaml


                  # 健康检查
                  sleep 5
                  success=0
                  count=100
                  IFS=","
                  while [ ${count} -gt 0 ]
                  do
                  replicas=$(kubectl get deploy ${name} -o go-template='{{.status.replicas}},{{.status.updatedReplicas}},{{.status.readyReplicas}},{{.status.availableReplicas}}')
                  echo "kubectl get deploy ${name} -o go-template='{{.status.replicas}},{{.status.updatedReplicas}},{{.status.readyReplicas}},{{.status.availableReplicas}}'"
                  echo "replicas is ${replicas}"
                  shuzu=(${replicas})
                  if [ "${shuzu[0]}" == "${shuzu[1]}" -a "${shuzu[1]}" == "${shuzu[2]}" -a "${shuzu[2]}" == "${shuzu[3]}" ];then
                  echo "Health check Successful!"
                  success=1
                  break
                  fi
                  ((count--))
                  sleep 2
                  done
                  if [ ${success} -ne 1 ];then
                  echo "Health check Failed!"
                  fi


                  然后我们再次在jenkins上构建一下,如下:


                  至此,cicd结束。
                  PS:创建了一个群,感兴趣的老板们加我下面的微信号,拉你入群,一起讨论技术哈,共同学习进步。

                   

                  长按以识别二维码关注运维家~
                  微信号:yunweijia0909


                  往期推荐

                  k8s系列-06-containerd的基本操作

                  一文掌握oracle19c之离线情况下命令行安装和建库(下)- 本文干货满满,记得收藏哈

                  11-docker系列-docker之compose安装和相关命令


                  文章转载自运维家,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论