【问题标题】:How to automatically load new TLS Certificates for Envoy Proxy?如何为 Envoy 代理自动加载新的 TLS 证书?
【发布时间】:2019-01-04 00:03:20
【问题描述】:

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

如何让 Envoy 代理到 automatically reload the certificates?这些问题已关闭,似乎没有答案。有一些秘密发现服务 (SDS) 的 mention 可以帮助提供解决方案,但我还没有找到一个解决方案。

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

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

【问题讨论】:

  • 嗨。您终于找到关于自动证书重新加载的解决方案了吗?
  • @ChaoxiangN 我没有。我曾梦想将 hot-restarter.py 翻译成 rust,但这从未发生过。

标签: ssl lets-encrypt envoyproxy cert-manager


【解决方案1】:

看起来您正在使用静态配置来配置(或计划配置)Envoy,而 Envoy 真正闪耀的地方是当您为其提供动态生成的配置时。两者之间的主要区别在于您有一个服务,您将 Envoy 配置为定期咨询更新,但该服务必须发回的内容看起来与静态配置非常相似。

这就是他们所说的xDS,它包含您可以编写的不同服务,这些服务会生成配置的不同部分。一项服务(您必须提供和运行)可以通过它公开的不同端点有效地提供所有其他服务(例如侦听器发现服务)。 Envoy 允许您将其配置为在特定位置轮询 REST-like APIstreaming gRPC service 甚至是 watch a file(我怀疑这是你的赢家)。您实际上只需要实现 LDS 即可动态管理 TLS 证书。配置的其余部分可以保持静态。

如果您选择编写 Envoy 咨询配置的动态服务的途径,那么设置它并不复杂,它只需读取磁盘上文件的内容并为 Envoy 提供它在其中找到的任何内容。为此,您只需为Common TLS Context object 提供inline string data source。除非您拥有数千个证书和侦听器,否则响应正文不会接近您的带宽/内存限制。

我承认,我已经用尽了开始使用 Envoy 的时间,试图解释他们广泛的面向机器的文档,因此我最终决定为我们的配置选择一个轮询 HTTP 服务。即使每隔几秒钟轮询一次,它也是唯一真正的流量,因此设置和继续运行非常容易。我将谈论这种方法,因为这是我最熟悉的方法。 您可能从static example 之类的东西开始,但您需要做的就是将其移至更下方的dynamic configuration。只需将 REST 替换为 gRPC,因为这更容易使用并实现进一步记录的REST endpoints。这需要一些尝试和错误,但一个好方法就是让服务返回您已经在使用的配置的 JSON 版本。需要注意的一个问题是,您需要在顶级 JSON 对象上添加 "type""version" 键,这些键引用您返回的事物类型的原型,即对 LDS 服务的响应可能看起来像这样:

{
    "version_info": "0",
    "resources": [{
        "@type": "type.googleapis.com/envoy.api.v2.Listener",
        "name": "http_listener",
        "address": "{...}",
        "filter_chains": [{
            "filters": [
                "{...}"
            ]
        }]
    }]
}

这并不像我希望开始使用 Python 那样容易。他们在使用 gRPC 的 xDS 服务器的 Go 中有一个很好的例子,但这对我的帮助几乎没有通过其他一些尝试实现 xDS 我在Github 上找到的服务器。 This project 对我特别有帮助。此外,如果您已经在动态配置特使,而不是像特使实例本身的集群标识符这样的稳定​​事物,那么我还没有遇到任何实际需要热重启的情况。

【讨论】:

    猜你喜欢
    • 2021-06-12
    • 2021-06-12
    • 2018-03-29
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    相关资源
    最近更新 更多