Leader Election 在 k8s 中常用于实现多副本 HA 的场景。
不同于 load balancer 实现水平扩展。Leader Election 适应于同一时刻只能有一个活跃进程的单 active 多 standby 实现。例如 k8s controller。
多个 candidates 竞争 leader 角色,leader 周期性 renew lease。一旦失败,则有其它 candidate 顶上。
k8s program 通过 k8s resource (configmap, endpoint 或者 lease CR) 进行 leader 选举。
Lease 有五个字段
默认情况 leader/candidate 2s 一次续租/竞选。leader 15s 不更新则丢失 leader 身份。
实际实现有五种方式(controller 用 Leases CR)。对外统一以
resourcelock.Interface
接口提供 create/update/get 及 event send 功能。
k8s.io/client-go/tools/leaderelection
中实现了 Leader Election 功能。
LeaderElector 结构有 Run
或 RunOrDie
方法。获取 leader 并 renew 之。
此外
leaderTransition
记录了 leader 切换次数Controller 启动时需要指定 LeaderElectionID
,对应于 leases CR 名称。
如果 Controller 以多副本运行,每个 controller pod 都生成随机 uuid,以
${HOST}_${UUID}
作为 identity 来竞争 leader。
只有获得 leader 身份的 controller 才会真正 reconcile CR。
Leader Election 功能可以禁用。方便本地开发。