• Jenkins kubernetes(k8s)滚动发布实战


    前言

    • 前面写过一篇文章,kubernetes(k8s)滚动发布,不宕机实战已经实现了滚动发布,不过还得手工输命令,本篇呢想通过Jenkins实现一键操作。使发布应用效率提高。
    • 其实像KubeSphere这类的工具也是集成了Jenkins的,之所以直接使用Jenkins,是因为那种大而全的工具必然会损耗资源,而我又用不上那么多的功能。

    开始前的准备

    第一次创建应用

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-boot-kubernetes-deployment
    spec:
      replicas: 2
      strategy:
        rollingUpdate:
          maxSurge: 1 # 最大峰值用来指定可以创建的超出期望 Pod 个数的 Pod 数量。此值可以是绝对数(例如,5)或所需 Pods 的百分比(例如,10%)
          maxUnavailable: 0 #最大不可用  是一个可选字段,用来指定 更新过程中不可用的 Pod 的个数上限。该值可以是绝对数字(例如,5)也可以是所需 Pods 的百分比(例如,10%)
      selector:
        matchLabels:
          app: spring-boot-kubernetes-deployment
      template:
        metadata:
          labels:
            app: spring-boot-kubernetes-deployment
        spec:
          terminationGracePeriodSeconds: 300 #如果需要的优雅终止时间比较长 (preStop + 业务进程停止可能超过 30s),可根据实际情况自定义 terminationGracePeriodSeconds,避免过早的被 SIGKILL杀死,与下面preStop有关联,300属于总时间
          containers:
            - name: spring-boot-kubernetes
              image: spring-boot-kubernetes:1.0.0
          
              imagePullPolicy: Never # 只使用本地镜像,防止ErrImagePull异常
              ports:
                - containerPort: 8080
              readinessProbe: #就绪探针
                httpGet:
                  path: /
                  port: 8080
                initialDelaySeconds: 50 #容器启动后要等待多少秒后才启动存活和就绪探测器, 默认是 0 秒,最小值是 0
                periodSeconds: 5  # 指定了 kubelet 应该每 5 秒执行一次存活探测。
                successThreshold: 1 #探测器在失败后,被视为成功的最小连续成功数。默认值是 1。 存活和启动探测的这个值必须是 1。最小值是 1。
                failureThreshold: 2 #当探测失败时,Kubernetes 的重试次数。 对存活探测而言,放弃就意味着重新启动容器。 对就绪探测而言,放弃意味着 Pod 会被打上未就绪的标签。默认值是 3。最小值是 1
              env: # 解决Java程序时区问题
                - name: TZ
                  value: Asia/Shanghai
              lifecycle:
                preStop:
                  exec:
                    command: ["/bin/sh","-c","echo this pod is stopping. > /stop.log && sleep 90s"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 我需要spring-boot-kubernetes:1.0.0这个镜像,我手动创建一下。

    Dockerfile文件和jar同一级目录

    在这里插入图片描述

    • 然后用命令。
     docker build -t spring-boot-kubernetes:1.0.0 .
    
    • 1

    在这里插入图片描述

    • 开始首次运行,创建应用。
     kubectl apply -f deployment.yaml
    
    • 1
    • 运行了2个Pod,如下所示。

    在这里插入图片描述

    操作Jenkins

    General

    在这里插入图片描述

    源码管理

    • 源码管理填写仓库地址和分支,因为我是公共项目,所以不需要帐号密码。
      在这里插入图片描述

    构建

    在这里插入图片描述

    • 先用maven打包

    这里不需要加mvn

    • 然后执行脚本。
    #!/bin/bash
    sh rolling_update.sh
    
    • 1
    • 2
    • rolling_update.sh脚本内容。
     #!/bin/bash
    ls
    cp src/main/resources/Dockerfile target 
    ls target
    cd target
    date=`date "+%Y%m%d%H%M%S"`
    # 构建镜像
    docker build -t spring-boot-kubernetes:$date .
    # 滚动更新
    kubectl set image  deployment/spring-boot-kubernetes-deployment  spring-boot-kubernetes=spring-boot-kubernetes:$date --record
    # 查看Pod情况
    kubectl get pod -o wide
    # 查看滚动更新状态
    kubectl rollout status deployment/spring-boot-kubernetes-deployment
    # 查看Pod情况
    kubectl get pod -o wide
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • Dockerfile文件内容。
    FROM openjdk:8
    ADD spring-boot-kubernetes-0.0.1-SNAPSHOT.jar app.jar
    ENTRYPOINT [ "java", "-jar", "/app.jar"]
    
    • 1
    • 2
    • 3

    Jenkins构建

    • 下面就可以使用Build Now一键发布最新的应用。
      在这里插入图片描述
    • 可以查看构建历史,如果有错误的时候,方便排查错误。
      在这里插入图片描述
      在这里插入图片描述
    • 如果你不想点Build Now,也可以使用Webhook,可以参考拙作gitlab+jenkins自动发布到Tomcat
    • 以上就把Jenkins和kubernetes(k8s)结合起来实现滚动发布了。

    小结

    • 本文先把应用创建一次。然后Jenkins就做滚动发布的事情,分成这2个步骤。
  • 相关阅读:
    2023年中国液压胀管分类、产量及市场规模分析[图]
    python二级题库(百分之九十原题) 刷题软件推荐
    开发vue3,真的可以不用ref/reactive了,也不需要ref.value
    《Effective Java》第54条:返回零长度的数组或者集合,而不是null
    图文详解Linux基础经典教程(04)——配置子网IP和网关
    【微服务】服务发现和管理技术框架选型调研
    LeetCode 222. Count Complete Tree Nodes
    java 实现给PDF、PPT添加水印
    docker——知识点回顾(2)
    vue路由传参的几种方式
  • 原文地址:https://blog.csdn.net/baidu_19473529/article/details/125890186