V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cesign
V2EX  ›  Kubernetes

K8s 除了 leader election 实现主备高可用,还有什么办法实现 controller 类组件的高可用?

  •  
  •   cesign · 2023-03-23 20:09:08 +08:00 · 1063 次点击
    这是一个创建于 397 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

    controller 类组件如:k8s-controller-manager ,list&watch 资源,做对应操作。 但是这类主备部署存在问题: 1.备的组件,啥都不做,浪费资源。 2.备的组件,一般抢到 lease resource 后,才会进行初始化,然后处理业务,浪费时间。

    希望的解决状态

    1.多个 controller 同时部署,能根据 HPA 扩缩示例数。 2.多个 controller 同时工作,同时处理业务,每个 controller 负责一部分(我知道的可通过 hash 环实现拆分)。 3.在某个 controller 挂了后,其他 controller 接管其负责的业务。

    有没有类似的实现?或者库也行

    4 条回复    2023-03-24 12:14:51 +08:00
    aapeli
        1
    aapeli  
       2023-03-23 20:24:58 +08:00
    1. 多个 controller 同时工作, 因为每一个实例都会收到同一个事件, 为了避免多个 controller 同时处理同一个 k8s 对象, 需要实现一个分布式的锁来避免同事处理同一个事件. 而且需要单独引入三方组件, 如果不引入三方组件,使用 k8s 的资源实现分布式锁的话 会增加 apiserver 的负担(因为每锁一次就要发至少一次请求到 apiserver)

    所以大多数情况下 都是一个 controller 工作其他的在闲着. k8s sig 小组的 controller-runtime 也是这样设计的. https://github.com/kubernetes-sigs/controller-runtime
    cesign
        2
    cesign  
    OP
       2023-03-23 20:40:42 +08:00
    @aapeli (因为每锁一次就要发至少一次请求到 apiserver) 这个锁我的理解只有 controller 变化的时候(增加,减少,有的失败),并不会频繁变化;而本质上,主备部署的,也会有到 apiserver 的锁请求(如刷写 lease 资源)。
    我的理解,这块并不会增加 apiserver 的负担
    cesign
        3
    cesign  
    OP
       2023-03-23 20:43:01 +08:00
    @aapeli 而且主备部署的,所有备组件,也会周期去查 lease 资源,或者刷写 lease 资源
    aapeli
        4
    aapeli  
       2023-03-24 12:14:51 +08:00
    抱歉 我刚看到了你的处理逻辑 "试图通过 hash 环实现拆分", 如果使用 hash 环拆分,多个 controller 之间不会互相冲突那就没有我上述的问题了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1694 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 16:44 · PVG 00:44 · LAX 09:44 · JFK 12:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.