首页 > 其他分享 >构建基于 Ingress 的全链路灰度能力

构建基于 Ingress 的全链路灰度能力

时间:2022-11-30 18:05:33浏览次数:67  
标签:Ingress 服务 流量 灰度 链路 MSE

作者:涂鸦


背景


随着云原生技术不断普及,越来越多的业务应用开始向云原生架构转变,借助容器管理平台 Kubernetes 的不可变基础设施、弹性扩缩容和高扩展性,助力业务迅速完成数字化转型。其中,集群入口流量管理方式在云原生技术演进过程中逐步通用化、标准化,用户通过 Kubernetes 定义的 Ingress 资源来管理外部访问集群内部服务的方式。


微服务架构下,有一些需求开发,涉及到微服务调用链路上的多个微服务同时发生了改动,通常每个微服务都会有灰度环境或分组来接受灰度流量,我们希望通过进入上游灰度环境的流量,也能进入下游灰度的环境中,确保1个请求始终在灰度环境中传递,即使这个调用链路上有一些微服务没有灰度环境,这些应用请求下游的时候依然能够回到灰度环境中。通过 MSE 提供的全链路灰度能力,可以在不需要修改任何您的业务代码的情况下,能够轻松实现上述能力。


Kubernetes 网关概述


Kubernetes 集群对外暴露流量的方式主要分为三种,Node Port、LoadBalancer 以及 Ingress。


对于 Node Port 而言,实现了朴素的端口和后端 Pod 的一一对应,不仅存在单点问题,而且由于端口范围的限制,一旦后端的服务数量上升,会出现无端口可用的情况;而对于 LoadBalancer 来说,其解决 Node Port 的单点问题和端口数量的问题,奈何它是一个纯粹的流量转发资源,并没有路由配置能力,也无法管理后端众多的 Service 应用,所以 Ingress 的诞生就是必然的结果。Ingress 不仅有这天然的路由定义的能力,也扮演者后端众多 Service 管理者的角色。不过这里需要提一句,大众所熟知的 Ingress 资源只是单纯的一个 路由 Resource 定义,真正的实现者和执行者其实是具体的 Ingress 标准实现,包括大家所熟知的 Nginx Ingress Controller 都属于此列。


构建基于 Ingress 的全链路灰度能力_微服务


在阿里云 ACK 平台上,有着众多 Ingress 的实现方式,其中包括 Nginx-Ingress 、ALB-Ingress 以及最近推出的 MSE-Ingress,本文将讲述一种较为通用的基于 MSE 微服务治理的统一方案,在 Ingress 网关上实现全链路流量灰度。


如何实现在 Ingress 上实现全链路流量灰度


首先我们要知道在实现全链路灰度时所必须具备的要素,然后再在 Ingress 环境中实现这些要素,就能够实现在 Ingress 网关下的全链路流量灰度。由历史经验可知,我们这里主要靠标签路由、节点打标以及流量染色这三个要素去实现。


标签路由通过对服务下所有节点按照标签名和标签值不同进行分组,使得订阅该服务节点信息的服务消费端可以按需访问该服务的某个分组,即所有节点的一个子集。服务消费端可以使用服务提供者节点上的任何标签信息,根据所选标签的实际含义,消费端可以将标签路由应用到更多的业务场景中。


节点打标,如果是在使用Kubernetes Service作为服务发现的业务系统中,服务提供者通过向ApiServer提交Service资源完成服务暴露,服务消费端监听与该Service资源下关联的Endpoint资源,从Endpoint资源中获取关联的业务Pod资源,读取上面的Labels数据并作为该节点的元数据信息。所以,我们只要在业务应用描述资源Deployment中的Pod模板中为节点添加标签即可。​


构建基于 Ingress 的全链路灰度能力_链路_02


流量染色是指我们可以在请求的源头上对流量进行染色,前端在发起请求时根据用户信息或者平台信息的不同对流量进行打标。如果前端无法做到,我们也可以在微服务网关上对匹配特定路由规则的请求动态添加流量标识。此外,流量在链路中流经灰度节点时,如果请求信息中不含有灰度标识,需要自动为其染色,接下来流量就可以在后续的流转过程中优先访问服务的灰度版本。


为了实现上面全链路灰度三个要素,MSE 微服务治理提出了泳道和泳道组的概念。举一个例子,我们假设应用的架构由 Nginx-Ingress 以及后端的微服务架构(Spring Cloud)来组成,后端调用链路有3跳,交易中心,商品中心,库存中心,客户端通过客户端或者是 H5 页面来访问后端服务,它们通过 Nacos 注册中心做服务发现。


构建基于 Ingress 的全链路灰度能力_灰度_03


1) 通过设置流量规则对所需流量进行'染色','染色'流量会路由到灰度机器。


2) 灰度流量携带灰度标往下游传递,形成灰度专属环境流量泳道,无灰度环境应用会默认选择未打标的基线环境。


进入到 MSE 控制台的泳道的定义界面里,我们也可以发现,其对应了全链路灰度实现的三要素:


构建基于 Ingress 的全链路灰度能力_阿里云_04


快速玩转 Ingress 全链路灰度


我们以 ACK Nginx-Ingress 全链路为例,快速地体验如何借助 MSE 微服务治理,实现 Ingress 的全链路流量灰度,总体的步骤如下:


构建基于 Ingress 的全链路灰度能力_阿里云_05


我们主要描述下如何将 ACK Ingress Controller 接入到 MSE 微服务中去,只需在 Nginx Ingress Controller 的 ConfigMap 增加下面两项配置即可:


  • use-mse: true
  • mse-app-name: ingress-canary-test 


mse-app-name 为自定义的名称,此时我们就可以在 MSE 控制台上看到名为 ingress-canary-test 的阿里云 Ingress 入口了:​


构建基于 Ingress 的全链路灰度能力_微服务_06


其余步骤均和 Java 应用的全链路灰度步骤一致,具体可以参考以下这篇文章:


​https://help.aliyun.com/document_detail/460275.html​


待我们配置好泳道规则后,我们打对应特征的流量就会流入的对应的泳道中去,我们可以在 MSE 控制台观察灰度的情况,以便验证全链路灰度功能是不是生效了:


构建基于 Ingress 的全链路灰度能力_链路_07


MSE Ingress 是 MSE 团队自主研发的 Ingress 实现,基于 MSE 云原生网关(同时兼容 Ingress 和 Istio)取代 Nginx 来实现流量托管,不仅有着更强大的性能,也有着天然的流量治理与管控基因,其全链路灰度的玩法与 ACK Nginx Ingress 基本上一致,具体步骤可以参考以下这篇文章:


​https://help.aliyun.com/document_detail/460375.html​

标签:Ingress,服务,流量,灰度,链路,MSE
From: https://blog.51cto.com/u_13778063/5900079

相关文章

  • 数据链路层 _ 广播信道
    基本概念局域网(LAN)局域网(LAN)是指:由两个或两个以上相连的计算机组成,通常包含在较小地理区域内的网络。特点:网络为一个单位所拥有;地理范围和站点数目均有限。优......
  • nginx-ingress实现二级目录
    需求说明内网后端地址:http://10.10.246.29:9000如图:外网域名:https://devhtk.ntmaorong.com/要求:https://devhtk.ntmaorong.com/minio/--->访问http://10.10.246.2......
  • 如何通过链路追踪进行定时任务诊断
    作者:千习背景简介什么是定时任务定时任务是业务应用系统中存在定时周期性运行的业务逻辑。由于其运行于后端进程中往往存在执行状态和执行链路的不可见性《常见定时任务......
  • 如何通过链路追踪进行定时任务诊断
    作者:千习背景简介什么是定时任务定时任务是业务应用系统中存在定时周期性运行的业务逻辑。由于其运行于后端进程中往往存在执行状态和执行链路的不可见性《常见定时任务技术......
  • 第八章 Service和Ingress
    1Service资源的基础应用1.1创建Service资源创建Service对象的常用方法有两种:一是直接使用"kubectlexpose"命令;另一种是使用资源配置文件,它与此前使用的资源清单文......
  • Asp.Net Core&Jaeger实现链路追踪
    前言随着应用愈发复杂,请求的链路也愈发复杂,微服务化下,更是使得不同的服务分布在不同的机器,地域,语言也不尽相同。因此需要借助工具帮助分析,跟踪,定位请求中出现的若干问题,以......
  • 06-2-不容闪失的灰度发布设计【双元】(1)
                         ......
  • 程序员面试干货:漫谈计算机网络:数据链路层 ----- 数据链路路在何方? --从点对点数据传
    面试答不上?计网很枯燥?听说你学习计网每次记了都会忘?不妨抽时间和我一起多学学它......
  • 图像的灰度变换——图像旋转、图像的反色处理、对比度拉伸
    这次我们要处理的是对图像进行旋转操作,具体要求,如下:    自定义一个图像的仿射变换函数,用于旋转给定的输入图像,该函数的输入参数包括处理前的图像和旋转角度。输入的......
  • opengl显示16位灰度图像
    最近这几个月一直在思索一个问题,就是如何使用opengl显示16位的灰度图像。在寻找实现方法的过程中,一个主要的问题是对glsl不理解。目前对glsl有了一点初步的认识。现在的......