云原生系列一:Aeraki --- 管理 Istio 服务网格中任何 7 层协议

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: ​今天由叶秋学长来介绍如何通过 Aeraki 来在服务网格中为 Dubbo、Thrift 等协议的服务提供七层流量路由、本地限流、全局限流,以及如何基于 Aeraki Protocol快速开发一个自定义协议,并在 Istio 服务网格中对采用自定义协议的服务进行管理。本篇文章作为系列教程的先导篇,叶秋学长将从全局视角带您了解 Aeraki Mesh。Aeraki [Air-rah-ki]是希腊语中“微风”的意思。虽然 Istio 在中连接微服务,但 Aeraki 提供了一个框架,允许 Istio 支持更多的第 7 层协议,而不仅仅是 HTTP 和 gRPC。我们希望这股"微风"

导语:Aeraki Mesh 是 CNCF 的沙箱项目,它可以帮助你在服务网格中管理任何七层协议。

今天由叶秋学长来介绍如何通过 Aeraki 来在服务网格中为 Dubbo、Thrift 等协议的服务提供七层流量路由、本地限流、全局限流,以及如何基于 Aeraki Protocol快速开发一个自定义协议,并在 Istio 服务网格中对采用自定义协议的服务进行管理。

本篇文章作为系列教程的先导篇,叶秋学长将从全局视角带您了解 Aeraki Mesh。

image.gif编辑

Aeraki [Air-rah-ki]是希腊语中“微风”的意思。虽然 Istio 在中连接微服务,但 Aeraki 提供了一个框架,允许 Istio 支持更多的第 7 层协议,而不仅仅是 HTTP 和 gRPC。我们希望这股"微风"可以帮助 Istio 更进一步。

Service Mesh 缺乏协议支持

我们现在面临着服务网格的一些挑战:

Istio 和其他流行的服务网格实现对除 HTTP 和 gRPC 之外的第 7 层协议的支持非常有限。

    • Envoy RDS(Route Discovery Service)专为 HTTP 设计。其他协议如 Dubbo 和 Thrift 只能使用监听器内联路由进行流量管理,当路由发生变化时会中断现有连接。
    • 将专有协议引入服务网格需要付出很多努力。您需要编写一个 Envoy 过滤器来处理数据平面中的流量,以及一个控制平面来管理这些 Envoy。
    • 这些障碍使用户很难(如果不是不可能的话)管理微服务中其他广泛使用的第 7 层协议的流量。例如,在微服务应用程序中,

    我们可能有以下协议:

      • RPC:HTTP、gRPC、Thrift、Dubbo、专有 RPC 协议……
      • 消息传递:Kafka、RabbitMQ …
      • 缓存:Redis、Memcached……
      • 数据库:MySQL、PostgreSQL、MongoDB……

      image.gif编辑

      如果您已经在迁移到服务网格方面投入了大量精力,那么您当然希望充分利用它——管理微服务中所有协议的流量。

      Aeraki 的方法

      为了解决这些问题,我们创建了一个开源项目Aeraki Mesh,以提供一种非侵入式、可扩展的方式来管理 Istio 服务网格中的任何第 7 层流量。

      image.gif编辑image.gif编辑

      如图所示,Aeraki 框架由以下组件组成:

      Aeraki:Aeraki为操作提供高级、用户友好的流量管理规则,将规则转换为 envoy 过滤器配置,并利用 Istio 的EnvoyFilterAPI 将配置推送到 sidecar 代理。Aeraki 还充当数据平面中 MetaProtocol 代理的 RDS 服务器。与专注于 HTTP 的 Envoy RDS 不同,Aeraki RDS 旨在为所有第 7 层协议提供通用的动态路由能力。

      MetaProtocol Proxy:MetaProtocol Proxy为第 7 层协议提供常用功能,例如负载均衡、断路器、负载均衡、路由、速率限制、故障注入和身份验证。第 7 层协议可以构建在 MetaProtocol 之上。要将新协议添加到服务网格中,您唯一需要做的就是实现编解码器接口和几行配置。如果您有内置能力无法满足的特殊需求,MetaProtocol Proxy 还具有应用级过滤器链机制,允许用户编写自己的第 7 层过滤器,将自定义逻辑添加到 MetaProtocol Proxy 中。

      Dubbo和Thrift已经基于 MetaProtocol 实现。更多协议正在开发中。如果您使用的是闭源专有协议,您还可以通过为其编写 MetaProtocol 编解码器在您的服务网格中对其进行管理。

      大多数请求/响应风格的无状态协议都可以构建在 MetaProtocol 代理之上。但是,有些协议的路由策略过于“特殊”,无法在 MetaProtocol 中进行规范化。例如,Redis 代理使用槽号将客户端查询映射到特定的 Redis 服务器节点,槽号由请求中的 key 计算得出。只要 Envoy 代理端有可用的 Envoy 过滤器,Aeraki 仍然可以管理这些协议。目前,对于该类别的协议,Aeraki 支持Redis和 Kafka。

      深入研究元协议

      让我们看看 MetaProtocol 是如何工作的。在引入 MetaProtocol 之前,如果我们想为特定协议代理流量,我们需要编写一个理解该协议的 Envoy 过滤器并添加代码来操作流量,包括路由、头部修改、故障注入、流量镜像等。

      对于大多数请求/响应风格的协议,流量操作的代码非常相似。因此,为了避免在不同的 Envoy 过滤器中重复这些功能,Aeraki Mesh 在一个地方实现了第 7 层协议代理的大部分常见功能——MetaProtocol 代理过滤器。

      image.gif编辑这种方法显着降低了编写新的 Envoy 过滤器的障碍:现在您只需要实现编解码器接口,而不是编写功能齐全的过滤器。除此之外,控制平面已经到位——Aeraki 在控制平面上工作,为基于 MetaProtocol 构建的所有协议提供 MetaProtocol 配置和动态路由。

      image.gif编辑

      MetaProtocol Proxy 中有两个重要的数据结构:Metadata 和 Mutation。元数据用于路由,而 Mutation 用于标头操作。

      在请求路径上,解码器(编解码器实现的解码方法)使用从请求中解析的键值对填充元数据数据结构,然后将元数据传递给元协议路由器。路由器在匹配它通过 RDS 和元数据从 Aeraki 接收到的路由配置后,选择适当的上游集群。

      如果需要修改请求,自定义过滤器可以使用任意键值对填充 Mutation 数据结构:添加标头或更改标头的值。然后将 Mutation 数据结构传递给编码器(编解码器实现的 encode 方法)。编码器负责将键值对写入有线协议。

      image.gif编辑响应路径与请求路径类似,只是方向不同。

      image.gif编辑

      一个例子

      如果需要实现基于 MetaProtocol 的应用协议,可以按照以下步骤进行(以 Thrift 为例):

      数据平面

        • 实现编解码器接口对协议包进行编码和解码。您可以参考Dubbo 编解码器和Thrift 编解码器编写自己的实现。
        • 使用 Aeraki ApplicationProtocolCRD 定义协议,如下 YAML 片段所示:

        image.gif编辑

        控制平面

        您不需要实现控制平面。Aeraki 监视服务和流量规则,为 Sidecar 代理生成配置,并通过EnvoyFilterMetaProtocol RDS 将配置发送到数据平面。

        协议选择

        与 Istio 类似,协议由服务端口前缀标识。请使用以下模式命名服务端口:tcp-metaprotocol-{应用程序协议}-xxx。例如,Thrift 服务端口应命名为 tcp-metaprotocol-thrift。

        交通管理

        MetaRouter您可以通过CRD更改路线。例如:将 20% 的请求发送到 v1,将 80% 的请求发送到 v2:

        image.gif编辑

        本期分享到此为止,叶秋学长还发现一篇好文章跟大家分享《服务网格项目Aeraki Mesh正式进入CNCF沙箱》点击学习链接

        让我们一起期待下一篇的云原生系列作品,不要忘记给叶秋学长点点关注哦~~

        相关文章
        |
        2月前
        |
        负载均衡 Kubernetes Cloud Native
        OpenKruise 是一个基于 Istio 的云原生服务网格
        OpenKruise 是一个基于 Istio 的云原生服务网格
        27 10
        |
        7月前
        |
        运维 负载均衡 监控
        服务网格技术对比:深入比较Istio、Linkerd和Envoy等服务网格解决方案的优缺点
        服务网格技术对比:深入比较Istio、Linkerd和Envoy等服务网格解决方案的优缺点
        227 0
        |
        17天前
        |
        消息中间件 监控 微服务
        【专栏】随着技术发展,未来将探索服务网格、容器化和云原生技术,以提升微服务架构的效能
        【4月更文挑战第27天】本文探讨了构建高效微服务架构的后端开发最佳实践。微服务以服务独立、去中心化、自治和轻量级通信为核心原则,带来可扩展性、独立性、技术灵活性和团队协作优势。实践中,要注意服务拆分粒度、选择合适的通信协议(如RESTful、RPC、消息队列)、处理数据一致性与分布式事务、实施服务治理和监控,以及确保安全性与权限控制。随着技术发展,未来将探索服务网格、容器化和云原生技术,以提升微服务架构的效能。
        |
        2月前
        |
        负载均衡 安全 网络协议
        如何通过计算巢在ACK集群上使用Istio服务网格
        本文主要介绍怎么通过计算巢部署Isito服务网格,并介绍了使用示例。
        35 0
        |
        7月前
        |
        监控 Cloud Native 安全
        [云原生] 破局微服务通信:探索MegaEase服务网格的创新之路
        [云原生] 破局微服务通信:探索MegaEase服务网格的创新之路
        71 0
        |
        5月前
        |
        JSON Kubernetes Cloud Native
        云原生|kubernetes|多集群管理之kubeconfig文件配置和使用(定义,使用方法,合并管理多集群)
        云原生|kubernetes|多集群管理之kubeconfig文件配置和使用(定义,使用方法,合并管理多集群)
        177 0
        |
        5月前
        |
        Kubernetes Cloud Native 数据安全/隐私保护
        云原生|kubernetes |部署k8s图形化管理组件 kuboard v3
        云原生|kubernetes |部署k8s图形化管理组件 kuboard v3
        113 0
        |
        5月前
        |
        Kubernetes Cloud Native 安全
        猿创征文|云原生|kubernetes学习之多账户管理--权限精细化分配方案(两种方式-sa和用户)
        猿创征文|云原生|kubernetes学习之多账户管理--权限精细化分配方案(两种方式-sa和用户)
        86 0
        |
        5月前
        |
        存储 机器学习/深度学习 负载均衡
        模型服务网格:云原生下的模型服务管理
        模型服务网格:云原生下的模型服务管理
        78383 1
        模型服务网格:云原生下的模型服务管理
        |
        7月前
        |
        Kubernetes 监控 Go
        在Kubernetes上安装和配置Istio:逐步指南,展示如何在Kubernetes集群中安装和配置Istio服务网格
        在Kubernetes上安装和配置Istio:逐步指南,展示如何在Kubernetes集群中安装和配置Istio服务网格
        89 0