作者:涂鸦

背景

跟着云原生技术不断遍及,越来越多的事务运用开始向云原生架构改变,凭借容器办理渠道 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 的全链路灰度能力

流量染色是指咱们能够在恳求的源头上对流量进行染色,前端在建议恳求时根据用户信息或者渠道信息的不同对流量进行打标。假如前端无法做到,咱们也能够在微服务网关上对匹配特定路由规矩的恳求动态增加流量标识。此外,流量在链路中流经灰度节点时,假如恳求信息中不含有灰度标识,需求自动为其染色,接下来流量就能够在后续的流经过程中优先拜访服务的灰度版本。

为了完成上面全链路灰度三个要素,MSE 微服务管理提出了泳道和泳道组的概念。举一个比如,咱们假定运用的架构由 Nginx-Ingress 以及后端的微服务架构(Spring Cloud)来组成,后端调用链路有3跳,交易中心,产品中心,库存中心,客户端经过客户端或者是 H5 页面来拜访后端服务,它们经过 Nacos 注册中心做服务发现。

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

  1. 经过设置流量规矩对所需流量进行’染色’,’染色’流量会路由到灰度机器。

  2. 灰度流量携带灰度标往下游传递,构成灰度专属环境流量泳道,无灰度环境运用会默许挑选未打标的基线环境。

进入到 MSE 控制台的泳道的界说界面里,咱们也能够发现,其对应了全链路灰度完成的三要素:

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

快速玩转 Ingress 全链路灰度

咱们以 ACK Nginx-Ingress 全链路为例,快速地体会如何凭借 MSE 微服务管理,完成 Ingress 的全链路流量灰度,整体的过程如下:

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

咱们首要描述下如何将 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 的全链路灰度能力

其他过程均和 Java 运用的全链路灰度过程一致,具体能够参考以下这篇文章:

help.aliyun.com/document_de…

待咱们装备好泳道规矩后,咱们打对应特征的流量就会流入的对应的泳道中去,咱们能够在 MSE 控制台调查灰度的情况,以便验证全链路灰度功能是不是生效了:

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

MSE Ingress 是 MSE 团队自主研制的 Ingress 完成,根据 MSE 云原生网关(一起兼容 Ingress 和 Istio)替代 Nginx 来完成流量托管,不仅有着更强大的功能,也有着天然的流量管理与管控基因,其全链路灰度的玩法与 ACK Nginx Ingress 基本上一致,具体过程能够参考以下这篇文章:

help.aliyun.com/document_de…