'watch=true' 在 kube-apiserver 上是如何实现的?

How is 'watch=true' implemented on the kube-apiserver?

在观察 kubernetes 资源的变化时,到底发生了什么? http 是否突然变为 wss 连接?

为了解决对 kube-apiserver 请求过多的问题,我将一些代码重写为我认为更像是运算符模式的代码。

在我们的多租户微服务架构中,所有服务都使用相同的库来查找特定于租户的数据库的连接详细信息。连接详细信息保存在与应用程序相同的命名空间内的秘密中。每个租户数据库都有自己的秘密。

因此,在每次调用时,都会读取并解析所有具有正确标签的机密,以获取必要的数据库连接详细信息。我们有大约 400 services/pods...

我的想法:与其在每次调用时读取所有机密,不如创建一个缓存并在每次通过观察者更改相关机密时更新缓存。

我的顾虑:我只是用同样昂贵的 websockets 替换 http 请求吗?据我所知,我现在将为每个 service/pod 打开一个 websocket 连接,这仍然是 400 个打开的连接。

有一个代理服务来监视秘密(kube-apiserver 请求)然后所有服务查询该服务以获取连接详细信息(Intranet 请求,kube-apiserver unreleated)会更​​好吗?

来自the sources

// ServeHTTP serves a series of encoded events via HTTP with Transfer-Encoding: chunked
// or over a websocket connection.

这在很大程度上取决于客户端使用哪种协议(分块 http 或 ws),它们都有其成本,您必须将其与当前请求频率进行比较。

使用定期监视或轮询的代理缓存可能会更好,但这在很大程度上取决于您的应用程序。