看起来您正在使用静态配置来配置(或计划配置)Envoy,而 Envoy 真正闪耀的地方是当您为它提供动态生成的配置时。两者之间的主要区别在于您有一个服务,您将 Envoy 配置为定期咨询更新,但该服务必须发回的内容看起来与静态配置非常相似。
这就是他们所说的xDS,它包含您可以编写的不同服务,这些服务会生成配置的不同部分。一项服务(您必须提供和运行)可以通过它公开的不同端点有效地提供所有其他服务(例如侦听器发现服务)。Envoy 允许您将其配置为轮询类似REST 的 API、流式 gRPC 服务,甚至查看特定位置的文件(我怀疑这个是您的赢家)。您实际上只需要实现 LDS 即可动态管理 TLS 证书。配置的其余部分可以保持静态。
如果您选择编写 Envoy 咨询配置的动态服务的路线,那么设置它并不复杂,它只需读取磁盘上文件的内容并为 Envoy 提供它在其中找到的任何内容。为此,您只需为Common TLS Context object提供一个内联字符串数据源。除非您拥有数千个证书和侦听器,否则响应正文不会接近您的带宽/内存限制。
我承认,我已经用尽了开始使用 Envoy 的时间来尝试解释他们广泛的面向机器的文档,所以我最终决定为我们的配置选择一个轮询 HTTP 服务。即使每隔几秒钟轮询一次,它也是唯一真正的流量,因此设置和继续运行非常容易。我将谈论这种方法,因为这是我最熟悉的方法。您可能从静态示例之类的东西开始,但要使其更具动态性,您需要做的只是将动态配置移到更下方一点。只需将 REST 替换为 gRPC,因为这样更容易使用和实现REST 端点进一步记录下来。这需要一些试验和错误,但一个好方法就是让服务返回您已经在使用的配置的 JSON 版本。需要注意的一个问题是,您需要在顶级 JSON 对象上添加"type"
和键,该对象引用您返回的事物类型的原型,即对 LDS 服务的响应可能如下所示:"version"
{
"version_info": "0",
"resources": [{
"@type": "type.googleapis.com/envoy.api.v2.Listener",
"name": "http_listener",
"address": "{...}",
"filter_chains": [{
"filters": [
"{...}"
]
}]
}]
}
这并不像我希望在 Python 中工作那么容易。他们在使用 gRPC 的xDS服务器的 Go 中有一个很好的例子,但这并没有像我在Github上找到的其他一些实现xDS服务器的尝试那样帮助我。这个项目对我特别有帮助。此外,如果您已经在动态配置特使,除了特使实例本身的集群标识符之类的稳定事物之外,我还没有遇到任何实际需要热重启的情况。