EMQX 在 Kubernetes 中如何进行优雅升级

news2024/11/28 2:41:02

背景

为了降低 EMQX 在 Kubernetes 上的部署、运维成本,我们将一些日常运维能力进行总结、抽象并整合到代码中,以 EMQX Kubernetes Operator 的方式帮助用户实现 EMQX 的自动化部署和运维。

此前,EMQX Kubernetes Operator v1beta1、v1beta2、v1beta3 的升级策略均为滚动升级,相关升级流程如下:

1

问题分析

滚动升级在生产环境中可能会面临以下问题:

  1. 升级过程中会逐个销毁旧的节点再创建新的节点,因此可能导致客户端多次断连(最糟糕的情况下断连次数与节点数量一致),从而影响用户体验。
  2. 当集群处于较高连接的情况下,一个节点被销毁,那么该节点上面的连接会在瞬间断开,由客户端重试逻辑来进行重连;当单节点连接数较大时,如果大量客户端进行重连,则可能会给服务端造成压力导致过载。
  3. 升级完成后,各节点间的负载不均衡(如上图:emqx-ee-0 在升级过程中,客户端可能会进行重连,此时由于 emqx-ee-0 还未就绪,因此可能连接到 emqx-ee-1 或者 emqx-ee-2,升级完成后 emqx-ee-0 上可能只有较少负载或者无负载),从而打破业务容量模型的规划,可能影响到服务。
  4. 由于使用 StatefulSets 进行部署,在升级过程中提供服务的节点会比实际节点要少一个(影响到用户的业务模型),这可能会增加服务端的一些压力。

如果上面几个步骤的问题叠加(多次断连与大量断连的客户端不停的重试连接),则可能会放大客户端重连的规模,从而造成服务端过载或雪崩。

下图是在现有升级模式下连接数的监控图(在不同的业务中会存在差异,比如后端依赖的不同资源、服务器配置、客户端重连或重试策略等,均会带来一些不同的影响)。其中:

  • sum:总的连接数,图中最上面的一条线
  • emqx-ee-a:前缀表示的是升级前 3 个 EMQX 节点
  • emqx-ee-b:前缀表示的是升级后 3 个 EMQX 节点

2

在上图中,当我们开始执行滚动升级时,首先 emqx-ee-a-emqx-ee-2 进行销毁,并创建新的 emqx-ee-b-emqx-ee-2,此时仅有 emqx-ee-a-emqx-ee-1、emqx-ee-a-emqx-ee-0 能够提供服务,当客户端进行重连时,LB 会将流量转移到 emqx-ee-a-emqx-ee-0、emqx-ee-a-emqx-ee-1 上面,因此我们能够看到 emqx-ee-a-emqx-ee-1、emqx-ee-a-emqx-ee-0 有明显的流量上升,当后面更新这两个 pod 时,意味着客户端可能多次断连。由于新 pod 建立的过程存在着时间差,以上图为例,emqx-ee-a-emqx-ee-0 最后升级,当升级完成后,可能客户端已经完成重试、重连,此时主要连接已经被另两个 pod 接纳,因此会导致 pod 之间流量不均衡,从而影响到用户业务模型的评估,或者影响到服务。

为了方便展示,我们未压测大量连接模拟重连、导致服务端过载的场景(在实际生产环境中可能遇到,TPS 超过云端规划的容量模型),但从连接数监控图上,我们依然看到一个大缺口,说明对业务产生了较大影响。因此我们需制定一种方案来规避以上几个问题,保障升级过程中的平滑稳定。

问题解决

目标

  1. 升级过程中实现连接数可控迁移(可根据服务端处理能力设置相应的迁移速率)。
  2. 升级过程中减少连接断开的次数(一次断连)。
  3. 在整个升级的过程中始终保持预期的节点来提供服务。
  4. 升级完成后,不需要集群负载重平衡,各节点间的连接相对均衡(与 LB 调度策略有一定关系)。

方案设计

蓝绿发布是一种同时运行两个版本应用的发布策略。EMQX Kubernetes Operator 近日在 2.1.0 版本中实现了 EMQX Enterprise 的蓝绿发布,即从现有的 EMQX Enterprise 集群开始,创建一套新版本的 EMQX Enterprise 集群,在这一过程中不停止掉老版本,等新版本集群运行起来后,再将流量逐步平滑切换到新版本上。

从 4.4.12 版本开始,EMQX 企业版本支持节点疏散功能。节点疏散功能允许用户在关闭节点之前强制将连接和会话以一定速率迁移到其他节点,以避免节点关闭带来的会话数据丢失。

关于节点疏散更多信息请参考相关文档

在 Kubernetes 上我们通过模拟蓝绿发布以及结合节点疏散功能,实现了连接可控迁移,极大减少了断连的次数(仅断连一次)。相关升级流程图如下:

3

整个升级流程大致可分为以下几步:

  1. 升级时(镜像、Pod 相关资源修改调整)我们会先创建一个同规格的节点加入到现有集群中。
  2. 当新节点全部就绪后,我们将 service 全部指向新创建的节点,此时新节点开始接受新的连接请求。
  3. 将旧节点从 service 中摘出,此时旧节点不再接收新的连接请求。
  4. 通过 EMQX 节点疏散功能,逐个对节点上的连接进行可控迁移,直至连接全部完成迁移,再对节点进行销毁。

操作流程

节点疏散是 EMQX Enterprise 4.4.12 开始支持的新特性,EMQX Kubernetes Operator 在 2.1 版本中对该能力进行适配,如需使用该能力,请将 EMQX 升级到企业版 v4.4.12,EMQX Kubernetes Operator 升级到 v2.1。

  • 配置蓝绿升级
apiVersion: apps.emqx.io/v1beta4
...
spec:
   blueGreenUpdate:
    initialDelaySeconds: 60
    evacuationStrategy:
      waitTakeover: 5
      connEvictRate: 200
      sessEvictRate: 200
...

initialDelaySeconds :所有的节点就绪后(蓝绿节点),开始节点疏散前的等待时间 (由于切换 Service 后,LoadBalancer 需要时间来处理 service 与 pod 的关系)(单位:秒)

waitTakeover :所有连接断开后,等待客户端重连以接管会话的时间(单位:秒)

connEvictRate :客户端每秒断开连接速度

sessEvictRatewaitTakeover 之后每秒会话疏散速度

详情可参考:Operator 文档

升级过程中连接数监控图如下(本次测试以 10 万连接进行):

4

sum:总的连接数,图中最上面的一条线

emqx-ee-86d7758868:前缀表示的是升级前的 3 个 EMQX 节点

emqx-ee-745858464d:前缀表示升级后的 3 个 EMQX 节点

如上图,我们通过 EMQX Kubernetes Operator 的蓝绿发布在 Kubernetes 中实现了优雅升级,通过该方案升级,总连接数未出现较大抖动(取决于迁移速率、服务端能够接收的速率、客户端重连策略等),能够极大程度保障升级过程的平滑,有效防止服务端过载,减少业务感知,从而提升服务的稳定性。

注:由于升级后的集群,三个节点负载较平均,因此上图三条线重叠在了一起。

结语

通过采用节点疏散功能结合模拟蓝绿发布,本文所提供的方案解决了普通升级导致的多次断连和可能的服务过载与负载不均问题,实现了在 Kubernetes 上优雅的升级。

作为一个自动化管理工具,EMQX Kubernetes Operator 旨在帮助用户轻松创建和管理 EMQX 集群,充分享受 EMQX 的强大产品能力。通过本文方案完成 EMQX 的升级,用户可以进一步体验 EMQX 的最新特性,构建创新物联网应用。

版权声明: 本文为 EMQ 原创,转载请注明出处。

原文链接:https://www.emqx.com/zh/blog/how-to-upgrade-emqx-in-kubernetes

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/166715.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React--》如何在React中创建TypeScript项目并使用?

目录 React中创建TS项目 TS目录结构 React函数组件类型 React类组件类型 如果你已经掌握了TS中基础类型、高级类型的使用,还想在前端项目中更深一层的使用TS,还需要掌握React、Vue、Angular等框架和框架提供的API,懂得如何在框架中使用TS…

【ROS】—— 机器人导航(仿真)—导航实现(十八)[重要][重要][重要]

文章目录前言准备条件1. 导航实现01_SLAM建图1.1 gmapping简介1.2 gmapping节点说明1.3 gmapping使用1.3.1 编写gmapping节点相关launch文件1.3.2 执行2. 导航实现02_地图服务2.1 map_server简介2.2 map_server使用之地图保存节点(map_saver)2.2.1 map_saver节点说明2.2.2 地图…

你是真的“C”——函数递归详解汉诺塔+青蛙跳台阶

函数递归详解汉诺塔青蛙跳台阶问题😎前言🙌函数递归之汉诺塔详解分析🙌汉诺塔问题的简介😊汉诺塔的移动图解😊汉诺塔具体的移动过程展示😊汉诺塔的难处所在:😊函数递归之青蛙跳台阶详…

从头安装gdal库(Linux环境下的Python版)

目录前言GDAL安装SWIG安装proj 安装sqlite安装pkg-config 安装其他报错No package libtiff-4 foundPackage liblzma, required by libtiff-4, not foundPackage libjpeg, required by libtiff-4, not foundPackage zlib, required by libtiff-4, not foundchecking for curl-co…

Windows下IIS部署网站流程

IIS Internet information service 是一个web服务器 1. IIS用于windows系统 2.apache用于Linux系统,JAVA的web服务器 3.Nginx用于Linux,负责负载均衡,反向代理 安装完IIS之后,去更改DNS的指向。 DNS指向:IP 和 域名 的…

Dopamine-PEG-N3,多巴胺聚乙二醇叠氮 科研试剂用于点击化学

中文:多巴胺-聚乙二醇-叠氮 英文:Dopamine-PEG-N3,DOPA-PEG-azide 存储条件:-20C,避光,避湿 用 途:仅供科研实验使用,不用于诊治 外观: 固体或粘性液体,取决于分子量 …

3D游戏引擎系统源码C++本科毕业设计,C++ 3D引擎源码,渲染系统使用的OpenGL 及 OpenGL ES

Effective 3D Engine 渲染系统使用的OpenGL 及 OpenGL ES,Windows上OpenGL ES使用AMD的ES模拟器。 环境部署 完整代码下载地址:3D游戏引擎系统源码C本科毕业设计 Win32环境配置 编辑器 将proj_win32/RenderSystem/gles_renderSystem/GLES/dll 中的d…

【web】微信小程序笔记小结(模板与配置)

来源:黑马程序员前端微信小程序开发教程 目录 I. WXML 模板语法 ① 数据绑定 ※※ 基本原则 ※※ 在 data 中定义数据 ※※ 在 WXML 中使用数据 ※※※※ Mustache 语法的格式 ※※※※ Mustache 主要应用场景 1)动态绑定内容 2)动…

测试篇(二): 如何合理的创建bug、bug的级别、bug的生命周期、跟开发产生争执怎么办

目录一、如何合理的创建bug二、bug的等级三、bug的生命周期四、和开发产生争执怎么办一、如何合理的创建bug 创建Bug的目的就是为了能够让其他人可以尝试复现 一个合格的bug应该包含以下一个要素: 发现问题的版本 例如Web程序对应的浏览器版本,或某个应…

AutoLISP 演练(一)

一、输入左下角点、矩形宽、矩形高后,自动的将图形依所给的条件画出二、变量约定本程序所需的AutoLisp功能函数(setq 变量名 变量值) ⬅ 设定变量值(getpoint [基点] [提示]) ⬅ 请求参考基点输入一个点坐标(getreal […

PyTorch中contiguous、view、Sequential、permute函数的用法

在pytorch中,tensor的实际数据以一维数组(storage)的形式存储于某个连续的内存中,以“行优先”进行存储。 1. tensor的连续性 tensor连续(contiguous)是指tensor的storage元素排列顺序与其按行优先时的元素…

【前端】列表页点进某个详情页,详情页可按顺序跳转到上一条/下一条的实现思路(2种)

需求概述 列表页展示列表,点击某个列表可以跳转到对应的详情页,点击上一页下一页可以按列表顺序跳转到对应详情页。比如点击列表2进入到详情2,我点上一页可以跳转到详情1,点击下一页可以跳转到详情3。难点:详情页如何…

Http客户端 Feign 的使用 (黑马springcloud笔记)

Feign基本使用 目录Feign基本使用一、Feign代替RestTemplate二、自定义配置三、Feign使用优化1. 底层优化2. 日志优化四、最佳实践方式一&#xff1a;继承方式二&#xff1a;抽取一、Feign代替RestTemplate 步骤&#xff1a; 引入依赖 <dependency><groupId>org.s…

UITableView内输入框(UITextView)换行

业务描述&#xff1a; UITableView内存在一个Cell&#xff0c;该Cell内有一输入框可以输入文字&#xff0c;超出输入框宽度则换行展示&#xff0c;即该Cell高度要增加 如图&#xff1a; 解决方法&#xff1a; 思路&#xff1a; 1:取到最大输入框宽度 2:计算当前文字宽度与最…

QT自定义控件工程结构框架

目录前言一、cutewidgets是什么&#xff1f;二、工程结构三、框架的工程配置1 cutewidgets.pro2 cutewidgets.pri2.1 cutewidgetsconfig.pri2.2 cutewidgetsfunctions.pri2.3 cutewidgetsbuild.pri四、源码1 src1.1 src.pro1.2 cutewidgets_global.h1.3 testedit1.4 扩展2 exam…

互联网中断检测技术窥览与讨论

前言&#xff1a; 如其他人造系统一样&#xff0c;互联网的运行也会出现异常甚至中断。仅在2022年就发生了多起影响重大的互联网中断事件&#xff1a;1月15日汤加火山喷发三个小时后&#xff0c;全国断网&#xff0c;和外界的所有电话与网络联系都无法接通&#xff1b;3月28日…

系统分析师案例必备知识点汇总---2023系列文章二

需求获取 1、需求获取的技术&#xff1a; 用户访谈 优点&#xff1a;具有良好的灵活性&#xff0c;有较宽广的应用范围。 缺点是&#xff1a;用户忙&#xff0c;信息量大&#xff0c;记录困难&#xff0c;需要沟通技巧。 问卷调查 优点&#xff1a;短时间内收集数据。 缺点…

Python aiohttp 库是否值得学?那必须要掌握呀

aiohttp 是一个基于 asyncio 的异步 HTTP 客户端/服务器库。它提供了一组用于编写高性能异步网络应用程序的工具&#xff0c;包括基于协程的客户端和服务器。 库的安装使用 pip install aiohttp Python aiohttp 库通过 aiohttp 搭建服务器aiohttp 路由aiohttp 中间件aiohttp 发…

【机器学习之模型融合】Blending混合法

前言 Stacking堆叠法基础知识&#xff1a;http://t.csdn.cn/dzAna 1、Blending的基本思想与流程&#x1f47f; Blending融合是在Stacking融合的基础上改进过后的算法。在之前的课程中我们提到&#xff0c;堆叠法stacking在level 1上使用算法&#xff0c;这可以令融合本身向着损…

好家伙,这几个隐藏功能,太香了

很多小伙伴可能被小畅的问题搞糊涂了&#xff0c;因为很多人只会在电脑上堆砌各种小应用&#xff0c;而忽略了Windows原有的实用功能。 而我们也千万不要小看这些功能&#xff0c;它们说不定能在关键时刻助你一臂之力&#xff0c;帮到你不少忙呢&#xff01; 那么今天小畅就为大…