架构

简要概述

Envoy 是为面向服务架构(SOA)设计的 L7 层代理,主要围绕解决以下核心思想:

网络应对应用程序透明,当网络和应用程序发生问题时,应该很容易确定问题的根源。

功能特点

实现上述的目标非常困难,在设计上试图通过提供以下高级功能来实现这一目标:

  • 独立进程架构

相比传统的 sdk 方式,部署升级更加简单方便;

  • L3/L4 过滤器架构

可插拔的过滤器链机制,可方便为 TCP/UDP 代理编译各自自定义任务;

  • HTTP L7 过滤器架构

方便为 HTTP 协议添加执行不同的任务,如缓冲、速率限制、路由/转发;

  • 优先支持 HTTP/2

推荐服务使用 h2 以创建持久连接的网格,使得请求和响应可以通过多路复用;

  • HTTP/3 支持

支持上行和下行的HTTP/3,并能够在任何方向上进行HTTP/1.1、HTTP/2和HTTP/3的相互转换;

  • HTTP L7 路由

支持一个路由子系统,能够根据路径、权限、内容类型、运行时值等路由和重定向请求;

  • gRPC 支持

支持为 gRPC 请求和响应的路由和负载均衡;

  • 服务发现和动态配置

支持 API 以及可动态更新集群本身能力;

  • 健康检查

内置健康检查子系统,可以选择对上游服务集群执行主动的健康检查;

  • 高级负载均衡

原生提供诸如自动重试、断路器、限速、异常检查等功能,并使其对任何应用程序都可使用;

  • 前/边缘代理支持

原先提供了可观察性、管理、服务发现和负载均衡等非常易于在边缘端使用;

  • 丰富的可观测性

为所有子系统提供了统计支持,对外暴露性能数据。

关键术语

术语 名称 说明
Host 主机 逻辑网络应用程序
Downstream 下游 下游客户端主机连接到 Envoy,发送请求并接收响应
Upstream 上游 上游服务端主机接收来自 Envoy 的连接和请求,并返回响应
Listener 监听器 提供给下游客户端连接的网络地址
Cluster 集群 Envoy 连接到逻辑上相同的一组上游主机
Mesh 网格 一组 Envoy 代理,它们之间互相协调网络拓扑
Runtime configuration 运行时配置 可以更改配置设置来影响运行,而无需重启 Envoy 或更改主要配置

xDS

Envoy xDS APIs(xDS 协议)使用 proto3 编写定义在官方代码仓库 api 中,它们支持:

  1. 通过 gRPC 进行 xDS API 更新
  2. 自动通过 proto3 映射为 reset api
  3. 支持本地配置文件、REST 接口 或 gRPC 端点传递更新
  4. 通过扩展的端点分配 API 进行高级负载均衡
  5. TODO; 在需要时提供更强的一致性和排序特性

启动配置

示例配置

在使用 xDS API,需提供引导配置文件以启动服务,支持两种配置:

  1. 静态配置(static_resources),启动前人工已编写好;
  2. 动态配置(dynamic_resources),通过 xDS 服务端自发现;

以下是静态配置的示例:

cat >> demo.yaml << EOF
static_resources:
  listeners:
  - name: listener_0
    address:
      # envoy 服务监听的地址
      socket_address:
        address: 0.0.0.0
        port_value: 80
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          http_filters:
          - name: envoy.filters.http.router
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
          stat_prefix: ingress_http
          route_config:
            virtual_hosts:
            - name: local_service
              # 匹配所有入口域名
              domains: ["*"]
              routes:
              - match:
                  # 匹配所有以 '/' 开头的路由
                  prefix: "/"
                route:
                  # 名称必须在 "clusters[_].name" 中存在
                  cluster: oneops-syncds-v1
                  # 对匹配到以 '/' 开头的路由,转发到后端 "oneops-syncds-v1" 时替换为 "/ds/" 前缀路径
                  prefix_rewrite: "/ds/"

  clusters:
  - name: oneops-syncds-v1
    type: LOGICAL_DNS
    dns_lookup_family: V4_ONLY
    load_assignment:
      cluster_name: oneops-syncds-v1
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              # 转发到后端真实服务器地址
              socket_address:
                address: 192.168.0.1
                port_value: 8080
EOF

启动服务,以在 “80” 端口监听,并对所有转入请求转发至后端 “192.168.0.1:8080” 服务,设置 url 前缀为 “/ds/":

./envoy -c demo.yaml

静态配置

static_resources:
  listeners:
    ...

  clusters:
    ...



最后修改 2024.01.31: docs: 完成上游集群初版 (822daa1)