首页 > 其他分享 >【原创】k8s 微服务滚动发布(服务持续可用)实践笔记

【原创】k8s 微服务滚动发布(服务持续可用)实践笔记

时间:2022-10-20 09:55:52浏览次数:90  
标签:回滚 服务 笔记 eureka 发布 滚动 k8s 下线

背景

     对于业务和产品来讲,随时都有紧急小版本功能上线,对于研发人员来讲,线上如果有一些紧急的bug,都需要随时发版修正;而对于产品使用用户来讲,任何的功能和版本发布,要尽可能对用户无感知。

方案

  • 灰度发布,自动小批量流量切换。
  • 产品层面要切分小版本,研发设计细节上要向上兼容(诸如接口层面)。
  • 服务发布要实现滚动发布,发布异常要自动回滚,中间不断服。
     其中一部分是工具实现,一部分是项目管理实现,最后一部分是运维层面及架构层面要做的适配和兼容。

k8s 滚动发布方案:

1. 历史实践方案- rancher

k8s采用rancher部署。 1)采用rancher cli 客户端工具登陆rancher,获取发布日志,扫描启动日志“成功标记位”,超过扫描周期,判定为发布失败,通知rancher进行回滚。 2)应用进程关闭前自动通知网关注销节点,通知eureka下线,关闭流量。如果关闭进程超时,则强杀! 实践心得:正常发布情况下基本可用,回滚情况下基本可用;如果出现超时,可能会出现流量少量时间异常。因为靠超时保证稳定性,所以有时发布周期较长。  

2. 现有实践方案 - 阿里云k8s

k8s采用阿里云部署。 1) 采用kubectl 工具,yml文件部署。 2)yml定义readinessProbe 就绪探针实现优雅上线,preStop 关闭前事件实现优雅下线。 3)采用发布“部署结果”状态检测,如果发布超过时间(超时),则立即通知回滚上一个版本。  
yml定义文件如图所示:

 

一. 优雅上线的http状态请求实现

1. 基于bsf框架底层(业务统一使用的底层基础架构),内部实现基于springboot的生命周期,识别应用进程所处的“启动完成”,“关闭事件”,从而识别应用是否已完全启动成功以及下线后撤销就绪状态。同样业务也可以订阅生命周期事件并加入自定义逻辑,从而保证      业务特殊场景的初始化完成才“处于就绪状态”,开始接收业务流量。 2. 代码外层逻辑如下:bsf-statusFilter
java-stop.sh文件如图所示:

二. 优雅下线的shell脚本实现

  1. 基于bsf框架底层(业务统一使用的底层基础架构),内部实现对于eureka服务的状态修改及自动下线,从而实现应用进程关闭时通知eureka注销自身应用服务下线。同样也会通知当前生命周期处于stopping状态,从而引发“就绪探针”的就绪状态失效。
  2. 代码外层逻辑如下:bsf-eurekaStatusFilter
  3. podstopsleeptime 时间为eureka注销后,默认eureka下线真正生效时间(因为eureka客户端可能有缓存),需要看eureka情况调整。比如eureka需要调优几个参数,其中涉及到eureka消费者端的订阅实例刷新的周期,eureka实例的eureka服务端缓存时间。理论上手工下线后5秒生效,如果手工下线失效,保守时间应该是消费者端实例刷新时间+eureka服务端实例缓存时间=生效时间;在eureka客户端配置如图调优后,考虑设置为10秒。
eureka 调优参考如下:

三. 发布异常检测逻辑实现

    核心实现基于两个关键k8s 命令: 1. kubectl rollout status deploy {服务名} -n {namespace}  定期检查当前发布状态,如果长时间没有发布成功,则通知回滚。(风险:假如此时有人工控制台或命令介入操作,会干预正常自动化发版) 2. kubectl -n {namespace} rollout undo deploy {服务名}  通知服务回滚上一个版本。(风险:上一个版本可能失败,或者出现异常?不一定是程序问题,可能数据库出现异常等等?所以一般人工介入确认一下比较好。同时发出飞书通知提醒!)
发布异常检测处理逻辑如图:

四. 验证滚动发布是否有效

1. 外层网关验证  采用全自动化全链路压测工具(自动流量录制,自动生成报告,压测效能提升10倍),设置自动化压测任务,进行长时间不间断扫描!验证发布/回滚时,流量验证是否出现中断!     结论: 配置2个线程持续扫描空接口的情况下,没有出现http链接异常,在滚动发布的时候出现流量的波谷,但是服务没有中断。
压测工具报告如图所示:

 

 

  2. 内部服务调用验证:  基于eureka情况下,内部rpc调用是否有效?尚未检验。 3. 多种异常情况下的发布是否正常回滚?  诸如常见的编译错误或者系统配置一样导致打包问题,会不会影响线上(应该是终止的)。多种服务启动错误能不能自动回滚?(有些场景下应该还是不能回滚的) 4. 内部大范围项目推广验证!!!  待实践。  

总结:

  此为k8s滚动发布实践记录,目前已初步实现滚动发布效果。细节仍然需要检验,勤做笔记,以待备忘!!!

标签:回滚,服务,笔记,eureka,发布,滚动,k8s,下线
From: https://www.cnblogs.com/chejiangyi/p/16808139.html

相关文章

  • Android调用华为统一扫码服务
    1.Android新建project此时注意新建的project的包名和项目名称,后面需要这2个 2.在华为开发平台新建项目并创建应用,此时需要输入项目名称和包名,要和上面的一致https......
  • 九鼎RK3399笔记三:测试迅为电子的杂项设备驱动
    Linux三大设备驱动字符设备:IO的传输过程是以字符为单位的,没有缓冲。比如I2C,SPI都是字符设备。块设备:IO的传输过程是以块为单位的。跟存储相关的,都属于块设备,比如TF卡。......
  • Nginx 在windows下的安装及使用(负载均衡 多服务器配置)
    1.下载nginxhttp://nginx.org/en/download.html下载稳定版本,以nginx/Windows-1.12.2为例,直接下载nginx-1.12.2.zip下载后解压,解压后如下  2.启动nginx有很多种方......
  • 【k8s】本地部署单节点测试集群
    前言k8s本地部署方式常见的有kubeadmin,minikube,rke等等,但是这几个在国内网络环境下都不好使,经常就是镜像拉取不下来。经过几轮测试,发现kind是最容易部署的部署方式......
  • nginx做负载均衡服务器,配置动静分离
    nginx做负载均衡服务器,配置动静分离目录nginx做负载均衡服务器,配置动静分离部署LNMP源码安装nginx二进制安装mysql源码安装php配置nginx部署LAMP源码安装httpd二进制安装......
  • 算法 - 线段树学习笔记
    前言:此文章为线段树基础知识可供学习参考咳咳,进入正题:我们在做题的时候可能会遇到给定一个数组同时给出一个值进行修改或是区间性的操作这里以单点修改和区间查询......
  • MySQL多表&事务课堂笔记
    今日内容1.多表查询2.事务3.DCL多表查询:*查询语法: select 列名列表 from 表名列表 where....*准备sql #创建部门表 CREATETABLEdept( idINT......
  • MySQL基础课堂笔记
    今日内容数据库的基本概念MySQL数据库软件安装卸载配置SQL数据库的基本概念1.数据库的英文单词:DataBase简称:DB2.什么数据库? *用于存储和管理数......
  • MySQL约束课堂笔记
    今日内容1.DQL:查询语句 1.排序查询 2.聚合函数 3.分组查询 4.分页查询2.约束3.多表之间的关系4.范式5.数据库的备份和还原DQL:查询语句1.排序查询......
  • guli笔记
    模块一(讲师管理模块)后端(准备工作)准备工作搭建数据库数据库设计搭建搭建项目项目结构的搭建创建父工程pom类型(父工程)依赖管理版本和公共依赖搭建子模块......