概述

Kubernetes 中存在一个 Lease 类型,顾名思义,它的作用就是可以创建一个带租约的资源。假设有多个节点都想竞争 Leader,那么大家就先尝试创建这个带租约的 Lease 资源,如果创建成功,那么你就是 Leader 了。创建成功并不代表你一直都是 Leader,你还得定期(leaseDurationSeconds)地续租,如果没有续租,那么你的租约就会到期,那么就会被其他的参与者抢占了 Leader 的位置,从而失去 Leader。

示例代码

代码的使用方式是这样的:

原理解析

其实这个 Leader 选举的原理很简单,Kubernetes 提供了一种带 “租期” 的类型 Lease,然后,通过创建 Name 唯一的 LeaseLock 资源,多个参与者中只有一个人能创建成功,那么谁创建成功(拥有)这个资源,谁就是 Leader。这里带 ”租期“,所以要求拥有这个资源的 Leader 必须定时续租,如果断租了,那么别的参与者就可以抢占这个 Lock。

因为有多个参与者参与抢占这个资源,所以会出现竞争,而解决竞争的方式 Kubernetes 是通过版本号的乐观锁解决。这个可以参考 4 进行了解 Kubernetes 的乐观锁。虽然在使用的时候,我们对这个版本号没有感觉,但是,通过查看 Kubernetes Client Go 的代码可以发现,这个事情其实是 SDK 帮助我们完成了:

Reference