controller 类组件如:k8s-controller-manager ,list&watch 资源,做对应操作。 但是这类主备部署存在问题: 1.备的组件,啥都不做,浪费资源。 2.备的组件,一般抢到 lease resource 后,才会进行初始化,然后处理业务,浪费时间。
1.多个 controller 同时部署,能根据 HPA 扩缩示例数。 2.多个 controller 同时工作,同时处理业务,每个 controller 负责一部分(我知道的可通过 hash 环实现拆分)。 3.在某个 controller 挂了后,其他 controller 接管其负责的业务。
有没有类似的实现?或者库也行
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 |
2
cesign OP @aapeli (因为每锁一次就要发至少一次请求到 apiserver) 这个锁我的理解只有 controller 变化的时候(增加,减少,有的失败),并不会频繁变化;而本质上,主备部署的,也会有到 apiserver 的锁请求(如刷写 lease 资源)。
我的理解,这块并不会增加 apiserver 的负担 |
4
aapeli 2023-03-24 12:14:51 +08:00
抱歉 我刚看到了你的处理逻辑 "试图通过 hash 环实现拆分", 如果使用 hash 环拆分,多个 controller 之间不会互相冲突那就没有我上述的问题了
|