BLOG | NGINX

如何通过高级流量管理提高 Kubernetes 的弹性

NGINX-Part-of-F5-horiz-black-type-RGB
Jenn Gile 缩略图
Jenn Gile
Published March 29, 2021

编者按 —— 本文是以下系列博文中的一篇(共十篇):

 

  1. 生产级 Kubernetes 助您降低复杂性
  2. 如何通过高级流量管理提高 Kubernetes 的弹性(本文)
  3. 如何提高 Kubernetes 环境的可视性
  4. 使用流量管理工具保护 Kubernetes 的六种方法
  5. Ingress Controller 选型指南,第一部分:确定需求
  6. Ingress Controller 选型指南,第二部分:评估风险和技术前瞻性
  7. Ingress Controller 选型指南,第三部分:开源、默认和商用版本能力对比
  8. Ingress Controller 选型指南,第四部分:NGINX Ingress Controller 选项
  9. 如何选择 Service Mesh
  10. 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 综合得分最高的版本将胜出。

  • 用例:我希望在不停机的情况下将用户转移到新版本
    解决方案:蓝绿部署

    现在,假设您的银行应用即将进行重大版本变更,那么,恭喜您!过去,版本升级通常意味着用户停机,因为您必须先从生产环境中移除旧版本,然后才能再推送新版本。但在当今竞争激烈的环境中,大多数用户都无法接受停机升级。蓝绿部署极大地减少甚至消除了升级的停机时间。您可以继续在生产环境中运行旧版本(蓝),同时在该生产环境中部署新版本(绿)。

    大多数企业都不愿意将所有用户一次性从蓝色转移到绿色,毕竟,如果绿色版本发生故障怎么办?!解决方案是使用灰度部署,以最符合您的风险规避策略的增量方式转移用户。如果新版本是一场灾难,您只需敲击几下键盘,便可以轻松地将每个人转移回稳定版。

    Blue-green deployment

NGINX 如何助您一臂之力

大多数 Ingress controllersservice 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 ControllerNGINX Service Mesh 您可在几秒钟内轻松配置稳健的流量路由和分割策略。请观看 NGINX 专家的现场演示,并继续阅读下文,了解我们如何通过简化的配置、进阶的自定义以及改进的可视化帮助您节省时间。

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 的标准接口,具有 TrafficSplitTrafficTargetHTTPRouteGroup。等类型化资源。借助标准的 Kubernetes 配置方法,NGINX Service Mesh 和 NGINX SMI 扩展程序可简化流量精分策略(如灰度部署)的部署,并最大限度地减少对生产流量的中断。以下是使用 NGINX Service Mesh 定义灰度部署的示例:

    apiVersion: split.smi-spec.io/v1alpha2kind: TrafficSplit
    metadata:
    name: target-ts
    spec:
    service: target-svc
    backends:
    - service: target-v1-0
        weight: 90
    - service: target-v2-0
        weight: 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 服务的名称和端口

    errorstimeoutSeconds 是标准的断路器功能,而 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。

 


"This blog post may reference products that are no longer available and/or no longer supported. For the most current information about available F5 NGINX products and solutions, explore our NGINX product family. NGINX is now part of F5. All previous NGINX.com links will redirect to similar NGINX content on F5.com."