Envoy配置概述

  • 启动时,首先会从Bootstrap配置文件中加载初始配置

    • 静态配置

      • 配置直接提供配置信息
  • 动态配置

    • xDS API

      • 从bootstrap配置文件加载初始配置,包括要使用的各类服务发现相关的管理服务器
      • 从管理服务器(Management Server)基于xDS API加载配置
    • runtime

      • 某些关键特性(Feature flags)可保存为key/value数据
      • 支持多层(layer)配置和覆盖机制,可用的层包括admin和文件系统等
  • 启用全动态配置机制后,仅极少数场景需要重新启动Envoy进程

    • 支持热重启

Envoy的常用配置方式

  • 纯静态配置
    在bootstrap配置文件中直接提供Listener、Filter Chain、Cluster及HTTP路由(http代理场景),上游端点的发现仅可通过DNS服务进行,且配置的重新加载必须通过内置的热重启(hot restart)完成
  • 仅使用EDS

    • 基于EDS进行端点发现,该方式可有效规避DNS发现方式的限制(响应中的最大记录数等)
  • 使用EDS和CDS

    • 基于CDS发现上游集群,从而能够以优雅的方式添加、更新和删除上游集群
    • 发现的集群中,其端点再经由配置的EDS管理服务器进行动态发现
  • EDS、CDS和RDS

    • 基于RDS动态发现路由配置
    • RDS同EDS、CDS一起使用,可为用户提供了构建复杂路由拓扑的能力(流量转移、蓝/绿部署等)
  • EDS、CDS、RDS和LDS

    • 基于LDS动态发现侦听器配置,包括内嵌的过滤器链
    • 启用此四种发现服务,除了较罕见的配置变动、证书轮替或更新Envoy程序之外,几乎无须再热重启Envoy
  • EDS、CDS、RDS、LDS和SDS

    • 基于SDS动态发现侦听器密钥相关的证书、私钥及TLS会话票据,以及对证书验证逻辑的配置(受信任的根证书和撤销机制等)
    • 可实现证书的动态轮换等功能

Envoy配置中的重要概念

  • Bootstrap配置中几个重要的基础概念

    • node:节点标识,以呈现给管理服务器并且例如用于标识目的;
    • static_resources:静态配置的资源,用于配置静态的listener、cluster和 secret;
    • dynamic_resources:动态配置的资源,用于配置基于xDS API获取listener、 cluster和secret配置的lds_config、cds_config和ads_config;
    • admin:Envoy内置的管理接口;
    • tracing:分布式跟踪;
    • layered_runtime:层级化的运行时,支持使用RTDS从管理服务器动态加载;
    • hds_config:使用HDS从管理服务器加载上游主机健康状态检测相关的配置;
    • overload_manager:过载管理器;
    • stats_sinks:统计信息接收器;
  • 一般来说,侦听器和集群是最为常用基础配置,无论是以静态或者是动态方式提供;

侦听器和集群配置基础

  • 侦听器

    • 接收客户端请求的入口端点,通常由监听的套接字及调用的过滤器链所定义
    • 代理类的过滤器负责路由请求,例如tcp_proxy和http_connection_manager等
  • 集群

    • 一组上游主机的逻辑组合
    • 每个主机映射为集群中的一个端点
    • 下游的请求被调度至上游主机

Envoy_Communication_direction_diagram

Listeners(侦听器)

  • Envoy配置支持一个进程中任意数量的侦听器。

    • 独立部署时,建议每个主机仅部署单个Envoy实例,并在必要时于此实例上运行一到多个侦听器;
    • Enovy支持TCP和UDP两种类型的侦听器;
  • 每个侦听器都独立配置了一些网络级(L3/L4)过滤器。

    • 侦听器收到的连接请求将由其过滤器链中的各过滤器进行处理;
    • 通用侦听器体系结构用于执行Envoy所用于的绝大多数不同的代理任务

      • rate limiting
      • TLS client authentication
      • HTTP connection management
      • raw TCP proxy
      • etc.

Listeners配置项示例;

{
"name": "...",
"address": "{...}",
"stat_prefix": "...",
"filter_chains": [], "use_original_dst": "{...}",
"default_filter_chain": "{...}",
"per_connection_buffer_limit_bytes": "{...}", "metadata": "{...}",
"drain_type": "...", "listener_filters": [], "listener_filters_timeout": "{...}",
"continue_on_listener_filters_timeout": "...",
"transparent": "{...}",
"freebind": "{...}",
"socket_options": [], "tcp_fast_open_queue_length": "{...}", "traffic_direction": "...",
"udp_listener_config": "{...}",
"api_listener": "{...}",
"connection_balance_config": "{...}",
"reuse_port": "...",
"access_log": [],
"tcp_backlog_size": "{...}",
"bind_to_port": "{...}"
}

Network (L3/L4) filters(过滤器)

  • 网络级(L3/L4)过滤器构成Envoy连接处理的核心。

    • 过滤器API允许混合和匹配不同的过滤器集,并将其附加到给定的侦听器。
    • 有三种不同类型的网络筛选器:

      • 读取(Read):当Envoy从下游连接接收数据时,会调用读取过滤器。
      • 写入(Write):当Envoy将数据发送到下游连接时,会调用写入筛选器。
      • 读/写(Read/Write):当Envoy从下游连接接收数据时以及将要向下游连接发送数据时,都会调用读/写过滤器。
    • 网络级过滤器的API相对简单,因为过滤器最终对原始字节和少量连接事件进行操作
    • 链中的过滤器可以停止,然后继续迭代到其他过滤器。
  • 网络过滤器访问和操作L4连接上的原始数据,即TCP数据包

    • 例如,TCP代理过滤器将客户端连接数据路由到上游主机,并生成连接统计信息等
  • Enovy内置了许多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 connection manager

    • HTTP connection manager自身是L3/L4过路器,它能够将原始字节转换为HTTP级别消息和事件(例如, headers和body等)
    • 它还处理所有HTTP连接和请求的通用功能,例如访问日志记录、请求ID生成与跟踪、请求/响应头操作、路由表管理以及统计信息等。
    • Envoy还支持在HTTP连接管理器中使用HTTP级过滤器堆栈;

      • HTTP过滤器在L7运行,它们访问和操作HTTP请求和响应;例如,gRPC-JSON Transcoder Filter为gRPC后端公开REST API,并将请求和响应转换为相应的格式;
      • 常用的HTTP过路器有Router、Rate limit、Health check、Gzip和Fault Injection等;

Network_filters_and_HTTP_filters

上游集群(Upstream clusters)

  • Envoy可配置任意数量的上游集群,并使用Cluster Manager进行管理;

    • 由集群管理器负责管理的各集群可以由用户静态配置,也可借助于CDS API动态获取;
    • 集群中的每个成员由endpoint进行标识,它可由用户静态配置,也可通过EDS或DNS服务动态发现;

      • Static:静态配置
      • Strict DNS:严格DNS,Envoy将持续和异步地解析指定的DNS目标,并将DNS结果中的返回的每个IP地址视为上游集群中可用成员;
      • Logical DNS:逻辑DNS,集群仅使用在需要启动新连接时返回的第一个IP地址,而非严格获取DNS查询的结果并假设它们构成整个上游集群;适用于必须通过DNS访问的大规模Web服务集群;
      • Original destination:当传入连接通过iptables的REDIRECT或TPROXY target或使用代理协议重定向到Envoy时,可以使用原始目标集群;
      • Endpoint discovery service (EDS):EDS是一种基于GRPC或REST-JSON API的xDS管理服务器获取集群成员的服务发现方式;
      • Custom cluster:Envoy还支持在集群配置上的cluster_type字段中指定使用自定义集群发现机制;
  • 每个Cluster主要由集群名称,以及集群中的端点(通常是提供服务的IP地址和端口)所组成
  • Envoy Cluster支持纯静态定义方式来指 定端点,也允许以动态方式发现各端点,甚至还支持自定义的发现机制
  • 支持用户定义多种高级功能,例如,负载均衡策略、主动健康状态检查、被动健康状态检查和断路器等;
    Upstream_cluster
{
  "transport_socket_matches": [],
  "name": "...",
  "alt_stat_name": "...",
  "type": "...",
  "cluster_type": "{...}",
  "eds_cluster_config": "{...}",
  "connect_timeout": "{...}", 
  "per_connection_buffer_limit_bytes": "{...}", 
  "lb_policy": "...",
  "load_assignment": "{...}", 
  "health_checks": [], 
  "max_requests_per_connection": "{...}", 
  "circuit_breakers": "{...}", 
  "upstream_http_protocol_options":  "{...}", 
  "common_http_protocol_options":  "{...}", 
  "http_protocol_options":  "{...}",
  "http2_protocol_options":  "{...}", 
  "typed_extension_protocol_options":  "{...}",
  "dns_refresh_rate": "{...}",
  "dns_failure_refresh_rate": "{...}",
  "respect_dns_ttl": "...",
  "dns_lookup_family": "...",
  "dns_resolvers": [],
  "use_tcp_for_dns_lookups": "...",
  "outlier_detection": "{...}",
  "cleanup_interval": "{...}",
  "upstream_bind_config": "{...}",
  "lb_subset_config": "{...}",
  "ring_hash_lb_config": "{...}",
  "maglev_lb_config": "{...}",
  "original_dst_lb_config": "{...}",
  "least_request_lb_config": "{...}",
  "common_lb_config": "{...}",
  "transport_socket": "{...}",
  "metadata": "{...}",
  "protocol_selection": "...",
  "upstream_connection_options":  "{...}",
  "close_connections_on_host_health_failure":  "...",
  "ignore_health_on_host_removal":  "...",
  "filters": [],
  "track_timeout_budgets": "...",
  "upstream_config": "{...}",
  "track_cluster_stats": "{...}",
  "preconnect_policy": "{...}",
  "connection_pool_per_downstream_connection":  "..."
}
最后修改:2024 年 06 月 21 日
如果觉得我的文章对你有用,请随意赞赏