Day12-Envoy
1.Envoy Basics
1.1什么是Envoy
https://www.servicemesher.com/envoy/intro/what_is_envoy.html
Envoy 是专为大型现代 SOA(面向服务架构)架构设计的 L7 代理和通信总线。
该项目源于以下理念:
- 网络对应用程序来说应该是透明的。
- 当网络和应用程序出现问题时,应该很容易确定问题的根源。
Envoy 提供了以下高级功能:
(1)进程外架构; (7)gRPC支持
(2)L3/L4 filter 架构; (8)服务发现和动态配置
(3)HTTP L7 filter 架构; (9)健康检查
(4)顶级 HTTP/2 支持; (10)高级负载均衡
(5)顶级 HTTP/3 支持(currently in alpha); (11)前端/边缘代理支持
(6)HTTP L7 路由; (12)最佳的可观察性



1.2Envoy组件拓扑



1.3Envoy xDS核心术语


Envoy API常用术语:
主机(Host):一个具有网络通信能力的端点,例如服务器、移动智能设备等
集群(Cluster):集群是Envoy连接到的一组逻辑上相似的端点;在v2中,RDS通过路由指向集群,CDS提供集群配置,而Envoy通过EDS发现集群成员,即端点;
下游(Downstream)下游主机连接到Envoy,发送请求并接收响应,它们是Envoy的客户端;
上游(Upstream):上游主机接收来自Envoy的连接和请求并返回响应,它们是Envoy代理的后端服务器;
端点(Endpoint):端点即上游主机,是一个或多个集群的成员,可通过EDS发现;
侦听器(Listener):侦听器是能够由下游客户端连接的命名网络位置,例如端口或unix域套接字等;
位置(Locality):上游端点运行的区域拓扑,包括地域、区域和子区域等;
管理服务器(Management Server):实现v2 API的服务器,它支持复制和分片,并且能够在不同的物理机器上实现针对不同xDS API的API服务;
地域(Region):区域所属地理位置;
区域(Zone):AWS中的可用区(AZ)或GCP中的区域等;
子区域:Envoy实例或端点运行的区域内的位置,用于支持区域内的多个负载均衡目标;
xDS:CDS、EDS、HDS、LDS、RLS(Rate Limit)、RDS、SDS、VHDS和RTDS等API的统称;
(Cluster Discovery Server、EndPoint Discovery Server、Listener Discover Server、Rate Limit Server、Route Discovery Server、Secret Discovery Server、、)
Mesh和Envoy Mesh。
1.4Envoy的部署类型
Envoy通常用于以容器编排系统为底层环境的服务网络中,并以sidecar的形式与主程序运行为单个Pod;非编排系统环境中测试时,可以将主程序与Envoy运行于同一容器,或手动组件主程序容器与Envoy容器共享同一网络名称空间;






1.5Envoy核心配置组件
- Listener
- Filter
- Cluster
....
1.7Envoy线程模型和连接处理机制


2.Envoy快速入门
构建Enovy及相关的工具程序
基于容器镜像运行Envoy实例
配置生成器脚本及配置模板生成配置文件
校验配置文件
Listener及配置示例
Cluster及配置示例
TCP Proxy简单应用
HTTP connection manager简单应用
HTTP L7路由配置
Admin Interface
克隆http://github.com/ikubernetes/上的servicemesh-in-practise仓库,将课堂上演示到的内容,于自己的主机上完成测试。
- Envoy is usable in a variety of different scenarios,however it's most userful when deployed as a mesh across all hosts in an infrastructure。
- Envoy通常用于以容器编排系统为底层环境的服务网格中,并以sidecar的形式与主程序容器运行为单个Pod;
- 非编排系统环境中测试时,可以将主程序与Envoy运行于同一容器,或手动组织主程序容器与Envoy容器共享同一网络名称空间;
- Front Proxy类型的Envoy可以独立运行为守护进程或容器。
具体使用时的常见部署类型如下:

2.1 构建Enovy及相关的工具程序
2.2 基于容器镜像运行Envoy实例
2.3 配置生成器脚本及配置模板生成配置文件
2.4 校验配置文件
2.5 Listener及配置示例
2.6 Cluster及配置示例
通常,集群代表了一级提供相同服务的上游服务器(端点)的组合,它可由用户静态配置,也能够通过CDS动态获取;
集群需要在“预热”环节完成之后方能转为可用状态,这意味着集群管理器通过DNS解析或EDS服务完成端点初始化,以及健康状态检测成功之后才可用。
clusters:
- name: local_cluster # 集群的惟一名称,且未提供alt_stat_name时将会被用于统计信息中;
alt_state_name: xxx # 统计信息中使用的集群代名称;
connect_timeout: 0.25s
type: STATIC # 用于解析集群(生成集群端点)时使用的服务发现类型,可用值有STATIC、STRICT_DNS、LOGICAL_DNS、ORIGINAL_DST和EDS等;
lb_policy: ROUND_ROBIN # 负载均衡算法,支持ROUND_ROBIN、LEAST_REQUEST、RING_HASH、RANDOM、MAGLEV和CLUSTER_PROVIDED;
load_assignment: # 为STATIC、STRICT_DNS或LOGICAL_DNS类型的集群指定成员获取方式;EDS类型的集成要使用eds_cluster_config字段配置;
cluster_name: local_cluster # 集群名称;
endpoints: # 端点列表;
- locality: {} # 标识上游主机所处的位置,通常以region、zone等进行标识;
- lb_endpoints: # 属于指定位置的端点列表;
- endpoint_name: ... # 端点的名称;
endpoint: # 端点定义;
address:
socket_address: { address: 172.31.1.11, port_value: 8080 }
# 端点地址标识; # 端点地址; # 端点端口; # 协议类型;
Cluster配置示例:

2.7 TCP Proxy简单应用
TCP代理过滤器在下游客户端及上游集群之间执行1:1网络连接代理
◼ 它可以单独用作隧道替换,也可以同其他过滤器(如MongoDB过滤器或速率限制过滤器)结合使用;
◼ TCP代理过滤器严格执行由全局资源管理于为每个上游集群的全局资源管理器设定的连接限制
◆ TCP代理过滤器检查上游集群的资源管理器是否可以在不超过该集群的最大连接数的情况下创建连接;
◼ TCP代理过滤器可直接将请求路由至指定的集群,也能够在多个目标集群间基于权重进行调度转发;
配置语法:
{
"stat_prefix": "...", # 用于统计数据中输出时使用的前缀字符;
"cluster": "...", # 路由到的目标集群标识;
"weighted_clusters": "{...}",
"metadata_match": "{...}",
"idle_timeout": "{...}", # 上下游连接间的超时时长,即没有发送和接收报文的超时时长;
"access_log": [], # 访问日志;
"max_connect_attempts": "{...}" # 最大连接尝试次数;
}

2.8 HTTP connection manager简单应用
http_connection_manager通过引入L7过滤器链实现了对http协议的操纵,其中router过滤器用于配置路由转发;
listeners:
- name:
address:
socket_address: { address: ..., port_value: ..., protocol: ... }
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: ... # 统计信息中使用的易读性的信息前缀;
route_config: # 静态路由配置;动态配置应该使用rds字段进行指定;
name: ... # 路由配置的名称;
virtual_hosts: # 虚拟主机列表,用于构成路由表;
- name: ... # 虚拟主机的逻辑名称,用于统计信息,与路由无关;
domains: [] # 当前虚拟主机匹配的域名列表,支持使用“*”通配符;匹配搜索次序为精确匹配、前缀通配、后缀通配及完全通配;
routes: [] # 指定的域名下的路由列表,执行时按顺序搜索,第一个匹配到路由信息即为使用的路由机制;
http_filters: # 定义http过滤器链
- name: envoy.filters.http.router # 调用7层的路由过滤器
提示:
◼处理请求时,Envoy首先根据下游客户端请求的“host”来搜索虚拟主机列表中各virtual_host中的domains列表中的定义,第一个匹配到的Domain的定义所属的virtual_host即可处理请求的虚拟主机;
◼而后搜索当前虚拟主机中的routes列表中的路由列表中各路由条目的match的定义,第一个匹配到的match后的路由机制(route、redirect或direct_response)即生效;
2.9 HTTP L7路由配置

2.10 Admin Interface
3.Administration interface和Layered Runtime基础
ff
4.Front Proxy and TLS
在Envoy Mesh中,作为Front Proxy的Envoy通常是独立运行的进程,它将客户端请求代理至Mesh中的各Service,而这些Service中的每个应用实例都会隐藏于一个Sidecar Proxy模式的enovy实例背后。

Envoy Mesh中的TLS模式大体有如下几种场景:
(1)Front Proxy面向下游客户端提供https服务,但Front Proxy、Mesh内部的各服务间依然使用http协议;(https---http)
(2)Front Proxy面向下游客户端提供https服务,而且Front Proxy、Mesh内部各服务间也使用https协议;(https---https)
但是内部各Service间的通信也有如下两种情形;
- 仅客户端验证服务端证书;
- 客户端与服务端之间互相验证彼此的证书(mTLS)
(3)Front Proxy直接以TCP Proxy的代理模式,在下游客户端与上游服务端之间透传tls协议;
- https-passthrough;
- 集群内部的东西向流量同样工作于https协议模型;
4.1 TLS Front Proxy
仅需要配置Listener面向下游客户端提供tls通信,下面是Front Proxy Envoy的配置示例;

4.2 Upstream and downstream TLS
除了Listener中面向下游提供tls通信,Front Proxy还要以tls协议与Envoy Mesh中各Service建立tls连接;
下面示例左侧是Envoy Mesh中的某Service的Sidecar Proxy Envoy的配置示例,右侧是Front Proxy Envoy中的Cluster面向上游通信的配置示例。

4.3 Front Proxy https passthrough
TLS passthrough模式的Front Proxy需要使用TCP Proxy类型的Listener,Cluster的相关配置中也无需再指定transport_socket相关的配置;
但Envoy Mesh中各Service需要基于tls提供服务。

5.xDS API与动态配置
xDS API概述
Envoy动态配置及配置源
xDS Protocol
基于文件系统的DS和CDS订阅示例
基于REST-API的订阅示例
基于gRPC订阅示例
ADS配置格式

浙公网安备 33010602011771号