kubernetes 使用watch连接在领导者选举中获取旧租约

sauutmhj  于 7个月前  发布在  Kubernetes
关注(0)|答案(9)|浏览(93)

你希望添加什么内容?
保持对kube-apiserver的监视连接,以便与租约同步,而不是通过GET请求获取租约

为什么需要这个?
每次领导者选举客户端尝试更新租约时,它都需要先获取旧租约以检查标识和时间,这存在一些问题:

  • 默认情况下,领导者选举的APF并发份额(即10)可能对于托管kube-apiserver的小机器来说太小了。使用监视连接可以将领导者选举请求减少50%。
  • 在负载下,没有指定resourceVersion的获取租约会从kube-apiserver中多占用一些资源。kube-apiserver可能会在超时时间内无法响应。

这样做的一个主要风险是客户端可能会获得过期的租约并决定获取该租约。我没有查看处理租约PUT请求的代码,但我认为应该注意避免过早放弃租约,因为无论如何都不能保证GET响应的新鲜度。

g2ieeal7

g2ieeal73#

你好,@linxiulei
我喜欢你使用手表连接来同步租约与kube-apiserver的想法。
这可以通过减少对kube-apiserver的请求数量、节省kube-apiserver的资源消耗以及避免获取过期租约的风险来提高集群性能和可靠性。

eulz3vhy

eulz3vhy4#

然而,我也看到了在做这件事时遇到的一些困难和成本。例如,如果手表连接断开或掉落怎么办?这可能会导致领导者选举失败或延迟。一个可能的解决方案是使用重试机制或备用连接来恢复同步。为了确保手表连接不会增加更多的负载或复杂性(以免影响集群的性能和可靠性),我们可以使用轻量级协议或压缩技术来减少数据传输和处理。

wmomyfyw

wmomyfyw5#

你对这些建议有什么看法?
我认为这个问题很有趣,值得进一步探讨。我希望我们能一起找到一个好的解决方案。
感谢你对Kubernetes的宝贵贡献和兴趣!

0dxa2lsx

0dxa2lsx6#

关于使用watch作为领导者的补充:

  1. 我对使用watch作为领导者持-1态度。我们需要尽力确保在已经获取到领导者锁之后,不会丢失领导者锁,而且如果租约面临更高的watch延迟(我们在过去观察到的情况),这种情况就更有可能发生。
  2. 对于领导者,我们知道只有领导者应该更新租约。因此,我们可以通过以下最简单的方法来实现:
  • 乐观地假设我们之前的写入操作的结果是当前版本
  • 如果发生冲突,回退到“GET + PUT”再次尝试

我对上述观点表示赞同。

  1. 我想我可能可以接受仅对非领导者使用watch 前提是我们只对非领导者这样做。
    在这种情况下,滞后的watch效应仅影响给定组件无法接管领导者锁或在锁已经被不同示例在同时获取的情况下的一些额外调用。
    话虽如此,在我同意这个观点之前,我想看到一些回退到“GET+PUT”的机制,并希望了解它是如何工作的。
    请注意,我为非领导者看到的额外优势是,由于默认的RetryPeriod=2s和默认的LeaseDuration=10s,平均每2.5次调用中只有1次是有用的(其他次调用都是无用的,因为在此期间没有发生变化),因此我们实际上也可以节省处理这些请求时的一些资源。
    @liggitt - 仅供参考
83qze16e

83qze16e7#

你的建议大致符合我的设想,并采取了额外的安全措施。谢谢!
我制作了一个 PR ,需要一些润色。PTAL!

kcwpcxri

kcwpcxri8#

/assign @wojtek-t
谢谢。
/triage accepted
bq8i3lrv

bq8i3lrv9#

感谢贡献'
请避免在未将问题分配给自己的情况下发起PR!

相关问题