常用的构建方法
https://skyao.io/learning-envoy/
手动配置构建环境,手动构建Envoy。
使用Envoy提供的预制于Docker中的构建环境进行手动构建二进制Envoy
使用Envoy提供的预制于Docker中的构建环境进行手动构建二进制Envoy,并直接将Envoy程序打包成Docker镜像
提供Bootstrap配置文件,存在使用xDS的动态资源时,还需要基于文件或管理服务器向其提供必须的配置信息
- 也可使用Envoy的配置生成器生成示例性配置
基于Bootstrap配置文件启动Envoy实例
- 直接启动二进制Envoy
- 于Kubernetes平台基于Sidecar的形式运行Envoy,或运行单独的Envoy Pod(Edge Proxy)
启动Envoy
启动Envoy时,需要通过(-c 选项为其指定初始配置文件以提供引导配置(Bootstrap configuration),这也是使用v2APl的必然要求;
| |
扩展名代表了配置信息的组织格式;
引导配置是Envoy配置信息的基点,用于承载Envoy的初始配置,它可能包括静态资源和动态资源的定义
静态资源(static_resources)于启动直接加载
动态资源(dynamic_resources)则需要通过配置的xDS服务获取并生成
通常,Listener 和 Cluster 是Envoy得以运行的基础,而二者的配置可以全部为静态格式,也可以混合使用动态及静态方式提供,或者全部配置为动态;
一个yaml格式纯静态的基础配置框架类似如下所示:
| |
Listener 简易静态配置
侦听器主要用于定义Envoy监听的用于接收Down streams请求的套接字、用于处理请求时调用的过滤器链及相关的其它配置属性;目前envoy仅支持tcp的协议
| |
L4过滤器echo主要用于演示网络过滤器APl的功能,它会回显接收到的所有数据至下游的请求者;在配置文件中调用时其名称为 envoy.echo ;
下面是一个最简单的静态侦听器配置示例:
| |
Cluster 静态配置
通常,集群代表了一组提供相同服务的上游服务器(端点)的组合,它可由用户静态配置,也能够通过CDS动态获取;
集群需要在“预热”环节完成之后方能转为可用状态,这意味着集群管理器通过DNS解析或EDS服务完成端点初始化,以及健康状态检测成功之后才可用;
| |
静态Cluster的各端点可以在配置中直接给出,也可借助DNS服务进行动态发现;
下面的示例直接给出了两个端点地址
| |
filter
tcp_proxy
TCP代理过滤器在下游客户端及上游集群之间执行1:1网络连接代理
- 它可以单独用作隧道替换,也可以同其他过滤器(如MongoDB过滤器或速率限制过滤器)结合使用;
- TCP代理过滤器严格执行由全局资源管理于为每个上游集群的全局资源管理器设定的连接限制
- TCP代理过滤器检查上游集群的资源管理器是否可以在不超过该集群的最大连接数的情况下创建连接;
- TCP代理过滤器可直接将请求路由至指定的集群,也能够在多个目标集群间基于权重进行调度转发;
配置示例:
| |
下面的示例基于TCP代理将下游用户(本机)请求代理至外部的(egress)两个web服务器
| |
| |
http_connection_manager
http_connection_manager 通过引入L7过滤器链实现了对http协议的操纵,其中router过滤器用于配置路由转发;
| |
处理请求时,Envoy首先根据下游客户端请求的 host 来搜索虚拟主机列表中各 virtual_host 中的domains 列表中的定义,第一个匹配到的 Domain 的定义所属的 virtual_host 即可处理请求的虚拟主机;
而后搜索当前虚拟生机中的 routes 列表中的路由列表中各路由条目的 match 的定义,第一个匹配到的 match 后的路由机制(route.redirect或direct_response)即生效;
route_config.virtual_hosts.routes 配置的路由信息用于将下游的客户端请求路由至合适的上游集群中某Server上;
- 其路由方式是将url匹配match字段的定义
match字段可通过prefix(前级)、path(路径)或regex(正则表达式)三者之一来表示匹配模式;
- 与match相关的请求将由
route、redirect或direct_response三个字段其中之一完成路由; - 由route定义的路由目标必须是
cluster(上游集群名称)、cluster_header(根据请求标头中的cluster_header的值确定目标集群)或weighted_clusters(路由目标有多个集群,每个集群拥有一定的权重)其中之一;
| |
Egress代理配置示例
下面是一个egree类型的Envoy配置示例,定义了两个virtual_host,不过,发往第二个virtual_host的请求将被重定向至第一个。
| |
| |
测试结果
| |
ingress 配置示例
| |
| |
