查看原文
其他

为 Envoy 开启 TLS 验证实战

杨传胜 云原生实验室 2021-05-26

由于微信公众号不能插入外链,请点击 阅读原文 查看原文。

我的博客之前是使用 Nginx 来反代的,由于 Nginx 性能优异,目前有很多国内网站采用 Nginx 作为 Web 服务器,而且参考文档比较丰富,无论是对于其部署,配置还是调优都更为有经验。但是还是会碰到几个绕不开的问题:

  • Nginx 的反向代理不支持 http2/grpc (好像今年 3 月份刚支持)

  • 不像 Envoy 几乎所有的网络配置都可以利用 xDS API 来实现动态变更,Nginx 缺乏有效的配置热变更机制(除非深入开发或者不断地 reload)。

  • Nginx 的很多微服务功能都是要买 Nginx Plus 才有的。

而 Envoy 是一款现代化的,高性能,小体积的边缘及服务代理,浑身散发出一股时尚潮流的气息。作为一名斜杠青年,在经过一定地了解后,我果断入了 Envoy 的坑。

关于如何为 Envoy 开启证书验证可以参考我之间的文章:为 Envoy 启用证书验证。本文将直接进入实战部分,通过 Envoy 来反向代理我的博客静态页面,并且加密客户端和 Envoy 代理之间的所有流量。

1. 方案架构

本方案涉及到两层 Envoy:

  • 首先会有一个前端代理在某个地方单独运行。前端代理的工作是给其他地方提供一个入口。来自外部的传入连接请求到这里,前端代理将会决定他们在内部的转发路径。

  • 其次,博客静态页面由 nginx 提供,同时运行一个 “服务 Envoy”,它与 nginx 容器共享 network nemspace(相当于 Kubernetes 的 Sidecar)。

  • 所有的 Envoy 形成一个网格,然后在他们之间共享路由信息。

注意,通常情况下你也可以只使用前端代理,然后去掉服务 Envoy 这一层。但是,使用完整网格的话,服务 Envoy 可以对应用服务进行健康监控等,让网格知道尝试联系一个挂掉的服务是否是毫无意义的。此外,Envoy 的统计数据收集最适合用在全网格上。

但本文需要开启 TLS 验证,如果前端代理开启了 TLS 验证,那么必须配合服务 Envoy 使用,否则验证将无法通过。

2. 部署服务 Envoy

我的博客是通过 hugo 生成的,其他生成静态页面的软件类似,都可以采用我的方案。由于我的 hugo 根目录是 /home/hugo,首先进入该目录,然后创建容器编排的 docker-compose.yml 文件。

  • ① : 将博客的静态页面挂载到 nginx 的 root 目录。

  • ② : 将服务 Envoy 的配置文件挂载到 Envoy 容器中。

  • ③ : 与 hugo 容器共享 network namespace

  • ④ : 这是我自定义的网络,你可以换成你自己的。

接下来需要创建服务 Envoy 的配置文件 service-envoy.yaml

  • ① 8080 : 服务 Envoy 的监听端口。

  • ② 80 : hugo 静态页面的监听端口。

3. 部署前端代理

在 docker-compose.yml 文件中添加前端代理部分:

创建前端代理需要的配置文件 front-envoy.yaml

  • ① : 编码/解码方式。参考:HttpConnectionManager.CodecType

  • ② : 允许访问的域名(这里使用公网可以访问的域名)。

  • ③ : TLS 监听器支持 ALPN。HTTP 连接管理器使用这个信息(以及协议接口)来确定客户端使用的是 HTTP/1.1还是 HTTP/2

  • ④ : 网站使用的证书。可以通过 Let's Encrypt 申请免费的证书。

其他配置详细说明请参考:为 Envoy 启用证书验证

准备好所有配置以后,我们就可以通过以下命令来启动所有服务了:

$ docker-compose up -d

Creating front-proxy_hugo_1        ... done
Creating front-proxy_front-envoy_1 ... done
Creating front-proxy_service-envoy_1 ... done

接下来就可以通过公网域名访问博客网站啦!没错,你现在浏览的我的博客就是通过 Envoy 反向代理的。




扫一扫关注微信公众号


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存