介绍:如何实现灰度、可观察、回滚安全生产的三斧能力,满足业务快速发展条件下快速迭代、审慎验证的诉求。企业在深化微服务过程中必须面对的问题。现在云原生流行起来,针对这个问题也出现了一些新的思路和解决方案。作者:奎宇,石棉如何实现灰度、可观察、回滚安全生产三轴能力,满足业务快速发展条件下的快速迭代和精细验证的需求,是企业在安全生产过程中的必经之路深化微服务面临的问题。现在云原生流行起来,针对这个问题也出现了一些新的思路和解决方案。KubernetesIngress网关我们先从Ingress网关说起,通过Ingress来配置路由转发。Kubernetes集群内部的网络与外部是隔离的,即集群内部的服务无法在Kubernetes集群外部直接访问。Kubernetes集群内部如何向外部用户提供服务?Kubernetes社区中存在三种方案:NodePort、LoadBalancer和Ingress。下图是这三种方案的对比:通过对比可以看出Ingress是一种更适合业务使用的方式,可以基于它做更复杂的二次路由分发,也是目前主流的选择用户。随着微服务在云原生应用中的深入,用户需要面对复杂的路由规则配置、对多种应用层协议(HTTP、HTTPS、QUIC等)的支持、服务访问的安全性和流量的可观察性。Kubernetes希望通过Ingress来规范集群入口流量的规则定义,但实际业务实现需要的功能远远超过Ingress提供的功能。Ingress-Provider类还在Ingress标准下执行各种扩展。各种Ingress-Provider如何路由转发我简单介绍一下Kubernetes下各种Ingress网关的实现以及如何配置路由转发规则。NginxIngressNginxIngress由资源对象Ingress、IngressController和Nginx组成。IngressController用于将Ingress资源实例组装成Nginx配置文件(nginx.conf),并重新加载Nginx使修改后的配置生效。Ingress-nginx是Kubernetes社区提供的Ingress控制器。它最容易部署,但由于性能限制,其功能比较单一,更新Nginx配置需要重新加载。1、基于NginxIngressController配置路由转发基于部署了NginxIngressController组件的Kubernetes集群,可以实现路由转发功能,可以根据域名和路径进行路由转发,灰度流量管理基于Ingress的Annotations也可以用简单的规则来进行,比如权重,Header等。在目前的趋势中,NginxIngress仍然是应用最广泛的。ALBIngress1、ALB产品介绍应用负载均衡器ALB(ApplicationLoadBalancer)是阿里云推出的专门针对HTTP、HTTPS、QUIC等应用层负载场景的负载均衡服务。具有超强弹性和大规模七层流量处理能力。.2.ALB特性弹性自动伸缩:ALB同时提供域名和VIP(VirtualIPaddress),支持将流量分发到多台云服务器扩展应用系统的服务能力,提高应用的可用性系统通过消除单点故障。ALB允许您自定义可用区的组合,支持可用区之间的弹性伸缩,避免单个可用区出现资源瓶颈。高级协议:支持ALB,支持应用传输协议QUIC。在实时音视频、互动直播、游戏等移动互联网应用场景中,访问速度更快,传输链路更安全可靠。ALB还支持gRPC框架,实现海量微服务之间高效的API通信。先进的基于内容的路由:ALB支持基于HTTP头、cookie和HTTP请求方法的多种规则来识别特定的业务流量并将其转发到不同的后端服务器。同时,ALB还支持重定向、重写、自定义HTTPS头等高级操作。安全加持》ALB自带分布式拒绝服务DDoS(DistributedDenialofService)防护,一键集成Web应用防火墙(WebApplicationFirewall,简称WAF)。同时ALB支持全链路HTTPS加密,可实现与客户端或后端、端服务器之间的HTTPS交互;支持TLS1.3等高效安全的加密协议,面向加密敏感业务,满足Zero-Trust新一代安全技术架构要求;支持预制安全策略,可以自定义安全策略云原生应用:在云原生时代,PaaS平台将下沉到基础设施中,成为云端的一部分。随着云原生的逐渐成熟,很多行业如作为互联网、金融、企业,在创建新业务时都会选择云原生部署,或者对现有业务进行云原生部署。生化转化。ALB与阿里云Kubernetes容器服务(简称ACK)深度集成,是阿里云官方的云原生Ingress网关。弹性灵活的计费:ALB使用弹性IP地址(ElasticIPAddress,简称EIP)和共享带宽提供公网能力,实现灵活的公网计费;同时,采用更先进的基于容量单位(LCU)的更适合弹性业务高峰的定价方案。3、基于ALBIngressController配置路由转发ALBIngressController通过APIServer获取Ingress资源的变化,动态生成AlbConfig,然后依次创建ALB实例、监听器、路由转发规则、后端服务器组。Kubernetes中的Service、Ingress、AlbConfig有如下关系:Service是后端真实的Service抽象,一个Service可以代表多个相同的后端服务。Ingress是一个反向代理规则,用来指定应该将HTTP/HTTPS请求转发到哪个Service。例如:根据请求中不同的Host和URL路径,让请求转发到不同的服务。AlbConfig是ALBIngressController提供的CRD资源。使用AlbConfigCRD配置ALB实例和侦听器。一个AlbConfig对应一个ALB实例。ALBIngress基于阿里云的应用负载均衡ALB(ApplicationLoadBalancer)提供更强大的Ingress流量管理方式,兼容NginxIngress,能够处理复杂的业务路由和证书自动发现,支持HTTP、HTTPS和QUIC协议,完全满足云原生应用场景对超弹性和大规模七层流量处理能力的需求。APISIXIngressAPISIXIngress与KubernetesIngressNginx的区别在于,APISIXIngress使用ApacheAPISIX作为实际承载业务流量的数据平面。如下图所示,当用户请求特定的服务/API/网页时,整个业务流量/用户请求通过外部代理传输到Kubernetes集群,然后通过APISIXIngress进行处理。从上图可以看出,APISIXIngress分为两部分。其中一部分是APISIXIngressController,它将作为控制平面完成配置管理和分发。APISIXProxyPod的另一部分负责承载业务流量,通过CRD(CustomResourceDefinitions)实现。除了支持自定义资源,ApacheAPISIXIngress还支持原生的KubernetesIngress资源。1、基于APISIXIngressController的应用路由如上图所示,我们部署了一个APISIXIngressController组件集群,可以实现基于Ingress资源和自定义资源ApisixRoute的路由配置。controller监听资源变化事件,调用apisix-adminapi进行规则的持久化存储。流量经过APISIX配置的LoadBalancer类型的Servicegateway,从ETCD同步配置,将请求转发给upstream。APISIXIngressController基于ApacheAPISIX,支持Kubernetes中Ingress资源的路由配置,也支持通过自定义资源接入APISIX的路由、插件、upstream等资源配置。支持路由规则动态配置,插件热插拔,路由规则支持更丰富。APISIX云原生网关还可以提供可观察性、故障注入、链路跟踪等能力。使用高可靠的ETCD集群作为配置中心存储和分发apisix配置。MSE云原生网关IngressMSE云原生网关是阿里云推出的下一代网关。结合传统流量网关和微服务网关,为用户提供精细化的流量管理能力,同时降低50%的资源成本,支持ACK容器。Services、Nacos、Eureka、固定地址、FaaS等多种服务发现方式,支持多种鉴权登录方式,快速构筑安全防线,提供指标监控、日志分析、链路追踪等全方位、多视角的监控体系.1、基于MSE云原生网关IngressController的应用路由上图是MSE云原生网关在多集群模式下管理业务应用流量的应用场景。MSE云原生网关与阿里云容器服务ACK深度融合,自动发现服务及对应端点信息,秒级动态生效。用户只需要在MSE管控平台上简单关联对应的KubernetesACK集群,在路由管理模块中配置路由,即可对外暴露ACK中的服务。同时可以根据集群维度进行流量分发和故障转移。此外,用户还可以对服务路由实施额外的策略,如普通限流、跨域或重写等。MSE云原生网关提供的流量管理能力与具体的服务发现方式解耦。无论后端服务采用何种服务发现方式,云原生网关均采用统一的交互体验,降低上手门槛,满足用户业务日益增长的流量管理需求。上诉。以上介绍了NginxIngress、ALBIngress、APISIXIngress、MSECloudNativeGatewayIngress这五个Ingress的路由转发和配置。我们可以根据自己的业务需求和复杂度来选择合适的Ingress实现。假设我们已经配置好Ingress路由转发,那么在多应用环境下如何简单玩全链路灰度呢?基于Ingress实现全链路流量灰度基于全链路灰度的实践,我们提出了“泳道”的概念。当然,这个概念在分布式软件领域并不是一个新名词。词汇表泳道:为同一版本的应用程序定义的一组隔离环境。只有满足流控路由规则的请求流量才会被路由到对应通道的标记应用。一个应用程序可以属于多个泳道,一个泳道可以包含多个应用程序。应用程序和泳道之间存在多对多关系。泳道组:泳道的集合。泳道组的作用主要是区分不同的队伍或者不同的场景。Baseline:表示业务的所有服务都部署在这个环境中。未标记的应用属于应用的基线稳定版本,我们这里指的是稳定的在线环境。入口应用:微服务系统中的流量入口。入口应用可以是Ingress网关,也可以是自建的SpringCloudGateway、NetflixZuulGateway引擎类网关,也可以是SpringBoot、SpringMVC、Dubbo应用等。为什么要区分入口应用和出口应用呢?因为在全链路灰度场景下,我们只需要为入口应用配置路由转发规则,后续微服务只需要根据透传的标签进行颜色路由即可(实现“泳道”流量闭环能力)。从上图可以看出,我们分别创建了泳道A和泳道B,其中涉及到交易中心和商品中心两个应用,分别为tag标签2,其中A泳道分流30%线上流量,B泳道分流20%的线上流量,基线环境(即无标记环境)分流50%的线上流量。全链路灰度技术分析我们在deployment上配置注解alicloud.service.tag:gray来标识应用的灰度版本,并在注册中心用tag注册,并在deployment上开启全链路swimlane灰度版应用(通过机器流量自动着色),支持灰度流量自动添加灰度x-mse-tag:灰色标签,通过扩展消费者路由能力,将带有灰度标签的流量转发给目标灰度应用。基于各种Ingress网关的全链路灰度基于全链路灰度能力和合适的Ingress路由网关,可以实现全链路流量灰度,如前文所述使用Ingress-Nginx、Ingress-APISIX、ALB、MSEcloud-native网关可以作为流量入口。全链路灰度产品的功能性和易用性是产品化必须考虑的点。我们需要从用户的角度出发,思考如何端到端地实践和实施整个流程。关于阿里云微服务的全链路灰度能力,以下两款产品提供了完整的全链路灰度解决方案。MSE全链路灰度解决方案全链路灰度作为MSE微服务治理专业版的核心功能,具有以下六大特点:全链路隔离流量泳道,通过设置流量规则为需要的流量“着色”,染色'流量被路由到灰度机器。灰度流量携带灰度标记向下游形成灰度专属环境流量通道,没有灰度环境的应用会默认选择无标记的基线环境。End-to-endstablebaselineenvironment没有标注的应用属于应用的baseline稳定版,即稳定的线上环境。当我们发布相应的灰度版本代码后,我们可以通过配置规则来引导特定线上流量的引入,从而控制灰度代码的风险。流量一键动态切换自定义流量规则后,一键停止和启动,可根据需要进行增删改查,规则实时生效。灰度排水更方便。低成本接入,基于JavaAgent技术,无需修改一行业务代码MSE微服务治理能力基于JavaAgent字节码增强技术,无缝支持市面上近5年的SpringCloud和Dubbo各版本,用户做无需更改一行代码即可使用,无需改变业务现有架构,可随时上下,无需绑定。只需启动MSE微服务治理专业版,在线配置,实时生效。可观察性能够在泳道级别实现单一应用程序可观察性。全链路应用可观察能力,全局视角观察流量是否逃逸。灰不灰一目了然。具备线上线下无损能力,让发布更顺畅开启MSE微服务治理后,应用具备线上线下无损能力,大流量下的发布、回滚、扩容、缩容等场景可以保证流量无损.1.创建车道组,需要将车道组涉及的应用添加到车道组涉及的应用中。2.创建车道在使用泳道功能之前,我们已经有了一个默认包括所有服务的基线(不达标)环境。我们需要部署隔离版本的应用Deployment,同时给它们打上标签,为泳道选择一个对应的一对一标签(测试泳道关联一个灰色标签),然后需要配置流量入口的入口规则,比如访问www.base。com被路由到A应用程序的基础版本,而访问www.gray.com被路由到A应用程序的灰色版本。apiVersion:networking.k8s.io/v1beta1kind:Ingressmetadata:name:spring-cloud-a-basespec:rules:-host:www.base.comhttp:paths:-backend:serviceName:spring-cloud-a-base服务端口:20001路径:/---apiVersion:networking.k8s.io/v1beta1kind:Ingressmetadata:name:spring-cloud-a-grayspec:rules:-host:www.gray.comhttp:paths:-backend:serviceName:spring-cloud-a-grayservice端口:20001路径:/EDAS全链路灰度解决方案1、EDAS产品介绍EDAS是一个云原生的应用托管和微服务管理PaaS平台,提供应用开发、部署、监控、运维的全栈以及运维等,同时支持SpringCloud、ApacheDubbo等微服务运行环境,助力您的应用轻松上云。在EDAS平台上,用户可以通过WAR包、JAR包或镜像快速部署应用到各种底层服务器集群,集群免维护,可以轻松部署基线版和灰度版应用。EDAS与MSE微服务治理能力无缝对接,部署在EDAS上的应用无需额外安装即可获得零代码入侵、应用无损下线、金丝雀发布、全链路流控等高级特性代理人。目前EDAS支持以微服务应用为入口的全链路灰度能力。下面简单介绍一下在EDAS中配置全链路灰度流量的方法。2.创建车道组和车道。创建泳道时,需要选择入口类型。目前只支持部署在EDAS中的入口应用作为泳道的入口应用。需要将泳道涉及的基线版本和灰度版本添加到泳道组涉及的应用中。中间。在创建泳道时,支持根据路径配置规则定向引入特定线上流量,配置标记流量应用,形成灰度环境链路。Swimlane支持基于Cookie、Header和Parameter的流控。泳道配置成功后,可以在全链路流控界面选择目标泳道组进行流量观察,包括入口应用整体监控图、未标记部分监控图、标记部分监控图,以及通道组图片中所有应用的监控。3、应用路由作为流量入口,实现全链路灰度化。EDAS平台支持用户基于NginxIngress为Kubernetes应用创建应用路由。结合EDAS对全链路流控的支持,用户可以直接使用NginxIngress作为流量入口网关的全链路灰度。在EDAS平台部署好基线版应用、灰度版应用和Ingress应用后,按照上述创建流量泳道组和通道的步骤创建灰度泳道后,可以将KubernetesService资源绑定到Ingress应用,提供流量入口。可以为ingress应用配置一个LoadBalancer类型的Service,提供对ingress应用的外部访问,或者为ingress应用配置一个ClusterIP类型的Service,并基于Kubernetes集群中已有的NginxIngressgateway,为ingress应用配置应用路由,避免额外的公网IP分配。下面简单介绍一下将应用路由配置为入口应用流量入口的方法。在已部署的应用详情页面,您可以配置应用的访问方式。这里,可以选择为ingress应用绑定LoadBalancer类型的Service,直接对外访问,也可以创建一个ClusterIP类型的Service,如下图所示:配置成功后,可以在应用路由页面,点击CreateApplicationRoute,选择入口应用所在集群、命名空间、应用名、服务名和端口,配置Ingress资源,如下图:配置成功后,Ingress资源配置可以通过域名和路径结合通道中配置的灰度流量规则实现全链路灰度。4.另外,EDAS中的全链路流控目前只支持部署在EDAS中的入口应用作为流量入口。在Kubernetes引领的云原生趋势下,EDAS将支持使用Ingress作为流量入口,用户无需额外部署网关应用,直接使用Ingress资源配置转发规则作为流量入口。不仅如此,EDAS还将支持ALBIngress、APISIXIngress、MSE云原生网关Ingress,并在此基础上进一步升级全链路灰度能力,支持基于各种Ingress-Provider的全链路灰度能力网关。到最后发现在云原生抽象Ingress下,再谈全链路灰度,一切问题都变得更规范、更简单。本文介绍各种Ingress网关实现的路由转发能力,配合Ingress基于“泳道”的全链路灰度方案,企业可以快速实现全链路灰度微服务核心能力。原文链接本文为阿里云原创内容,未经许可不得转载。
