如何通过高级流量管理提高 Kubernetes 的弹性
原文作者:Jenn Gile - F5 NGINX 产品营销经理
原文链接:如何通过高级流量管理提高 Kubernetes 的弹性
转载来源:NGINX 中文官网
NGINX 唯一中文官方社区 ,尽在 nginx.org.cn
编者按 —— 本文是以下系列博文中的一篇(共十篇):
- 生产级 Kubernetes 助您降低复杂性
- 如何通过高级流量管理提高 Kubernetes 的弹性(本文)
- 如何提高 Kubernetes 环境的可视性
- 使用流量管理工具保护 Kubernetes 的六种方法
- Ingress Controller 选型指南,第一部分:确定需求
- Ingress Controller 选型指南,第二部分:评估风险和技术前瞻性
- Ingress Controller 选型指南,第三部分:开源、默认和商用版本能力对比
- Ingress Controller 选型指南,第四部分:NGINX Ingress Controller 选项
- 如何选择 Service Mesh
- NGINX Ingress Controller 在动态 Kubernetes 云环境中的性能测试
您还可以免费下载整套博文集结成的电子书:《Kubernetes:从测试到生产》。
如何判断一家公司是否成功使用了现代应用开发技术呢?很简单,看看客户有没有在社交媒体上抱怨就知道了。客户可能会抱怨新片看不了,网银登不上去,购物车超时无法下单。
(我正要看一个我租借的电影,但是老是弹出“视频播放错误”的提示,并且网站帮助页面的网址也打不开。我的App是最新版本,我试过了退出重新登陆,也重启过我的网络电视。求个解决方案?)
即使他们没有公开抱怨,也不代表就没有问题。我们的一位客户 —— 一家大型保险公司曾告诉我们,如果他们未能在仅仅 3 秒内加载出主页,便会面临客户流失的问题。
用户对性能差或宕机问题的所有抱怨都指向了一个共同的元凶:缺乏弹性。微服务技术(包括容器和 Kubernetes)好就好在它能提高应用弹性,显著改善客户体验。为什么呢?这一切得从架构说起。
微服务架构与单体架构存在本质上的区别。打个比方,在老式的节日灯串中,只要有一个灯坏了,整串就都不亮了。如果不换灯泡,那就只能将整串丢掉。单体应用就像这种老式灯串一样,其组件紧密耦合在一起,一损俱损。
但是,照明行业和软件行业都发现了这个痛点。如果现代灯串上的某个灯泡发生故障,其他灯泡仍会继续照明。同样,对于设计良好的微服务应用而言,即使个别服务实例发生故障,整个应用也会继续运行。
Kubernetes 流量管理
容器因其轻便、可移植和易于扩展的特点,非常适合需要使用小型独立组件构建应用的场景,因而成为了微服务架构中颇受欢迎的一种选择。Kubernetes 已成为容器编排的事实标准,但若投入生产环境,还面临着许多挑战。要想增强 Kubernetes 应用的可控性和弹性,成熟的流量管理策略是一个重要因素,它能够让您控制服务而不是数据包,并动态地或使用 Kubernetes API 调整流量管理规则。流量管理在任何架构中都很重要,但对于高性能应用来说,有两个流量管理工具是必不可少的:流量控制和流量精分。
流量控制
流量控制(有时称为“流量路由”或“流量整形”)是指控制流量去向及其传输方式的行为。在生产环境中运行 Kubernetes 是必须的,因为它可以保护您的基础架构和应用免遭攻击和流量激增。在应用开发过程中,您需要采用“速率限制”和“断路”这两种技术。
-
用例:我不希望服务接收过多请求
解决方案:速率限制无论 HTTP 请求是恶意的(例如暴力破解密码和 DDoS 攻击)还是正常的(例如顾客蜂拥抢购),大量的 HTTP 请求都会导致服务瘫痪和应用崩溃。速率限制技术可限制用户在给定时间段内的请求数量。这些请求可能非常简单,例如访问网站主页的
GET
请求,或是登录页面上的POST
请求。举例来说,当受到 DDoS 攻击时,您可以使用速率限制将传入的请求速率限制为真实用户的合理数值。 -
用例:我希望避免出现级联故障
解决方案:断路当服务不可用或出现高延迟时,传入请求的超时时间以及客户端收到错误响应的时间可能很长。长超时可能会造成级联故障,即一个服务中断导致其他服务超时,最终引发整个应用故障。
断路器可监控服务故障,防止发生级联故障。当服务请求的失败次数超过预先设定的阈值时,将触发断路器,断路器一收到请求就向客户端返回错误响应,从而对服务进行限流。
断路器将持续拦截和拒绝请求,等过了指定的时长后再放行有限数量的请求以作测试。如果这些请求成功,断路器将停止限流。如果不成功,则开始重新计时,期间断路器继续拒绝请求。
流量精分
流量精分(有时称为“流量测试”)是流量控制的一个子类,目的是为了控制传入流量的比例,这些流量会被导向到在环境中同时运行的不同版本的后端应用(通常为当前的生产版本和新版本)。流量精分是应用开发周期中的重要一环,允许团队在不影响客户的情况下测试新特性和版本的功能和稳定性。实用的部署场景包括调试路由、灰度部署、A/B 测试 和 蓝绿部署。(业界对这四个术语的使用存在很大分歧,此处先按我们理解的定义来使用它们。)
-
用例:我准备在生产环境中测试新版本
解决方案:调试路由假设您有一个银行应用,现在您要为其添加一个信用评分功能。在进行客户测试之前,您可能想要看一下它在生产环境中的表现。调试路由允许您公开部署新功能,同时又向真正的用户“隐藏”它,根据session cookie、session ID 或group ID 等 7 层属性,只允许特定用户访问它。例如,您可以只允许拥有管理会话 cookie 的用户访问 —— 他们的请求将被路由到具有信用评分功能的新版本,而其他用户则继续访问稳定版。
-
用例:我需要确保新版本性能稳定
解决方案:灰度部署(又称“金丝雀部署”)金丝雀部署的概念来自一个历史悠久的采矿实践,当时的矿工将金丝雀装在笼子里带入矿井,一旦发现金丝雀中毒就紧急撤离,因此金丝雀是“瓦斯报警鸟”。在应用世界里,不会再有牺牲品了。灰度部署为测试新特性或新版本的稳定性提供了一种安全、敏捷的方法。典型的灰度部署是,先让绝大多数(比如 99%)用户使用稳定版,然后将一小部分用户(剩余的 1%)转移到新版本。如果新版本出现问题(例如崩溃或向客户端返回错误),您可以立即将测试用户转移回稳定版。如果新版本顺利运行,您可以一次性或以可控的方式逐步(更为常见)将用户从稳定版迁移到新版本。
-
用例:我需要了解新版本是否比当前版本更受客户的喜爱
解决方案:A/B 测试确认新特性在生产环境中运行无误后,您可能还希望了解客户对该特性的反馈,包括点击量、回头客比率或显式评分等关键性能指标 (KPI)。许多行业都使用 A/B 测试流程来衡量和比较用户行为,目的是确定不同产品或应用版本在客户群体中的受欢迎程度。在典型的 A/B 测试中,50% 的用户访问版本 A(当前的应用版本),剩余 50% 的用户访问版本 B(包含稳定的新功能的版本)。KPI 综合得分最高的版本将胜出。
-
用例:我希望在不停机的情况下将用户转移到新版本
解决方案:蓝绿部署现在,假设您的银行应用即将进行重大版本变更,那么,恭喜您!过去,版本升级通常意味着用户停机,因为您必须先从生产环境中移除旧版本,然后才能再推送新版本。但在当今竞争激烈的环境中,大多数用户都无法接受停机升级。蓝绿部署极大地减少甚至消除了升级的停机时间。您可以继续在生产环境中运行旧版本(蓝),同时在该生产环境中部署新版本(绿)。
大多数企业都不愿意将所有用户一次性从蓝色转移到绿色,毕竟,如果绿色版本发生故障怎么办?!解决方案是使用灰度部署,以最符合您的风险规避策略的增量方式转移用户。如果新版本是一场灾难,您只需敲击几下键盘,便可以轻松地将每个人转移回稳定版。
NGINX 如何助您一臂之力
大多数 Ingress controllers 和 service mesh(服务网格)都可以帮助您实现高级流量控制和分割。使用哪种技术取决于您的应用架构和用例。例如,Ingress controller 适用于以下三种场景:
- 您的应用只有一个端点,就像您迁移到 Kubernetes 的简单应用或单体应用一样。
- 集群中没有 service 到 service 的通信。
- 集群中有 service 到 service 的通信,但您还没有使用 service mesh。
如果您的部署复杂到要使用 service mesh 的地步,一个常见的用例是通过分割服务流量来测试或升级各个微服务。举例来说,您可能想在移动前端的两个不同版本的地理位置微服务 API 之间进行灰度部署。
然而,有些 Ingress controller 和 service mesh 在设置流量精分时不仅非常耗时,而且容易出错,原因有很多:
- 不同厂商的 Ingress controller 和 service mesh 具有不同的 Kubernetes 功能实施方式。
- Kubernetes 不是专为管理和理解 7 层流量而生。
- 有些 Ingress controller 和 service mesh 不支持复杂的流量管理。
借助 NGINX Ingress Controller 和 NGINX Service Mesh 您可在几秒钟内轻松配置稳健的流量路由和分割策略。
NGINX Ingress 资源和 SMI 规范助您简化配置
以下 NGINX 功能简化了配置流程:
-
面向 NGINX Ingress Controller 的 NGINX Ingress 资源 —— 虽然标准的 Kubernetes Ingress 资源可简化 SSL/TLS 终止、HTTP 负载均衡和 7 层路由的相关配置,但它不具备断路、A/B 测试和蓝绿部署所需的定制功能。因此,非 NGINX 用户必须求助于注释、ConfigMap 和自定义模板,但它们都缺乏细粒度控制,并且不安全、易出错且难使用。
NGINX Ingress Controller 自带 NGINX Ingress 资源,作为标准 Ingress 资源(同时也支持该资源)的替代方案。该资源采用了一种原生、类型安全的缩进式配置风格,可简化 Ingress 负载均衡的实施。对现有 NGINX 用户来说,NGINX Ingress 资源还有一个额外的好处:它们可以简化非 Kubernetes 环境中负载均衡配置的再利用,从而支持所有 NGINX 负载均衡器使用相同的负载均衡配置。
-
遵循 SMI 的 NGINX Service Mesh —— NGINX Service Mesh 实施了 Service Mesh Interface (SMI) —— SMI 是一个规范。定义了在 Kubernetes 上运行的 Service Mesh 的标准接口,具有
TrafficSplit
、TrafficTarget
和HTTPRouteGroup
。等类型化资源。借助标准的 Kubernetes 配置方法,NGINX Service Mesh 和 NGINX SMI 扩展程序可简化流量精分策略(如灰度部署)的部署,并最大限度地减少对生产流量的中断。以下是使用 NGINX Service Mesh 定义灰度部署的示例:apiVersion: split.smi-spec.io/v1alpha2 kind: TrafficSplit metadata: name: target-ts spec: service: target-svc backends: - service: target-v1-0weight: 90 - service: target-v2-0weight: 10
我们的教程《使用流量精分的部署》介绍了利用流量精分的部署模式示例,包括灰度部署和蓝绿部署。
借助高级定制实现更复杂的流量控制和流量精分
NGINX 的以下功能能够以更高级的方式简化流量控制和流量精分:
-
面向灰度部署的键值存储 —— 当您执行 A/B 测试或蓝绿部署时,您可能希望按特定的增量(例如 0%、5%、10%、25%、50% 和 100%)将流量过渡到新版本。大多数工具都需要很多人工操作,因为您必须为每个增量编辑百分比并重新加载配置文件。面对不小的工作量,您可能会冒险直接从 5% 过渡到 100%。然而,借助基于 NGINX Plus 的 NGINX Ingress Controller,您可以利用键值存储更改百分比,且无需重载配置文件。
-
通过 NGINX Ingress Controller 断路 —— 先进的断路器能够更快速地检测故障和故障转移,甚至针对不健康的上游服务激活定制的格式化错误页面,从而帮助您节省时间和提高弹性。举例来说,搜索服务的断路器可能会返回一组格式正确但内容为空的搜索结果。为了达到这种效果,基于 NGINX Plus 的 NGINX Ingress Controller 采用了主动健康检查,主动监控 TCP 和 UDP 上游服务器的健康状况。由于监控是实时的,您的客户端遭遇应用错误的概率将大大降低。
-
通过 NGINX Service Mesh 断路 —— NGINX Service Mesh 断路器规范具有三个自定义字段:
errors
—— 断路器触发前的错误数timeoutSeconds
—— 断路器触发前发生错误的窗口,以及断路器关闭前的等待时间fallback
—— o断路器触发后,流量被重新路由到的 Kubernetes 服务的名称和端口
errors
和timeoutSeconds
是标准的断路器功能,而fallback
支持您定义备份服务器,进一步提高了弹性。如果您的备份服务器响应是独一无二的,它们可以作为集群故障的早期指示器,让您第一时间开启故障排除。
借助仪表盘解读流量精分结果
现在,您已实现了流量精分……接下来该做什么呢?接下来我们应该分析流量精分结果。这可能是最难的一个环节,因为许多企业都缺乏对 Kubernetes 流量和应用运行情况的关键洞察。NGINX 可通过 NGINX Plus 仪表盘 和预构建的 Grafana 仪表盘,以图示的形式展示 Prometheus Exporter 暴露的指标,从而帮助您更轻松地获取洞察信息。如欲详细了解如何提高可视性、获取洞察,请阅读我们的博文 《如何提高 Kubernetes 环境的可视性》。
NGINX 助您轻松掌控微服务
基于 NGINX Plus 的 NGINX Ingress Controller 提供 30 天免费试用版,其中包括可以保护容器化应用的 NGINX App Protect。
如欲试用 NGINX 开源版 NGINX Ingress Controller,您可以获取发布源代码,或者从 DockerHub下载预构建的容器。
您可前往 f5.com 下载始终免费的 NGINX Service Mesh。
NGINX 唯一中文官方社区 ,尽在 nginx.org.cn
更多 NGINX 相关的技术干货、互动问答、系列课程、活动资源: 开源社区官网 | 微信公众号
相关文章:

如何通过高级流量管理提高 Kubernetes 的弹性
原文作者:Jenn Gile - F5 NGINX 产品营销经理 原文链接:如何通过高级流量管理提高 Kubernetes 的弹性 转载来源:NGINX 中文官网 NGINX 唯一中文官方社区 ,尽在 nginx.org.cn 编者按 —— 本文是以下系列博文中的一篇(…...
解决Springboot集成RabbitMQ不自动生成队列的问题
1.RabbitMQ消息的消费端服务 RabbitMQ懒加载模式, 需要配置消费者监听才会创建 RabbitListener(queues "test.queue")另外一种方式(若Mq中无相应名称的队列,会自动创建Queue),改为如下 RabbitListener(queuesToDeclare { Queue(value "test.queu…...
【数据结构】Decreasing String—CF1886C
Decreasing String—CF1886C 代码我现在还不是很理解,群友说是单调栈。 C o d e Code Code #include <bits/stdc.h> #define int long long #define sz(a) ((int)a.size()) #define all(a) a.begin(), a.end() using namespace std; using PII pair<int…...

【广州华锐互动】钢厂铸锻部VR沉浸式实训系统
随着科技的不断进步,虚拟现实(VR)技术已成为当今最具潜力的技术之一。在钢铁行业中,VR虚拟仿真实训已经被广泛应用于培训和教育领域,特别是钢铁厂铸锻部,通过VR技术,可以大大提高培训效率,降低培训成本&…...
Python中执行SQL报错unsupported format character ‘Y‘ (0x59) at index 34
Python中执行SQL报错unsupported format character ‘Y’ (0x59) at index 34 from sqlalchemy import create_engine engine_ts create_engine(mysqlpymysql://root:MySQL123456127.0.0.1:3306/dbmysql?charsetutf8&use_unicode1) sql "select date_format(t.tr…...

云数据库(林子雨慕课课程)
文章目录 6.云数据库6.1 云数据库概述6.2 云数据库产品6.3 UMP系统6.3.1 UMP系统概述6.3.2 UMP系统架构6.3.3 UMP系统功能 6.4 Amazon云数据库6.4.1 Amazon和云计算的渊源6.4.2 Amazon AWS6.4.3 AWS平台上的云数据库6.5 微软云数据库SQL Azure 6.云数据库 6.1 云数据库概述 云…...
2023-10-10 python-从一组颜色中找到与指定颜色最接近的颜色-{K-D树}-记录
摘要: 2023-10-10 python-从一组颜色中找到与指定颜色最接近的颜色-{K-D树}-记录 相关文档: 如何在颜色表中找到与当前颜色最接近的颜色? - 糯米PHP https://zh.wikipedia.org/wiki/%E6%9C%80%E9%82%BB%E8%BF%91%E6%90%9C%E7%B4%A2 https://zh.wikipedia.org/wiki/…...
使用C++实现DNS欺骗攻击
文章为花钱购买转载,但我测试并未成功!!! 使用C实现DNS欺骗攻击-CSDN博客 使用C实现DNS欺骗攻击 DNS劫持是一种常见的网络攻击方式,通过篡改DNS响应数据,使得用户访问的网站被重定向到攻击者指定的恶意站…...
C#WPF属性元素语法应用实例
本文介绍C#WPF属性元素语法应用实例 一、属性元素语法 对于对象元素的某些属性,无法使用特性语法(比如:Background="Blue"),因为无法在特性语法的引号和字符串限制内充分地表达提供属性值所必需的对象或信息。 对于这些情况,可以使用另一个语法,即属性元素语…...
el-select应用虚拟列表,避免过多数据导致浏览器卡死
el-select: element-ui组件中的select下拉选择组件,支持单选、多选等 虚拟列表: 虚拟列表是一种优化技术,用于处理大型列表。在传统的列表中,当用户滚动到底部时,列表会加载所有的数据,这可能导…...
ES6之函数的扩展
函数的扩展 文章目录 函数的扩展1:与解构赋值默认值结合使用2:参数默认值空对象2.1 案例一2.2 案例二2.3 案例三2.4 案例四 3:undefined null参数默认值的区别4:函数length5:作用域5.1 全局变量5.2:局部变量…...

【PPT制作】基础篇
文章目录 一、PPT制作必要的基础设置1.1 自动保存1.2 字体嵌入1.3 撤销步数1.4 图像大小和质量 二、必备快捷键三、设计四原则四、总结 ヾ(๑╹◡╹)ノ" 没有坚持的努力,本质上并没有多大意义ヾ(๑╹◡╹)ノ" 一、PPT制作必要的基础…...

尚硅谷CSS学习笔记
什么是css css(层叠样式表) 它是一种标记语言,用于给HTML结构设置样式。简单理解css可以美化html,实现结构与样式的分离。 <link rel"shortcut icon" href"favicon.ico" type"image/x-icon"&g…...

MYSQL的日志管理
MySQL中有几种类型的日志记录,分别用于记录不同的操作和事件。以下是MySQL中常见的日志类型 错误日志 错误日志是 MySQL 中最重要的日志之一,它记录了当 mysqld 启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据…...

微信小程序在TS模板下引入TDesign组件
介绍 TDesign 是腾讯官方出品的一款微信小程序组件库。本文介绍如何在新建ts空白模板下引入TDesign库 步骤 新建一个空白项目,这里可以选择TS-基础模板 新建项目目录结构如图所示: 注意这里其实小程序的文件都存放在miniprogram文件夹下,…...

alsa pcm接口之pcm设备的状态STATE
应用和库之间的协作: ALSA pcm api设计使用状态来确定应用程序和库之间的通信阶段,实际的状态可以被决定通过使用snd_pcm_state调用,下面列举出来状态: SND_PCM_STATE_OPEN: 表示pcm设备被打开的状态,使用了snd_pcm_open()之后进入该状态,并且让snd_pcm_hw_params()调用失败后,…...

【UE】在游戏运行时,通过选择uasset来生成静态网格体
目录 主要流程 步骤 一、创建用于包含静态网格体的Actor蓝图 二、按钮点击事件 效果 主要流程 用户点击按钮后产生一个文件对话框,用户通过文件对话框选择指定的文件夹,我们获取到这个文件夹路径后处理成“按路径获取资产”节点所需的输入&#x…...

vue中PC端使用高德地图 -- 实现搜索定位、地址标记、弹窗显示定位详情
PC端高德地图使用步骤: 1、注册并登录高德开放平台获取 2、安装高德依赖(amap-jsapi-loader) 3、初始化地图 4、首次打开地图获取当前定位并标记 5、根据已有地址自动定位到指定地址并标记 6、新增、清除标记及自定义信息窗体 7、鼠标点击地…...

服务器数据恢复-DS5300存储raid5硬盘出现坏道离线的数据恢复案例
服务器数据恢复环境: 某单位一台DS5300存储,1个主机4个扩展柜,组建了2组RAID5(一组27块硬盘,一组23块盘)。27块盘的那组RAID5阵列存放Oracle数据库文件,存储系统一共分了11个卷。 服务器故障&a…...

K8S存储总结持久化存储解决方案(以NFS为例)
目录 K8S存储 一、emptydir 1. emptydir是什么 2. emptydir例子 二、hostpath hostpath 是什么 hostpath 例子 弊端 三、持久化存储 1.Persistent Volume(PV) 2.Persistent Volume Claim(PVC) 3.PV/PVC结合NFS使用实践(持久存储) 1. NFS服务…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...

恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...