使用Envoy做反向代理服务器
Envoy 代理
一、定义:
Envoy 是一款现代化的,高性能,小体积的边缘及服务代理,可用于容器应用的反代,相比 nginx 的优势:
- 支持 http2/grpc(nginx18 年 3 月份的版本才支持)
- 网络配置可利用 xDS API 来实现动态变更(Nginx 缺乏有效的配置热变更机制)
- 全面拥抱微服务(Nginx 的很多微服务功能都是要买 Nginx Plus 才有)
二、 架构与基本术语:
参考:https://jimmysong.io/posts/envoy-archiecture-and-terminology/
【示例】使用 Envoy 作为前端代理:https://jimmysong.io/posts/envoy-as-front-proxy/
【示例】用 Envoy+Docker 打造轻量级 Sidecar 代理:https://osswangxining.github.io/envoy/
三、配置说明:
Envoy 中的配置包括两大类:listenner 配置和 cluster 配置:
【Listener】:envoy 的路由规则,在 edge envoy 中表示流量进出 mesh 时候的规则相当于 kubernetes 中的 ingress;在 service envoy 中表示定义 host 组及 host 的监听地址;
- 作用( edge envoy 中):指定一个入口及后端 service cluster 路由
- 作用(service envoy):定义 host 组及 host 的监听地址
- cluster.hosts 动态配置参考:https://juejin.im/post/5ad6fb06518825364001f619
【Cluster】:Service envoy 的集合,服务 envoy 是跟每个 serivce 实例一起运行的,应用程序无感知的进程外工具,在 kubernetes 中会与应用容器以 sidecar 形式运行在同一个 pod 中;
- 作用:创建后端 service cluster 供入口 envoy 调用
- 在 非 istio 环境、edge envoy 的 cluster.type 为 strict_dns、后端 service 启动多个 pods 时,在 edge-envoy 内部访问 cluster.name 的 svc 时不能轮询访问后端 pods,只能访问其中一个,因为该负载均衡不再通过 kube-proxy 实现,需要一个 SDS(服务发现服务)来发现服务的所有的 endpoint,我们将修改 lb_type,使用 sds 替代 strict_dns,参考:https://jimmysong.io/posts/envoy-mesh-in-kubernetes-tutorial/
四、实践/参考:
【实践】cluster.hosts 动态配置参考:https://juejin.im/post/5ad6fb06518825364001f619
【实践】为 Envoy 开启 TLS :https://mp.weixin.qq.com/s/Bk5iq1dUoOJI4q-Ffil8rg
为 Envoy 启用证书验证:https://www.yangcs.net/posts/setting-up-ssl-in-envoy/
【实践】一套应用:
- 在你的笔记本上运行 Envoy:https://www.yangcs.net/posts/run-envoy-on-your-laptop/
- Envoy 的 HTTP 路由解析:https://www.yangcs.net/posts/routing-basics/
- 通过 Envoy 实现增量部署:https://www.yangcs.net/posts/incremental-deploys/
- 为 Envoy 启用证书验证:https://www.yangcs.net/posts/setting-up-ssl-in-envoy/
- 将服务发现与 Envoy 集成(为 Envoy 配置 CDS 和 EDS):https://www.yangcs.net/posts/integrating-service-discovery-with-envoy/
- 通过控制平面提供路由:https://www.yangcs.net/posts/routing-with-a-control-plane/
- Envoy 熔断器的原理和使用:https://www.yangcs.net/posts/circuit-breaking/
五、问题:
edge envoy 时怎么发现 Service envoy 的 cluster 的(下游主机是怎么通过 Envoy 与上游主机交互的)?
ps:内置一个 dns 服务器?