0、envoy介绍

文档:

《https://cloud.tencent.com/developer/article/1554609》

《https://cloud.tencent.com/developer/article/1574575》

《https://www.cnblogs.com/infodriven/p/16215365.html》

《https://www.envoyproxy.io/docs/envoy/v1.28.0/start/quick-start/》

《https://tetrate-academy.thinkific.com/courses/take/envoy-fundamentals-zh/lessons/32007772-2-1-http-hcm》

1、envoy是什么?

Envoy是Lyft开源的一个C++实现的代理(Proxy),和Nginx及HAProxy类似,可代理L3/L4层和L7层,代理是它最核心和基础的功能,它也是服务网格框架Istio的Sidecar。它与应用程序并行运行,通过以平台无关的方式提供通用功能来抽象网络。

2、envoy术语

Listener:可以被下游客户端连接的命名网络(如端口、Unix 套接字)。一般是每台主机运行一个 Envoy,使用单进程运行,但是每个进程中可以启动任意数量的 Listener(监听器),每个监听器都独立配置一定数量的( L3/L4 )网络过滤器。

过滤器(Filter):过滤器是处理入站和出站流量的链式结构的一部分。在过滤器链上可以集成很多特定功能的过滤器。

路由(Route):路由用来将流量转发到具体的目标实例,目标实例在 Envoy 中被定义为集群。

Cluster:Envoy 连接到的一组逻辑上相似的上游主机。集群定义了流量的目标端点,同时还包括一些其他可选配置,如负载均衡策略、健康检查、连接池、异常点检测等

endpoints :定义了一组属于特定地域的端点。

Host:能够进行网络通信的实体(如服务器上的应用程序)。

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

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

Mesh:以提供一致的网络拓扑的一组主机。

Runtime Configuration:与 Envoy 一起部署的外置实时配置系统。

Listener Filter:Listener 使用 Listener Filter(监听器过滤器)来操作链接的元数据,它的作用是在不更改 Envoy 的核心功能的情况下添加更多的集成功能。

Http Route Table:HTTP 的路由规则,例如请求的域名,Path 符合什么规则,转发给哪个 Cluster

过滤器

Envoy 定义了三类过滤器:监听器过滤器、网络过滤器和 HTTP 过滤器。监听器过滤器在收到数据包后立即启动,通常对数据包的头信息进行操作。监听器过滤器包括代理监听器过滤器(提取 PROXY 协议头),或 TLS 检查器监听器过滤器(检查流量是否为 TLS,如果是,则从 TLS 握手中提取数据)。

监听器过滤器:Envoy 在处理网络级过滤器之前先处理监听器过滤器。(HTTP检查器监听器过滤器、原始目的地监听器过滤器、原始源监听器过滤器、代理协议监听器过滤器、TLS检查器监听器过滤器)

Envoy 会在网络级过滤器之前处理监听器过滤器。我们可以在监听器过滤器中操作连接元数据,通常是为了影响后来的过滤器或集群如何处理连接。

监听器过滤器对新接受的套接字进行操作,并可以停止或随后继续执行进一步的过滤器。监听器过滤器的顺序很重要,因为 Envoy 在监听器接受套接字后,在创建连接前,会按顺序处理这些过滤器。

我们可以使用监听器过滤器的结果来进行过滤器匹配,并选择一个合适的网络过滤器链。例如,我们可以使用 HTTP 检查器监听器过滤器来确定 HTTP 协议(HTTP/1.1 或 HTTP/2)。基于这个结果,我们就可以选择并运行不同的网络过滤器链。

网络(L3/L4) 过滤器:envoy内置了许多L3/L4过滤器,例如

代理类:TCP Proxy、HTTP connection manager、Thrift Proxy、Mongo proxy、Dubbo Proxy、ZooKeeper proxy、MySQL proxy和Redis proxy等;

其它:Client TLS authentication、Rate limit、Role Based Access Control (RBAC) Network Filter和Upstream Cluster from SNI等;

HTTP 连接管理器过滤器(HTTP Connection Manager Filter)或 HCM:一个特殊的、内置的网络过滤器。HCM 过滤器能够将原始字节转换为 HTTP 级别的消息。它可以处理访问日志,生成请求 ID,操作头信息,管理路由表,并收集统计数据。

HTTP 过滤器链中的最后一个过滤器必须是路由器过滤器(envoy.filters.HTTP.router)。路由器过滤器负责执行路由任务。

集群

服务发现:

集群可以在配置文件中静态配置,也可以通过集群发现服务(CDS)API 动态配置。每个集群都是一个端点的集合,Envoy 需要解析这些端点来发送流量。

解析端点的过程被称为服务发现。服务发现的类型:静态STATIC(默认)、STRICT_DNS、LOGICAL_DNS、端点发现服务(EDS)-- 首选、ORIGINAL_DST

主动健康检查

异常点检查

断路器

负载均衡

动态配置

动态配置可以实现全动态,即实现 LDS (Listener Discovery Service)、CDS (Cluster Discovery Service)、RDS (Route Discovery Service)、EDS (Endpoint Discovery Service),以及 ADS (Aggregated Discovery Service)。

ADS 不是一个实际意义上的 XDS,它提供了一个汇聚的功能,以实现需要多个同步 XDS 访问的时候可以在一个 Stream 中完成的作用。

当使用动态配置时,不需要重新启动 Envoy 进程就可以生效。Envoy 通过从磁盘或网络上的文件读取配置,动态地重新加载配置。

日志

访问日志:配置访问记录器、访问日志过滤

Envoy组件日志:在启动 Envoy 时,我们可以使用 --log-format 命令行选项来定制格式。Envoy 具有多个日志记录器,对于每个日志记录器(例如 main、config、http...),我们可以控制日志记录级别(info、debug、trace)。如果我们启用 Envoy 管理界面并向 /logging 路径发送请求,就可以查看所有活动的日志记录器的名称。

Admin接口

管理接口

3、安装envoy

文档:《https://www.envoyproxy.io/docs/envoy/v1.28.0/start/install》

sudo yum install yum-utils
sudo rpm --import 'https://rpm.dl.getenvoy.io/public/gpg.CF716AF503183491.key'
curl -sL 'https://rpm.dl.getenvoy.io/public/config.rpm.txt?distro=el&codename=7' > /tmp/tetrate-getenvoy-rpm-stable.repo
sudo yum-config-manager --add-repo '/tmp/tetrate-getenvoy-rpm-stable.repo'
sudo yum makecache --disablerepo='*' --enablerepo='tetrate-getenvoy-rpm-stable'
sudo yum install getenvoy-envoy
[root@master1 envoy]# envoy  -c envoy-direct-response.yaml

4、配置文件

静态配置

admin:
  address:
    socket_address: { address: 127.0.0.1, port_value: 9901 }

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 127.0.0.1, port_value: 10000 }
    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
          stat_prefix: ingress_http
          codec_type: AUTO
          route_config:
            name: local_route
            virtual_hosts:
            - name: local_service
              domains: ["*"]
              routes:
              - match: { prefix: "/" }
                route: { cluster: some_service }
          http_filters:
          - name: envoy.filters.http.router
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
  clusters:
  - name: some_service
    connect_timeout: 0.25s
    type: STATIC
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: some_service
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: 127.0.0.1
                port_value: 1234

动态配置

动态配置可以实现全动态,即实现 LDS (Listener Discovery Service)、CDS (Cluster Discovery Service)、RDS (Route Discovery Service)、EDS (Endpoint Discovery Service),以及 ADS (Aggregated Discovery Service)。

ADS 不是一个实际意义上的 XDS,它提供了一个汇聚的功能,以实现需要多个同步 XDS 访问的时候可以在一个 Stream 中完成的作用。

 

posted @ 2023-10-26 22:58  _幸会  阅读(86)  评论(0编辑  收藏  举报