k8s Leaderelection 集群领导选举开发

发布时间: 更新时间: 总字数:859 阅读时间:2m 作者:IP:上海 网址

在Kubernetes集群中,领导者选举(Leader Election)可用于确保在任何给定时间内只有一个实例负责执行领导者特定的任务,本质上是一个分布式资源锁

介绍

  • 在分布式系统中,通过服务冗余来减少单点故障

  • 在 Kubernetes 中,kube-schdulerkube-controller-manager 都是通过部署多副本来保证高可用,实际只有一个示例在运行

  • k8s 通过 client-goleaderelection 的选主机制,保证只有获取到 leader 锁的处于工作状态,且当 leader 因故故障后,其他节点竞争称为新的 leader 保证组件正常工作

  • 原理

    • 通过 etcd 实现锁,支持的对象是Lease、ConfigMap或Endpoint
    • 若领导者未能在给定的间隔内更新时间戳,会被认为是该节点已经失效,其他节点重新竞争领导者
  • 支持

    • ResourceLockConfig
    • LeaderElectionRecord
  • 启动 kubernetes 集群安装部署

代码

leaderelection resourcelock ...

以上示例基于 k8s.io/client-go v0.29.3 实现

  • help
help ...
  • run
# lock1
$ go run resourcelock.go -ns default -name lock1
.. leaderelection.go:250] attempting to acquire leader lease default/example...
.. leaderelection.go:260] successfully acquired lease default/example
.. resourcelock.go:89] lock1: get leading
^C.. Received termination, shutdown ...
.. resourcelock.go:92] lock1: lost leading
.. lock1: exit

# lock2
$ go run resourcelock.go -ns default -name lock2
.. leaderelection.go:250] attempting to acquire leader lease default/example...
.. resourcelock.go:99] new leader elected: lock1
.. leaderelection.go:260] successfully acquired lease default/example
.. resourcelock.go:89] lock2: get leading

其他项目实例

F&Q

leaderelection.go error retrieving resource lock kube-system/kube-controller-manager: etcdserver: leader changed

leaderelection.go:332] error retrieving resource lock xx/xx: etcdserver: leader changed
leaderelection.go:285] failed to renew lease timed out waiting for the condition

可能原因

  • 时间不同步
  • etcd 同步慢,扩大etcd的心跳检测时间
$ vim /etc/kubernetes/manifests/etcd.yaml
    - --election-timeout=5000
    - --heartbeat-interval=500
本文总阅读量 次 本站总访问量 次 本站总访客数