Envoy入门实战部署
一、Envoy介绍
官方文档解释:
Envoy是专为大型现SOA(面向服务架构)设置的L7代理和通信总线。该项目源于以下理念:网络对应用程序来说应该是透明的。当网络和应用程序出现问题时,应该很容易确定问题的根源。
为了做到上述目标,Envoy提供了以下高级功能:
- 进程外架构:Envoy是一个独立进程,伴随每个应用程序服务运行。所有的Envoy形成一个透明的通信网格,每个应用程发送消息到本地主机或从本地主机接受消息,但不知道网络拓扑。Envoy可以使用任何应用程序语言,并且易升级部署。
- 现代C++11代码库:性能优异。
- L3/L4过滤器架构、HTTP L7过滤器架构、推荐使用HTTP/2。
- gRPC支持:方便支持gRPC,特别是在负载和代理上。
- 服务发现、健康检查、高级的负载均衡方案、Tracing、统计与监控
- 动态配置:通过动态配置API实现配置的动态调整,而无需重启Envoy服务。
Envoy的一些术语:

二、Envoy实践
1. Service Mesh
Service Mesh用于处理服务间通信的基础设施层,用于在云原生应用复杂的服务拓扑中实现可靠的请求传递。

在实践中,Service Mesh基本来说是一组轻量级的服务代理和应用逻辑的服务在一起,同生共死,并且对于应用服务是透明的。通过sidecar,Service Mesh会抽离为服务中的通用功能,比如服务注册发现,负载均衡,熔断降级,限流扩容,监控等功能,把这些功能放到sidecar中,通过代理proxy的方式于业务服务进行通信。

目前Service Mesh已经进入了以Istio为代表的第二代,由Data Panel(Proxy)、Control Panel两部分组成。Istio是对Service Mesh的产品化实践,帮助微服务实现了分层解耦,架构图如下:

逻辑上Istio分为数据平面(data panel)和控制平面(control panel),数据平面由一些智能代理组成,微服务之间的网络通信,控制平面负责对智能代理进行管理和配置。Istio自己没有实现Data Panel,而是在现有的Data Panel实现上做了Control Panel来达成目标。而今天的主角Envoy作为一个主打的Service Mesh方案的proxy,其设计处处考虑Service Mesh。
2. 快速开始运行简单示例
Envoy目前不提供单独的预先编译好的二进制文件,但提供了Docker镜像。如果希望在Docker容器外使用Envoy,则需要构建它。Envoy提供了两个版本的API,v1和v2,现阶段通常使用v2。v2的API提供了两种方式的访问,一种是HTTP REST方式,一种是GRPC方式。Envoy的启动配置文件分为两种:静态配置和动态配置。静态配置是将所有信息都放在配置文件中,启动的时候直接加载。动态配置需要提供一个Envoy的服务端,用于动态生成Envoy需要的服务发现接口(XDS),通过发现服务来动态的调整配置信息。
让我们通过静态配置方式运行一个简单实例并进行分析。
我们拉取Envoy镜像后,Envoy被安装到/usr/local/bin目录下。envoy进程启动的时候需要指定一些参数,最重要的是--config-yaml参数,用于指定envoy进程启动的时候需要读取的配置文件地址。Docker配置文件默认放在/etc/envoy中,名字为envoy.yaml。所以启动容器的时候需要将自定义的envoy.yaml配置文件挂载到指定目录下替换掉默认的配置文件。
让我们运行一个envoy实例,通过查看默认配置文件来看看默认功能是什么。
$ docker pull envoyproxy/envoy
$ docker run --rm -d -p 10000:10000 --name envoy envoy proxy/envoy
$ docker exec -it envoy /bin/bash #进入envoy容器
$ cat /etc/envoy/envoy.yaml #查看默认配置文件
默认配置文件内容如下:

admin:
access_log_path: /tmp/admin_access.log
address:
socket_address:
protocol: TCP
address: 127.0.0.1
port_value: 9901
static_resources:
listeners:
- name: listener_0
address:
socket_address:
protocol: TCP
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match:
prefix: "/"
route:
host_rewrite: www.google.com
cluster: service_google
http_filters:
- name: envoy.filters.http.router
clusters:
- name: service_google
connect_timeout: 0.25s
type: LOGICAL_DNS
# Comment out the following line to test on v6 networks
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: service_google
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: www.google.com
port_value: 443
transport_socket:
name: envoy.transport_sockets.tls
typed_config:
"@type": type.googleapis.com/envoy.api.v2.auth.UpstreamTlsContext
sni: www.google.com
admin是administration服务必须的配置,address指定监听地址。
static_resources包含了Envoy启动时静态配置的所有内容,而不是Envoy在运行时动态配置的资源。
这个配置表明,实例监听127.0.0.1:10000,支持http协议访问,http访问域名为domains所描述内容时,将流量路由到cluster: service_google服务,即www.google.com:443。
了解配置文件后,我们自己重写一下配置文件:
#为了避免出现Cannot find field错误,建议使用docker cp命令把默认配置文件拷贝到宿主机下,然后进行修改。
$ docker cp envoy:/etc/envoy/envoy.yaml .
$ vim envoy.yaml #按照下面去修改

admin:
access_log_path: /tmp/admin_access.log
address:
socket_address:
protocol: TCP
address: 127.0.0.1
port_value: 9901
static_resources:
listeners:
- name: listener_0
address:
socket_address:
protocol: TCP
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match:
prefix: "/"
route:
# host_rewrite: www.google.com
cluster: some_service
http_filters:
- name: envoy.filters.http.router
clusters:
- name: some_service
connect_timeout: 0.25s
type: LOGICAL_DNS
# Comment out the following line to test on v6 networks
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: some_service
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 127.0.0.1
port_value: 80
transport_socket:
name: envoy.transport_sockets.tls
typed_config:
"@type": type.googleapis.com/envoy.api.v2.auth.UpstreamTlsContext
sni: 127.0.0.1
$ docker run -d -p 10000:10000 -v `pwd`/envoy.yaml:/etc/envoy/envoy.yaml --name envoy envoyproxy/envoy #运行实例,把配置文件挂载到相应目录
$ docker run -d --network=container:envoy --name nginx nginx #在运行一个nginx容器,共享envoy容器网络,以此模拟sidecar
根据配置文件规则,envoy监听10000端口,同时在宿主机端口10000暴漏出来。当有请求到达监听后,envoy会对所有请求路由到some_service这个cluster上,而该cluster的upstream指向本地80端口,也就是nginx服务上。

中途一直报这个错误,然后我把端口换成10001,并注释掉clusters后面的一些内容后,成功访问到nginx服务。(至于为什么,我也不太清楚,还处于摸索状态)。


3. 动态配置实践
我们发现上面envoy.yaml文件中我们的endpoint里的adres是固定的,但实际应用中,比如在k8s集群中,pod的IP不是固定的,我们不可能每次都去修改yaml文件,这个时候就需要用到动态配置了。动态配置可以实现全动态,即实现LDS(Listener Discovery Service)、CDS(Cluster Discovery Service)、RDS(Route Discovery Service)、EDS(Endpoint Discovery Service),以及ADS(Aggregated Discovery Service)。
--service-cluster和--service-node,也可以在envoy.yaml配置文件中指定node.cluster和node.id。
参考连接:
https://blog.csdn.net/huwei0518/article/details/97626386
https://zhuanlan.zhihu.com/p/35830194
https://www.jianshu.com/p/90f9ee98ce70
Envoy入门实战部署的更多相关文章
- Spark入门实战系列--10.分布式内存文件系统Tachyon介绍及安装部署
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Tachyon介绍 1.1 Tachyon简介 随着实时计算的需求日益增多,分布式内存计算 ...
- Spark入门实战系列--2.Spark编译与部署(上)--基础环境搭建
[注] 1.该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取: 2.Spark编译与部署将以CentOS 64位操作系统为基础,主要是考虑到实际应用 ...
- Spark入门实战系列--2.Spark编译与部署(中)--Hadoop编译安装
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .编译Hadooop 1.1 搭建环境 1.1.1 安装并设置maven 1. 下载mave ...
- Spark入门实战系列--2.Spark编译与部署(下)--Spark编译安装
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .编译Spark .时间不一样,SBT是白天编译,Maven是深夜进行的,获取依赖包速度不同 ...
- Spark入门实战系列--5.Hive(上)--Hive介绍及部署
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Hive介绍 1.1 Hive介绍 月开源的一个数据仓库框架,提供了类似于SQL语法的HQ ...
- Spark入门实战系列--3.Spark编程模型(下)--IDEA搭建及实战
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 . 安装IntelliJ IDEA IDEA 全称 IntelliJ IDEA,是java语 ...
- Spark入门实战系列--4.Spark运行架构
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1. Spark运行架构 1.1 术语定义 lApplication:Spark Appli ...
- Spark入门实战系列--6.SparkSQL(上)--SparkSQL简介
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .SparkSQL的发展历程 1.1 Hive and Shark SparkSQL的前身是 ...
- Spark入门实战系列--6.SparkSQL(中)--深入了解SparkSQL运行计划及调优
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1.1 运行环境说明 1.1.1 硬软件环境 线程,主频2.2G,10G内存 l 虚拟软 ...
随机推荐
- Docker学习—Swarm
前言: 前一篇<Docker学习-Machine>中对Machine 进行了学习,本篇继续学习Swarm,那么Swarm是什么呢,有什么用呢?接下来一步步了解. 一.什么是Docker-S ...
- python-基础入门-6快速入门总结
快速入门 程序输出: 1.print语句,字符串用双引号括起来 _在解释器中表示最后一个表达式的值. print语句 与字符串格式(%)结合使用,能实现字符串替换功能. >>>pri ...
- 花了三天整理,Spring Cloud微服务如何设计异常处理机制?还看不懂算我输
前言 首先说一下为什么发这篇文章,是这样的.之前和粉丝聊天的时候有聊到在采用Spring Cloud进行微服务架构设计时,微服务之间调用时异常处理机制应该如何设计的问题.我们知道在进行微服务架构设计时 ...
- H5时代leaflet中还在用DivIcon?
前段时间写了篇<leaflet如何加载10万数据>的文章,有同学反应其中的Canvas-Markers插件不支持DivIcon.我们今天就来聊一聊,为什么这个插件不支持DivIcon,以及 ...
- 如何突出显示PDF文档中的一些重要文本信息
PDF文档中如果存在着太多的文字时,阅读者会容易遗漏很多重要的信息.但如果,文档中存在着一些特殊标记的文字时,比如标黄.标红文本时,很多人都会给予特别关注. 因此,当大家在使用pdfFactory专业 ...
- CDR魔镜插件是什么,有哪些功能?
CDR魔镜插件是一款功能强大的CorelDRAW插件,很多CDR用户很早直接就有接触,因其强大的功能性和快速运行的特点被广大用户所喜爱,没有繁琐的选项,无论新人小白,还是制图高手都能够很快的适应,实现 ...
- FL studio系列教程(十一):FL Studio中如何混音
要想得到"商业"品质的声音,我们就要学会混音.混音就是声音从乐器通道到路由到混音器.混音器中可以设置电平并添加各种效果,比如,添加混响.合唱以及延迟等等,这就是所谓的混音.那么FL ...
- 下载器Folx专业版有没有iTunes整合功能
对于使用Mac系统的用户来说,相信对iTunes都不陌生.Folx专业版提供的iTunes整合功能,能将下载的音频.电影等文件自动同步到iTunes. 该功能将会有助于用户的音频.视频整合,对于喜欢听 ...
- web自动化 下拉框、切换到新窗口
一.下拉框 相信大家在手动测试web页面时,遇到过下拉框吧,那进行web自动化测试时,如何操作下拉框,且看下文 1.selenium中提供了方法,先导入Select方法 from selenium.w ...
- C语言讲义——结构化编程(分支、循环)
顺序结构(从上到下) 分支结构(也叫选择结构) 循环结构 分支结构 if...else 最基本的分支结构是if(){}else{}. 为了代码的安全,同时也是出于代码规范的考虑,if()后面一定要加花 ...