如何为Envoy Proxy自动加载新的TLS证书



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

如何让Envoy Proxy自动重新加载证书?这些问题已经结束,似乎没有得到解决。有人提到一个秘密发现服务(SDS)可以帮助提供一个解决方案,但我还没能想出一个。

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

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

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

这就是他们所说的xDS,它包含了您可以编写的生成配置不同部分的不同服务。这一服务(您必须提供并运行)可以通过其公开的不同端点有效地提供所有其他服务(例如侦听器发现服务)。Envoy允许您将其配置为轮询类似RESTAPI的API、流式gRPC服务,甚至在特定位置观看文件(我怀疑这一个是您的赢家)。您实际上只需要实现LDS即可动态管理TLS证书。配置的其余部分可以保持静态。

如果您选择编写Envoy为配置而咨询的动态服务的途径,那么设置它并不复杂,这样它只读取磁盘上文件的内容,并向Envoy提供它在其中找到的任何内容。为此,您可以为Common TLS Context对象提供一个内联字符串数据源。除非你有成千上万的证书和侦听器,否则响应体不会接近你的带宽/内存限制。

我承认,在开始使用Envoy时,我已经耗尽了我所能负担的时间,试图解释他们广泛的面向机器的文档,所以我最终决定为我们的配置提供一个轮询HTTP服务。即使每隔几秒钟进行一次轮询,这也是唯一的真实流量,因此设置并继续运行非常容易。我将谈论这种方法,因为这是我最熟悉的方法。您可能已经从静态示例开始,但要使其更具动态性,您所需要做的就是进一步向下移动到动态配置。只需将REST替换为gRPC,因为这更容易处理和实现下面记录的REST端点。这需要一点尝试和错误,但一个好的方法是简单地让服务返回您已经使用的配置的JSON版本。需要注意的一个问题是,您需要在顶级JSON对象上添加"type""version"密钥,该对象引用您返回的对象类型的proto,即对LDS服务的响应可能如下所示:

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

这并不像我希望在Python中工作那么容易。他们在Go中有一个使用gRPC的xDS服务器的很好的例子,但这对我的帮助几乎没有我在Github上找到的实现xDS

添加到@jeteon关于使用xDS和动态配置的答案中,而不是每次都使用LDS和更改侦听器动态文件,您可以设置SDS并使用watched_directory功能。看看Enovy文档中的关键轮换部分。

最新更新