Enovy与Envoy GateWay

Posted on May 16, 2022 Envoy是为大型现代面向服务架构设计的L7代理和通信总线。Envoy是一个为云原生应用设计的开源边缘与服务代理,是云原生计算基金会(CNCF)第三个毕业的项目,GitHub 目前有 13k+ Star。 Envoy特点:

  • 基于现代 C++ 开发的 L4/L7 高性能代理。
  • 透明代理。
  • 流量管理。支持路由、流量复制、分流等功能。
  • 治理特性。支持健康检查、熔断、限流、超时、重试、故障注入。
  • 多协议支持。支持 HTTP/1.1,HTTP/2,GRPC,WebSocket 等协议代理与治理。
  • 负载均衡。加权轮询、加权最少请求、Ring hash、Maglev、随机等算法支持。支持区域感知路由、故障转移等特性。
  • 动态配置 API。提供健壮的管控代理行为的接口,实现 Envoy 动态配置热更新。
  • 可观察性设计。提供七层流量高可观察性,原生支持分布式追踪。
  • 支持热重启。可实现 Envoy 的无缝升级。
  • 自定义插件
  • 能力。Lua 与多语言扩展沙箱 WebAssembly。 进程外架构:Envoy是一个独立的进程,设计为与每个应用程序服务器一起运行。所有Envoy都形成了一个透明的通信网格,其中每个应用程序都在本地主机之间发送和接收消息,并且不知道网络拓扑。 HTTP L7路由:当在HTTP模式下运行时,Envoy支持一个路由子系统,该子系统能够根据路径、权限、内容类型、运行时值等路由和重定向请求。当将Envoy用作前端/边缘代理时,该功能最为有用,但在构建服务到服务网格时,也可以利用该功能。 服务发现和动态配置:Envoy可选地使用一组分层的动态配置API进行集中管理。这些层为Envoy提供了关于以下内容的动态更新:后端集群内的主机、后端集群本身、HTTP路由、侦听套接字和加密材料。对于更简单的部署,后端主机发现可以通过DNS解析完成(甚至完全跳过),其他层由静态配置文件代替。

相关概念定义

主机:能够进行网络通信的实体(移动电话、服务器等上的应用程序)。在本文档中,主机是一个逻辑网络应用程序。一个物理硬件可能有多个主机在其上运行,只要每个主机都可以独立寻址。

下游:下游主机连接到Envoy,发送请求并接收响应。

上游:上游主机从Envoy接收连接和请求并返回响应。

侦听器:侦听器是一个命名的网络位置(例如,端口、unix域套接字等),下游客户端可以连接到该位置。Envoy公开下游主机连接到的一个或多个侦听器。

集群:集群是Envoy连接到的一组逻辑上相似的上游主机。Envoy通过服务发现发现集群的成员。它可以选择通过主动健康检查来确定集群成员的健康状况。Envoy将请求路由到的集群成员由负载平衡策略确定。

网格:一组协调以提供一致网络拓扑的主机。在本文档中,“Envoy网格”是一组Envoy代理,它们构成了由许多不同服务和应用程序平台组成的分布式系统的消息传递基底。

运行时配置:与Envoy一起部署的带外实时配置系统。可以更改将影响操作的配置设置,而无需重新启动Envoy或更改主配置。

Envoy Gateway

https://github.com/envoyproxy/gateway star 683 https://www.cncf.io/blog/2022/05/16/introducing-envoy-gateway/ https://cloud.it168.com/a2022/1028/6770/000006770758.shtml Envoy项目最初以开源软件的姿态亮相于2016年秋季,尽管在早期发展阶段,Envoy总让人们联想到“服务网格(Service Mesh)”,但它在Lyft上的首秀其实是以API网关/边缘代理的角色出现的,过去五年多以来,Envoy得到众多最终用户的青睐,也逐渐从API网关成长为“服务网格”中的sidecar代理。Envoy特别招人喜欢的一点就是它在本质上属于底层工具。Envoy这款软件并不容易上手,虽然项目已经在全球各类大型工程团队中得到肯定和成功,但那些体量不大、难度较低的用例仍然是Nginx和HAProxy的天下

Envoy Gateway项目的诞生正源自这样一个信念,即让Envoy通过以下两大改进以API网关的姿态“走入寻常百姓家”:

  • 针对轻量化用例提供经过简化的部署模型和API层。
  • 将现有CNCF API网关项目(包括Contour和Emissary)合并成统一的通用核心,在提供最佳上手体验的同时,继续支持供应商构建基于Envoy Proxy和Envoy Gateway的增值解决方案。

项目概述

总体来讲,Envoy Gateway可以被理解成Envoy Proxy核心的打包器。它不会对核心代理、xDS、go-control-plane等做出任何更改(潜在的驱动功能、bug修复和常规改进除外)。Envoy Gateway可提供以下功能:

  • 一个面向网关用例的简化API。这里的API正是Kubernetes Gateway API,其中附带有Envoy专用扩展。之所以选择Kubernetes Gateway API,是因为它最初的设计目标就是作为部署在Kubernetes上的入口控制器,而且已经得到了行业的广泛认可。
  • 提供“内含电池”体验,确保用户能够快速启动、快速运行。这一体验具体涵盖控制器资源、控制平面资源、代理实例等工具。
  • 可扩展的API接口。虽然Envoy Gateway主要强调以开箱即用方式为用户提供通用API网关功能(例如速率限制、身份验证、Let’s Encrypt集成等),但供应商也可借此提供所有API的SaaS版本、其他API,以及包括WAF、增强可观察性、混沌工程在内的各类增值功能。
  • 包含高质量的文档和入门指南。Envoy Gateway项目的主要目标,就是为普通用户赋能、引导他们轻松实现各类常见网关用例。

说起API的话题,我们发现很多朋友好像不太清楚如何在面向高级用例时,要如何在其他项目中有效对Envoy的xDS API进行重新实现。正是这个问题,导致用户往往需要学习多个复杂API(借此最终转换回xDS)才能达成目的。为此,Envoy Gateway致力于“拨乱反正”,强调Kubernetes Gateway API(以及此API所支持的任何扩展)为唯一受支持的附加API。其他高级用例将由“xDS模式”提供支持,其中的现有API资源将自动由系统替最终用户进行转换。换言之,用户可以直接切换至使用xDS API。这既明确了主API的官方定位,同时也能超越主API的表达能力,允许用户继续通过xDS充分利用Envoy功能。

Emissary Ingress

https://www.getambassador.io/docs/ https://github.com/emissary-ingress/emissary stra 3900 Emissary-ingress[1],以前被称为 Ambassador,是一个面向 Kubernetes 的开源入口控制器和 API 网关。它建立在 Envoy Proxy 上,并支持广泛的入口用例,包括负载均衡、认证和可观察性。Emissary通过Kubernetes CRD或KubernetesServices上的注释进行配置。在内部,它使用[Envoy Proxy]实际处理路由数据;在外部,它依赖Kubernetes进行扩展和恢复

主要构件:

  • Kubernetes 原生的:emissary-ingress 使用 Kubernetes 实现持久性,因此不需要运行、扩展或维护数据库。它还使用了 Kubernetes 的活跃度(liveness)和准备度(readiness)探测,因此 Kubernetes 在检测到问题时自动重启 emissary-ingress。
  • 基于 Envoy 的:所有的第 7 层路由都是由 Envoy Proxy 完成的,因此性能与特使相同。
  • 生态系统集成:该项目与其他云原生社区集成,包括 Prometheus、Linkerd、Jaeger 等。 主要特征:

  • 通过负载平衡管理入口流量,支持多种协议(gRPC和HTTP/2、TCP和web套接字),以及Kubernetes集成
  • 通过Kubernetes CRD或注释,使用易于使用的声明性策略引擎和自助服务配置管理路由更改
  • 通过身份验证、速率限制和TLS保护微服务
  • 通过粘性会话、速率限制和断路确保高可用性
  • 通过与Grafana、Prometheus和Datadog的集成以及全面的度量支持,利用可观测性
  • 使用金丝雀发行版实现渐进式交付
  • 连接服务网格,包括Consul、Linkerd和Istio
  • Knative Serverless 集成

 3Scale-APIcast

Star 277 Fork 153 Red Hat 3scale API Management Platform. 3scale作为行业前沿的API管理提供商在2016年被Red Hat收购。现在完整的3Scale是收费的,但是其中的APIcast作为网关组件是开源的,APIcast is an API gateway built on top of NGINX. It is part of the Red Hat 3scale API Management Platform. 主要特征:

  • 性能:它速度很快,因为它构建在Nginx之上,并使用LuaJIT
  • 可伸缩性:APIcast是无状态的,因此它可以水平扩展。
  • 请求转换:允许修改请求的头部、路径和参数。
  • 速率限制:可以根据报头、JWT声明、请求的IP等应用限制。
  • 模块化和可扩展性:得益于APIcast策略框架。
  • 用普罗米修斯进行监测。
  • 与Jaeger的OpenTracing集成。
  • 可以部署在OpenShift中。
  • 与Keyshaak等IdP集成,提供基于OIDC的身份验证。

GlooEdge

Star 3.6K Fork 375 https://github.com/solo-io/gloo Gloo Edge是基于Envoy的功能丰富的Kubernetes本地入口控制器和下一代API网关。Gloo Edge在函数级路由方面非常出色;它支持传统应用程序、微服务和无服务器;其发现能力;其众多特点;以及它与领先的开源项目的紧密集成。Gloo Edge被独特地设计为支持混合应用程序,其中多种技术、架构、协议和云可以共存。 主要特征:

  • Kubernetes入口控制:Gloo Edge可以作为一个功能丰富的入口控制器,构建在Envoy代理之上。
  • 下一代API网关:Gloo Edge提供了一长串API网关功能,包括速率限制、断路、重试、缓存、外部身份验证和授权、转换、服务网格集成和安全性
  • 混合应用程序:Gloo Edge创建的应用程序可以路由到后端,实现为微服务、无服务器功能和传统应用程序。这个特性可以帮助用户逐步从遗留代码迁移到微服务和无服务器;可以让用户使用云原生技术添加新功能,同时维护其传统代码库;可用于组织中不同团队选择不同架构的情况;等等
  • 函数级路由允许集成遗留应用程序、微服务和无服务器:Gloo Edge可以将请求直接路由到函数,这些函数可以是无服务器函数调用(例如Lambda、Google Cloud Function、OpenFaaS函数等)、对微服务或传统服务的API调用(例如REST API调用、OpenAPI操作、XML/SOAP请求等),或者发布到消息队列(例如NatS、AMQP等)。正是这种独特的能力使Gloo Edge成为唯一支持混合应用的API网关,也是唯一一个不将用户绑定到特定范例的API网关。
  • Gloo Edge整合了经过审查的开源项目以提供广泛的功能:Gloo Edge通过与顶级开源项目(包括GRPC、GraphQL、OpenTracing、NatS等)集成来支持高质量的功能。Gloo Edge的架构允许在未来流行的开源项目出现时快速集成它们。

  • 全自动发现让用户可以快速移动:在发布时,Gloo Edge会创建所有可用目的地的目录,并持续保持最新。这使得开发人员不再需要“记账”,并保证新功能在他们准备好后立即可用。Gloo Edge跨IaaS、PaaS和Faas提供商以及Swagger、GRPC和GraphQL进行发现。

  • Gloo Edge与用户环境紧密结合:有了Gloo Edge,用户可以自由选择自己喜欢的工具来调度(如K8s、Nomad、OpenShift等)、持久性(K8s、领事、等)和安全(K8s、Vault)。

Kong

https://github.com/Kong/kong https://docs.konghq.com/ star 33.2K Kong Gateway与OpenResty一起发布,Kong或Kong API Gateway是一个云原生、平台无关、可扩展的API网关,以其高性能和通过插件的可扩展性而著称。 通过提供代理、路由、负载平衡、健康检查、身份验证(以及更多)功能,Kong成为了轻松编排微服务或传统API流量的中心层。 Kong在Kubernetes上原生运行,这得益于其官方KubernetesIngress控制器。 主要特征:

  • 高级路由、负载平衡、健康检查-所有这些都可以通过RESTful管理API或声明性配置进行配置。
  • 使用JWT、基本身份验证、OAuth、ACL等方法对API进行身份验证和授权。
  • L4或L7流量的代理、SSL/TLS终止和连接支持。
  • 用于执行流量控制、速率限制、req/res转换、日志记录、监控以及包括插件开发中心的插件。
  • 复杂的部署模型,如声明式无数据库部署和混合部署(控制平面/数据平面分离),无需任何供应商锁定。
  • 为Kubernetes服务的原生入口控制器支持 ![[../../images/Pasted image 20221103172332.png]]

Sentinel

https://github.com/alibaba/Sentinel https://sentinelguard.io/zh-cn/docs/introduction.html Alibaba star 20.1K java Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 主要特点

  • 丰富的应用场景:Sentinel在阿里巴巴得到了广泛应用,在过去10年中几乎涵盖了双11(11.11)购物节的所有核心场景,如需要限制突发流量以满足系统容量的“秒杀”、消息削峰和谷填充、不可靠下游服务的断路、集群流量控制等。
  • 实时监控:Sentinel还提供实时监控能力。您可以实时查看单个机器的运行时信息,以及少于500个节点的集群的聚合运行时信息。
  • 广泛的开源生态系统:Sentinel提供了与Spring Cloud、gRPC、Apache Dubbo和Quarkus等常用框架和库的开箱即用集成。只需将适配器依赖项添加到服务中,就可以轻松使用Sentinel。
  • Polyglot支持:Sentinel为Java、Go、C++和Rust提供了本机支持。
  • 各种SPI扩展:Sentinel提供易于使用的SPI扩展接口,允许您快速自定义逻辑,例如自定义规则管理、调整数据源等。

Tyk

https://github.com/TykTechnologies/tyk star 7.9k 用 Go 编写的 Tyk 开源 API 网关,支持 REST、GraphQL、TCP 和 gRPC 协议

KrakenD

Lura(go) 具体见Lura使用初探

APISIX

具体见PPT组会11.3