5

我在 Kubernetes 环境中使用https://github.com/jetstack/cert-manager来自动加载https://letsencrypt.org/。它会创建 90 天后过期的证书。到期前30 天,cert-manager 更新证书并更换证书。证书存储在 k8s 机密中。

你如何让 Envoy Proxy自动重新加载证书?这些问题已关闭,似乎没有答案。有人提到了可以帮助提供解决方案的秘密发现服务 (SDS),但我还没有找到一个解决方案。

对于 nginx,可以通过将 k8s 机密添加到 k8s 卷来配置 TLS,将卷挂载到文件系统以供 nginx 使用。然后可以使用文件系统观察程序调用sudo nginx -s reload在证书更改时重新加载配置。我看到 Envoy Proxy 支持热重启,但是我没有看到类似 nginx 的命令让它热重启。

有一个hot-restarter.py,但它不是文件监视程序,我宁愿不在 envoyproxy/envoy:latest docker 映像上安装 python。我认为可能该程序的某些功能可以内置到一个也可以进行文件监视的 rust 应用程序中,但是对于这种非常常见的情况,必须已经存在一些东西,对吧?

4

1 回答 1

8

看起来您正在使用静态配置来配置(或计划配置)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服务器的尝试那样帮助我。这个项目对我特别有帮助。此外,如果您已经在动态配置特使,除了特使实例本身的集群标识符之类的稳定事物之外,我还没有遇到任何实际需要热重启的情况。

于 2019-09-09T16:33:12.893 回答