理员视图

Envoy 提供给了 admin 视图,可以查看配置、状态、日志和 Envoy 的其他数据。

通过添加额外资源定义来定义 admin,其中也定义了 admin 试图的接口。需要注意的是,这个接口不能与其他监听接口冲突。

admin:

access_log_path: /tmp/admin_access.log

address:

socket_address: { address: 0.0.0.0, port_value: 9901 }

启动Admin

Docker容器也要暴露 admin 的接口给外部通信用。上面的资源配置就可以启动 admin 试图的 Demo。

docker run --name=proxy-with-admin -d \

-p 9901:9901 \

-p 10000:10000 \

-v $(pwd)/envoy/envoy.yaml:/etc/envoy/envoy.yaml \

envoyproxy/envoy:latest

在admin 的接口中允许执行一些破坏性的操作,比如,关闭服务器,也可以访问到一些内部信息,比如,统计信息、cluster 名称、证书信息等等,所以,对于admin 的开放还是要谨慎,充分评估好安全,避免发生不必要的安全问题。

路由到 Docker 容器

下面将使用 Envoy 基于请求URL 的地址来代理流量到不同的 Python 服务上。

配置

因为 Docker Compose 能够帮我们同时运行多个容器,所以下面就通过 Docker Compose 配置文件来定义应用程序的运行,其中一个容器 front-envoy 是代理,其余的是单独的服务。

详细的 Docker Compose 配置如下:


应用程序

下面使用 Python 创建一个 Web 应用程序,这个应用程序还在容器中使用Envoy 将流量转发给 Python 应用程序,它无需使用Envoy 作为应用程序的前置代理。


Envoy 代理

下面是 Envoy 配置的定义文件:


简答解释一下上面配置的其中两部分:


这一部分就是路由配置,它将会根据路由把流量转发到不同的服务。


这一部分的 cluster 配置是真正处理转发过来流量的节点,service1和 service2。Docker 网络提供了DNS 的解析,使用 Docker Compose 把这些Dokcer 组合运行起来。

部署

使用 Docker Compose 开始这个Demo:


admin 视图

启动之后,admin 视图的访问结果如下:


也可以在视图中以 json 的形式配置信息:


一些服务器的状态信息也可以看到:


应用程序路由

使用 Envoy 监听 8000 端口,并且可以处理我们的请求。基于URL 的规则,根据不同的配置响应不同的服务。

curl localhost:8000/service/1curl localhost:8000/service/2

root@ip-10-1-254-41:/home/ubuntu/workspace/envoy/examples/front-proxy# curl localhost:8000/service/1

Hello from behind Envoy (service 1)! hostname: f70940b84fdf resolvedhostname: 172.18.0.2

root@ip-10-1-254-41:/home/ubuntu/workspace/envoy/examples/front-proxy# curl localhost:8000/service/2

Hello from behind Envoy (service 2)! hostname: 685e30c9c8fb resolvedhostname: 172.18.0.3

root@ip-10-1-254-41:/home/ubuntu/workspace/envoy/examples/front-proxy#


总结

加上前面的两次,一共分享了三次,主要介绍了:

1. 怎么样配置 Envoy 作为反向代理到其他的站点

2. 怎么样转发流量到 Docker 容器

3. 怎么样根据路由控制流量目标

对 Envoy 有充分的了解之后,就会发现,可以通过扩展的方式达到支持负载均衡、健康检查和度量指标(metrics)。一旦特使代理就位,就可以对其进行扩展,以支持负载平衡、健康状况检查和度量。