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等
集群
- 一组上游主机的逻辑组合
- 每个主机映射为集群中的一个端点
- 下游的请求被调度至上游主机
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等;
上游集群(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支持纯静态定义方式来指 定端点,也允许以动态方式发现各端点,甚至还支持自定义的发现机制
- 支持用户定义多种高级功能,例如,负载均衡策略、主动健康状态检查、被动健康状态检查和断路器等;
{
"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": "..."
}
仅登录用户可评论,点击 登录