理员视图
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)。一旦特使代理就位,就可以对其进行扩展,以支持负载平衡、健康状况检查和度量。