栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Jenkins kubernetes(k8s)滚动发布实战

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Jenkins kubernetes(k8s)滚动发布实战

目录
    • 前言
    • 开始前的准备
    • 第一次创建应用
    • 操作Jenkins
      • General
      • 源码管理
      • 构建
    • Jenkins构建
    • 小结

前言
  • 前面写过一篇文章,kubernetes(k8s)滚动发布,不宕机实战已经实现了滚动发布,不过还得手工输命令,本篇呢想通过Jenkins实现一键操作。使发布应用效率提高。
  • 其实像KubeSphere这类的工具也是集成了Jenkins的,之所以直接使用Jenkins,是因为那种大而全的工具必然会损耗资源,而我又用不上那么多的功能。
开始前的准备
  • JDK环境。
  • kubernetes。
  • Jenkins。安装好之后需要一些基础配置,可以参考拙作gitlab+jenkins自动发布到Tomcat。
  • Docker。
  • 我使用的项目地址是: https://github.com/1030907690/spring-boot-kubernetes。
第一次创建应用
  • 首先需要一个yaml文件(deployment.yaml),参考kubernetes(k8s)滚动发布,不宕机实战,去掉了ConfigMap的配置和command,代码如下。
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同一级目录

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

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

操作Jenkins
  • 怎么下载、运行Jenkins就不赘述了,可以参考拙作gitlab+jenkins自动发布到Tomcat。
  • Jenkins配置maven、jdk、git等等同样可以参考拙作gitlab+jenkins自动发布到Tomcat。
  • 下面直接创建自由风格项目。进入配置。
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个步骤。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1020044.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号