架构

简要概述

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:
    ...