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"]
  • 我需要spring-boot-kubernetes:1.0.0这个镜像,我手动创建一下。

Dockerfile文件和jar同一级目录

在这里插入图片描述

  • Dockerfile文件内容。
FROM openjdk:8
ADD spring-boot-kubernetes-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT [ "java", "-jar", "/app.jar"]
  • 然后用命令。
 docker build -t spring-boot-kubernetes:1.0.0 .

在这里插入图片描述

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

在这里插入图片描述

操作Jenkins

General

在这里插入图片描述

源码管理

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

构建

在这里插入图片描述

  • 先用maven打包

这里不需要加mvn

  • 然后执行脚本。
#!/bin/bash
sh rolling_update.sh
  • 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
  • Dockerfile文件内容。
FROM openjdk:8
ADD spring-boot-kubernetes-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT [ "java", "-jar", "/app.jar"]

Jenkins构建

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

小结

  • 本文先把应用创建一次。然后Jenkins就做滚动发布的事情,分成这2个步骤。

posted on 2022-08-28 11:26  愤怒的苹果ext  阅读(503)  评论(0编辑  收藏  举报

导航