上了 istio 的贼船之 API Gateway

简介: 通过将传统微服务架构的这些控制面功能解耦到 istio,可以让微服务应用本身专注于业务开发,是一个比较简的单体 springboot 应用。再结合 k8s 的高扩展性,研发整体的迭代速度和运维效率还是比较高的,缺点是无论是 k8s 还是 istio ,学习成本偏高,需要团队至少 2 人具有专业知识,对于招聘成本、系统升级都有风险。

现状


下图是我们系统的架构现状,大致介绍一下:


  • 基础设施在华为云上
  • 基本上是基于 istio on k8s 架构。
  • istio 版本为 1.3,所以组件较多(galley、pilot、citadel、telemetry......)
  • 微服务后端用 spring boot 单体,前端有 nodejs、vue
  • 应用的链路监控主要基于 skywalking, istio 的通讯层面利用 kiali可视化调用链
  • 其他比较传统


1.jpg


历史架构


主要介绍下作为服务通讯基础设施的 istio 在这里的作用


  1. 服务间通讯,依赖 envoy sidecar
  2. 注册中心,依赖 istio 控制面
  3. 服务治理(熔断、超时、重试)这部分还没有完完全全切干净,还有些 spring boot 应用依赖 hystrix,后面会全部改成利用 istio
  4. 流量管理(ingress gatewayegress gateway、负载均衡)
  5. 测试(错误注入)


通过将传统微服务架构的这些控制面功能解耦到 istio,可以让微服务应用本身专注于业务开发,是一个比较简的单体 springboot 应用。再结合 k8s 的高扩展性,研发整体的迭代速度和运维效率还是比较高的,缺点是无论是 k8s 还是 istio ,学习成本偏高,需要团队至少 2 人具有专业知识,对于招聘成本、系统升级都有风险。


上了贼船


坦白讲,如果系统最初的设计是我来做,是不会用如此“激进”的方案的,会转而用 spring cloud 为基础的架构,当然,k8s 是非常可能会使用的。但可惜我是中间接手,也想过换架构,但迫于公司业务和迭代的压力,再加上人手有限,再换架构的风险会非常高,所以既然上了 istio 的贼船,就只能走下去了,等什么时候时机成熟再并行其他架构,或切换回合适的架构。这里我要强调的是,做架构选择或者选型不是为了技术而技术,一定是要非常适合当时公司的发展现状、业务场景、团队能力、招聘成本等等,综合多种条件而得出的结论。 巧合的是 istio 的 logo 也是一个帆船的样子,果真

是上了贼船


API Gateway


终于说到本文的重点 API Gateway 了,对于这个话题,之前写过一篇文章,读者可以先脱离现在的架构从功能层面来了解下 API Gateway



回到我们现在的架构,你会发现,虽然我们有前置的 openResty,但应用层这边并没有一个担当 API Gateway 角色的服务。而无论是 openResty 或者是 nginx 对于云原生 API Gateway 的需求是不能完全满足的。


当然了解 istio 的读者可能会问:


  • istio ingress gateway 不也具有网关的功能吗 ?
  • 为什么没有用 nginx ingress controller


首先,我承认基于 k8s ingress 实现的各种 ingress controller 功能越来越完善,如果我们没有用 istio 可能会采用这种方案,但我们使用了,那么再结合 k8s ingress 就会有如如何为服务网格选择入口网关[1]中说的如下问题:


  • K8s Ingress 是独立在 Istio 体系之外的,需要单独采用 Ingress rule 进行配置,导致系统入口和内部存在两套互相独立的路由规则配置,运维和管理较为复杂。
  • K8s Ingress rule 的功能较弱,不能在入口处实现和网格内部类似的路由规则,也不具备网格 sidecar 的其它能力,导致难以从整体上为应用系统实现灰度发布、分布式跟踪等服务管控功能。


其次,没错 istio ingress gateway 除了基础的通讯功能之外,还有一些其他的应用层功能。但我们综合来比较下 k8s ingressistio ingress gateway 和我们理想中的 API Gateway,就会发现它还不够完善,主要是对于 API 管理的这部分功能欠缺。


2.jpg


未来


前文已经对各种 API Gateway的实现方案进行了讨论,结论是在目前难以找到一个同时具备API GatewayIsito Ingress能力的网关。那么再回顾一下我们的需求:


  • 我们使用 istio
  • 我们需要 API Gateway


所以,经过思考,我们未来的方案设计如下图:


3.jpg


  • 仍然利用 istio ingress gateway作为入口
  • istio ingress gateway接到 LB
  • API Gateway纳入到istio cluster管理的范畴当中,即拥有sidecar proxy,可被istio控制面控制。API Gateway的选型很有可能使用云原生应用网关,如 API SIX
  • 应用层微服务不会利用如 spring cloud gateway 编码一个服务网关


总结:使用API GatewaySidecar Proxy一起为服务网格提供外部流量入口。


还有没有问题?


有的,根据 Service Mesh 和 API Gateway关系深度探讨[2]上述方案的优势在于API GatewaySidecar独立部署,职责明确,架构清晰。但是,和Service Mesh使用sidecar被质疑多一跳会造成性能开销影响效率一样,API Gateway使用Sidecar也被同样的质疑:多了一跳……

对了多了这一跳,从整个架构每一段的网络耗时及其作用来看,这一跳多出的时间,几乎可以忽略不计。


性能如何?


作为 sidecarenvoy的性能应该是毋庸置疑了。至于istio ingress gateway虽然官方给出的数据也不错,但还是要在实践中观察。而作为 Cloud Native API Gateway  比如 API SIX 我对它有足够的信心,至少在我司现阶段业务体量以及未来百倍增长规模下都不会担心性能问题。


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
Kubernetes 应用服务中间件 API
5 分钟了解 Kubernetes Ingress 和 Gateway API
5 分钟了解 Kubernetes Ingress 和 Gateway API
715 0
|
5天前
|
API
Istio 使用ingress和gateway两种方式公开服务
本文档指导您完成Istio网关的部署与配置。首先安装`istiod`(步骤略过)。接着,创建`ingress.yaml`文件,定义Istio入口网关的服务、部署及权限设置,通过`kubectl apply -f ingress.yaml`命令应用。最后,创建Ingress资源,指定主机名、后端服务及TLS配置,实现对外部请求的路由管理。
13 0
|
5月前
|
Prometheus Kubernetes Cloud Native
云原生周刊:Argo Rollouts 支持 Kubernetes Gateway API 1.0 | 2024.7.1
探索开源世界:Kubetools的推荐系统[Krs](https://github.com/kubetoolsca/krs)助力K8s优化,追踪K8s组件清单,指引IAC集成。阅读建议: Prometheus与Thanos的进化故事,Adidas容器平台管理经验,K8s请求实现详解。关注云原生:Argo Rollouts支持Gateway API 1.0,Kubewarden v1.14强化策略与镜像安全。
|
4月前
|
存储 Kubernetes API
【APIM】Azure API Management Self-Host Gateway是否可以把请求的日志发送到Application Insights呢?让它和使用Azure上托管的 Gateway一样呢?
【APIM】Azure API Management Self-Host Gateway是否可以把请求的日志发送到Application Insights呢?让它和使用Azure上托管的 Gateway一样呢?
|
4月前
|
安全 API
【Azure API 管理】APIM Self-Host Gateway 自建本地环境中的网关数量超过10个且它们的出口IP为同一个时出现的429错误
【Azure API 管理】APIM Self-Host Gateway 自建本地环境中的网关数量超过10个且它们的出口IP为同一个时出现的429错误
|
6月前
|
Java API 开发者
Spring Cloud Gateway中的GlobalFilter:构建强大的API网关过滤器
Spring Cloud Gateway中的GlobalFilter:构建强大的API网关过滤器
445 0
|
7月前
|
监控 Cloud Native 安全
【阿里云云原生专栏】云原生下的API管理:阿里云API Gateway的应用场景与优势
【5月更文挑战第23天】阿里云API Gateway是高性能的API托管服务,适用于微服务API聚合、安全管理及流量控制。它提供统一入口、多种认证方式和流量控制策略,确保服务稳定性。具备高度可扩展性、丰富插件生态和简化API生命周期管理等特点。通过简单步骤,如创建API、配置后端服务、设置认证和发布,即可快速上手。作为云原生时代的API管理解决方案,阿里云API Gateway助力企业高效、安全地管理API,推动业务创新和数字化转型。
106 1
|
6月前
|
负载均衡 Java API
Spring Cloud Gateway 详解:构建高效的API网关解决方案
Spring Cloud Gateway 详解:构建高效的API网关解决方案
179 0
|
6月前
|
Java API 开发者
Java一分钟之-Spring Cloud Gateway:API网关
【6月更文挑战第10天】Spring Cloud Gateway是Spring Cloud生态中的API网关组件,基于Spring Framework 5、Reactor和Spring Boot 2.0,支持响应式编程。它提供路由转发、过滤器链(包括预处理、路由和后处理)和断言功能。快速入门涉及添加相关依赖和配置路由规则。常见问题包括路由冲突、过滤器顺序和性能瓶颈。通过动态路由和过滤器示例,展示了其灵活性。Spring Cloud Gateway是微服务架构的有力工具,可提升系统稳定性和开发效率。
216 0
|
7月前
|
设计模式 缓存 Java
【设计模式】JAVA Design Patterns——API Gateway(API网关模式)
【设计模式】JAVA Design Patterns——API Gateway(API网关模式)