企业级实战 Spring Boot + K8S 中的滚动发布、优雅停机、弹性伸缩、应用监控、配置分离

这篇具有很好参考价值的文章主要介绍了企业级实战 Spring Boot + K8S 中的滚动发布、优雅停机、弹性伸缩、应用监控、配置分离。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

下面为大家介绍我司生产环境使用了3年的基于K8S的dev ops 配置实现 K8s + SpringCloud实现零宕机发版,优雅重启:健康检查+滚动更新+优雅停机+弹性伸缩+Prometheus监控+配置分离(镜像复用)

汇总配置

业务层面

项目依赖 pom.xml

使用 spring-boot-starter-actuator 镜像 存活、就绪检查

使用 prometheus 进行应用监控

<!-- 引入Spring boot的监控机制-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

定义访问端口、路径及权限 application.yaml

spring:
  application:
    name: project-sample
  profiles:
    active: @profileActive@
  lifecycle:
    timeout-per-shutdown-phase: 30s     # 停机过程超时时长设置30s,超过30s,直接停机

server:
  port: 8080
  shutdown: graceful                    # 默认为IMMEDIATE,表示立即关机;GRACEFUL表示优雅关机

management:
  server:
    port: 50000                         # 启用独立运维端口
  metrics:
    tags:
      application: ${spring.application.name}
  endpoint:                             # 开启shutdown和health、serviceregistry(用于nacos下线)端点
    shutdown:
      enabled: true
    serviceregistry:
       enabled: true
    health:
      probes:
        enabled: true
  endpoints:
    web:
      exposure:
        base-path: /actuator            # 指定上下文路径,启用相应端点
        include: health,shutdown,metrics,prometheus

运维层面

  • 打包属于我们自己的dockerfile基础镜像
FROM openjdk:8-jdk-alpine

LABEL Author  andanyang
## 时区环境
ENV TZ=Asia/Shanghai
ENV JAVA_OPT
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

WORKDIR /root
## 使用 skywalking 不用可忽略
COPY skywalking-agent /root/agent

## 解决EasyExcel 缺少字体问题
RUN apk --update add curl bash ttf-dejavu && \
  rm -rf /var/cache/apk/*
RUN apk --update --no-cache add tini
## 使用 tini 启动应用 让容器里也可以使用jps等命令
ENTRYPOINT ["tini"]
docker build -t common/jdk8 .
  • 打包各个服务的镜像

    FROM common/jdk8
    ## 不使用 skywalking 可移除
    CMD /usr/bin/java -Djava.security.egd=file:/dev/./urandom -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/root/log/ -javaagent:/root/agent/skywalking-agent.jar ${JAVA_OPT} -jar ${app_name}.jar
                    
    COPY ${app_name}-impl/target/${app_name}-impl.jar ${app_name}.jar
    
    

k8s部署模版deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {APP_NAME}
  labels:
    app: {APP_NAME}
spec:
  selector:
    matchLabels:
      app: {APP_NAME}
  replicas: {REPLICAS}                            # Pod副本数
  strategy:
    type: RollingUpdate                           # 滚动更新策略
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      name: {APP_NAME}
      labels:
        app: {APP_NAME}
      annotations:
        timestamp: {TIMESTAMP}
        prometheus.io/port: "50000"               # 不能动态赋值
        prometheus.io/path: /actuator/prometheus
        prometheus.io/scrape: "true"              # 基于pod的服务发现
    spec:
      affinity:                                   # 设置调度策略,采取多主机/多可用区部署
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - {APP_NAME}
              topologyKey: "kubernetes.io/hostname" # 多可用区为"topology.kubernetes.io/zone"
      terminationGracePeriodSeconds: 30             # 优雅终止宽限期
      containers:
      - name: {APP_NAME}
        image: {IMAGE_URL}
        imagePullPolicy: Always
        ports:
        - containerPort: {APP_PORT}
        - name: management-port
          containerPort: 50000         # 应用管理端口
        readinessProbe:                # 就绪探针
          httpGet:
            path: /actuator/health/readiness
            port: management-port
          initialDelaySeconds: 30      # 延迟加载时间
          periodSeconds: 10            # 重试时间间隔
          timeoutSeconds: 1            # 超时时间设置
          successThreshold: 1          # 健康阈值
          failureThreshold: 9          # 不健康阈值
        livenessProbe:                 # 存活探针
          httpGet:
            path: /actuator/health/liveness
            port: management-port
          initialDelaySeconds: 30      # 延迟加载时间
          periodSeconds: 10            # 重试时间间隔
          timeoutSeconds: 1            # 超时时间设置
          successThreshold: 1          # 健康阈值
          failureThreshold: 6          # 不健康阈值
        resources:                     # 容器资源管理
          limits:                      # 资源限制(监控使用情况)
            cpu: 0.5
            memory: 1Gi
          requests:                    # 最小可用资源(灵活调度)
            cpu: 0.1
            memory: 200Mi
        lifecycle:
          preStop:
              exec:
                command:               # 结束回调钩子,在实战中SpringClould 中防止注册中心没有及时下掉服务,最好需要手动下线服务。再安全下线
                  - /bin/sh
                  - "-c"
                  - >-
                    curl -X "POST" "http://localhost:50000/actuator/service-registry?status=DOWN" -H "Content-Type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8";sleep
                    10s;curl -X "POST" "http://localhost:50000/actuator/shutdown" -H "Content-Type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8";
        env:
          - name: TZ
            value: Asia/Shanghai
          - name: JAVA_OPT              # 配置JAVA启动参数
          	value: "-Xmx4g -Xms4g"
---
kind: HorizontalPodAutoscaler            # 弹性伸缩控制器
apiVersion: autoscaling/v2beta2
metadata:
  name: {APP_NAME}
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: {APP_NAME}
  minReplicas: {REPLICAS}                # 缩放范围
  maxReplicas: 6
  metrics:
    - type: Resource
      resource:
        name: cpu                        # 指定资源指标
        target:
          type: Utilization
          averageUtilization: 50

友情导读

k8s学习系列

Prometheus 实战系列

Prometheus Operator实战—— Prometheus、Alertmanager、Grafana 监控Springboot服务

基于K8S构建企业级Jenkins CI/CD平台实战(一) 之 环境搭建

基于K8S构建企业级Jenkins CI/CD平台实战(二) 之 kubernetes-plugin 插件使用

Jenkins优化Kubernetes部署流水线文章来源地址https://www.toymoban.com/news/detail-463416.html

到了这里,关于企业级实战 Spring Boot + K8S 中的滚动发布、优雅停机、弹性伸缩、应用监控、配置分离的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java企业级开发学习笔记(4.4)Spring Boot加载自定义配置文件

    创建 Spring Boot 项目 单击【创建】按钮 在 resources 里创建 myconfig.properties 文件 设置文件编码 设置学生的四个属性值 在 cn.kox.boot 包里创建config子包,在子包里创建 StudentConfig 打开自带的测试类 ConfigDemo01ApplicationTests 注入学生配置实体,创建 testStudentConfig() 测试方法,在里面输

    2024年02月08日
    浏览(37)
  • “深入理解Spring Boot:构建独立、可扩展的企业级应用程序的最佳实践“

    标题:深入理解Spring Boot:构建独立、可扩展的企业级应用程序的最佳实践 摘要:Spring Boot是一个强大的框架,可以帮助开发人员快速构建独立、可扩展的企业级应用程序。本文将深入探讨Spring Boot的核心概念和最佳实践,并通过示例代码演示其用法。 正文: 什么是Spring Bo

    2024年02月14日
    浏览(46)
  • Java企业级信息系统开发学习笔记(4.2)Spring Boot项目单元测试、热部署与原理分析

    该文章主要为完成实训任务,详细实现过程及结果见【http://t.csdn.cn/pG623】 1. 添加测试依赖启动器和单元测试 修改pom.xml文件,添加依赖 刷新项目依赖 2. 创建测试类与测试方法 在 src/test/java 里创建 cn.kox.boot 包,创建测试类 TestHelloWorld01 给测试类添加测试启动器注解与Spring

    2024年02月10日
    浏览(43)
  • 企业级DevOps实战

    Zookeeper(动物管理员)是一个开源的分布式协调服务,目前由Apache进行维护。 MQ概念 MQ(消息队列)是一种应用程序之间的通信方法,应用程序通过读写出入队列的消息(针对应用程序的数据)通信,而无须专用连接。 MQ是一种先进先出的数据结构,是指把要传输的数据(消

    2024年02月20日
    浏览(37)
  • CDH6.3.2企业级安装实战

    1、环境介绍 IP 操作系统 联网 10.191.15.15 Centos 7.4 离网 10.191.15.16 Centos 7.4 离网 10.191.15.17 Centos 7.4 离网 10.191.15.18 Centos 7.4 离网 2、搭建本地Yum源 2.1 配置本地基础Yum源 1、上传镜像到服务器 下载的Centos镜像为 CentOS-7-x86_64-Everything-1708.iso , 放置目录为: /root/download

    2024年01月18日
    浏览(39)
  • 前端工程化实战-开发企业级CLI

    1. 前言 脚手架大家一定都不陌生,比如我们经常使用的 vue-cli、create-react-app,它可以帮助我们快速的初始化一个项目,无需从零配置,极大的方便我们的开发。到这里你可能会疑惑,既然市面上有成熟的脚手架,为什么需要写一个属于自己的脚手架呢。因为公共脚手架虽然强

    2024年02月12日
    浏览(36)
  • 企业级微服务架构实战项目--xx优选-用户登录

    1.登录常量  2.登录地址  3.配置域名 4.启动程序     触发连接小程序后端的登录接口    小程序controller的登录方法  

    2024年02月11日
    浏览(48)
  • Android企业级实战-界面篇-2,android音频开发

    ?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"? RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android” android:id=“@id/user_profile_layout” android:layout_width=“fill_parent” android:layout_height=“100.0dip” android:clickable=“true” android:clipChildren=“false” ImageView android:id=“@id/profile_cover” android:layout_width=“

    2024年04月27日
    浏览(36)
  • Kafka在企业级应用中的实践

    前面说了很多Kafka的性能优点,有些童鞋要说了,这Kafka在企业开发或者企业级应用中要怎么用呢?今天咱们就来简单探究一下。 Kafka 提供了一个可靠的消息传递机制,使得企业能够将不同组件之间的通信解耦,实现高效的异步处理。在企业级应用中,可以通过以下步骤来使

    2024年02月11日
    浏览(34)
  • Spring Boot + k8s = 王炸!

    来源:https://blog.csdn.net/qq_14999375/article/details/123309636 K8s + Spring Boot实现零宕机发布:健康检查+滚动更新+优雅停机+弹性伸缩+Prometheus监控+配置分离(镜像复用) 健康检查类型:就绪探针(readiness)+ 存活探针(liveness) 探针类型:exec(进入容器执行脚本)、tcpSocket(探测端口

    2024年02月14日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包