springboot项目 + rancher管理 实现用户无感知部署

springboot项目 + rancher管理 实现用户无感知部署

rancher/yaml设置

在rancher找到对应服务的config,将Minimum Ready设置为合适的时间(单位为秒)

在这里插入图片描述

或者以yaml文件修改配置,但是在yaml配置中是叫minReadySeconds

spec: # 定义deployment资源需要的参数属性,诸如是否在容器失败时重新启动容器的属性
  minReadySeconds: 60 # 滚动升级时60s后认为该pod就绪,默认0s,如果没有设置该值,Kubernetes会假设该容器启动起来后就提供服务了,在某些极端情况下可能会造成服务不正常运行
  progressDeadlineSeconds: 600 # 部署升级的最大时间,如果没完成将变成超时状态
  replicas: 1 # 定义副本数量
  revisionHistoryLimit: 10 # 定义保留几个历史版本记录

此时新编译打包的镜像启动后,旧版本的镜像将会在60s后才被kill掉,避免了新镜像刚启动未注册到服务发现配置就把旧镜像kill掉后导致的空窗期。

但是这样又会引发一个新问题:旧镜像在60s后被kill掉会不会导致一部分负载到此镜像的流量异常(此时相当于两个节点在服务发现上)

由此可以引申出服务优雅下线

优雅下线

简单的说,就是向应用进程发出停止指令之后,能保证正在执行的业务操作不受影响,直到操作运行完毕之后再停止服务。应用程序接收到停止指令之后,会进行如下操作:

  • 1.停止接收新的访问请求
  • 2.正在处理的请求,等待请求处理完毕;对于内部正在执行的其他任务,比如定时任务、mq 消费等等,也要等当前正在执行的任务执行完毕,并且不再启动新的任务
  • 3.当应用准备关闭的时候,按需向外发出信号,告知其他应用服务准备接手,以保证服务高可用

如果暴力的关闭应用程序,比如通过kill -9 <pid>命令强制直接关闭应用程序进程,可能会导致正在执行的任务数据丢失或者错乱,也可能会导致任务所持有的全局资源等不到释放,比如当前任务持有 redis 的锁,并且没有设置过期时间,当任务突然被终止并且没有主动释放锁,会导致其他进程因无法获取锁而不能处理业务。

如何使用:

在pom文件引入

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

在服务bootstrap.yaml文件配置

server:
  ##开启优雅停机,默认等待30s处理剩余任务
  shutdown: graceful
  
# 优雅下线配置
management:
  endpoint:
    shutdown:
      enabled: true #启用 shutdown 端点,默认是未启用的
  endpoints:
    web:
      exposure:
        include: health,info,shutdown #对外公开 health,info,shutdown 端点,默认只会公开前两个  

于是现在关闭日志就会有如下日志,说明就成功了

在这里插入图片描述

最终实现的效果:

新起编译任务时,不会一下把旧容器kill掉,而是同时存在两个容器,旧容器将会在半分钟之后开启优雅下线-也就是不再接收新的请求,大约再半分钟后完成已接收到的请求后开始关闭所有链接并自毁容器,此时就只剩新容器了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值