K8S基础架构租赁(Lease )

分布式系统通常需要租约(leases),租约提供了锁定共享资源和在一组成员之间协调活动的机制。
在Kubernetes中,租约的概念由协调(k8s.io) API组中的Lease对象表示。

在Kubernetes中,Lease对象用于协调集群中的节点和组件之间的通信和协作。例如,每个节点都会创建一个Lease对象,以向其他节点宣告自己的存在,并定期发送心跳信号以表明其健康状态。此外,Lease对象还可用于组件级别的领导者选举,例如选举控制器中的主节点。

通过使用Lease对象,Kubernetes可以确保系统中的节点和组件之间的通信和协作得以平稳进行,增强了集群的可靠性和稳定性。

 

节点心跳

Kubernetes使用Lease API将kubelet节点心跳通信发送给Kubernetes API服务器。
对于每个节点,在kube-node-lease命名空间中有一个与之匹配名称的Lease对象。在内部,每个kubelet心跳都是对这个Lease对象的更新请求,更新Lease的spec.renewTime字段。
Kubernetes控制平面使用这个字段的时间戳来确定该节点的可用性。
有关更多详细信息,请参阅节点租赁对象

 

领导选举

在Kubernetes中,还使用Leases来确保每个组件在任何给定时间只运行一个实例。这在高可用配置的控制平面组件,如kube-controller-manager和kube-scheduler中使用,其中组件的只有一个实例应该处于活动运行状态,而其他实例处于待命状态。

在高可用配置中,一般会有多个控制平面组件的副本在运行,但只有一个实例应该是领导者(leader),负责主要的控制平面任务,如调度和控制器管理。其他副本则处于备用状态,以便在领导者实例失败时能够接管其职责。

通过使用Lease对象,Kubernetes可以进行组件级别的领导者选举,确保在任何时刻只有一个实例作为领导者运行。这种机制可以提高控制平面的可用性和容错性,确保在出现故障或中断时仍然能够持续地提供服务。

 

API服务器身份

在Kubernetes v1.26及更高版本中,每个kube-apiserver使用Lease API将其身份发布给系统的其他部分。虽然单独来说并不特别有用,但这为客户端提供了一种机制,可以了解有多少个kube-apiserver实例正在运行Kubernetes控制平面。kube-apiserver租约的存在为未来可能需要在每个kube-apiserver之间进行协调的功能提供了支持。

您可以通过检查kube-system命名空间中名称为kube-apiserver-的租约对象来查看每个kube-apiserver拥有的租约。或者使用标签选择器k8s.io/component=kube-apiserver:

kubectl -n kube-system get lease -l k8s.io/component=kube-apiserver
NAME                                        HOLDER                                                                           AGE
kube-apiserver-c4vwjftbvpc5os2vvzle4qg27a   kube-apiserver-c4vwjftbvpc5os2vvzle4qg27a_9cbf54e5-1136-44bd-8f9a-1dcd15c346b4   5m33s
kube-apiserver-dz2dqprdpsgnm756t5rnov7yka   kube-apiserver-dz2dqprdpsgnm756t5rnov7yka_84f2a85d-37c1-4b14-b6b9-603e62e4896f   4m23s
kube-apiserver-fyloo45sdenffw2ugwaz3likua   kube-apiserver-fyloo45sdenffw2ugwaz3likua_c5ffa286-8a9a-45d4-91e7-61118ed58d2e   4m43s



kubectl -n kube-system get lease
NAME                                      HOLDER                                                                          AGE
cert-manager-cainjector-leader-election   cert-manager-cainjector-7458974899-l9hpz_cfcd63cf-6563-48b4-b72b-8d7d91f11682   406d
cert-manager-controller                   cert-manager-7fc8c7b7fb-gq2bf-external-cert-manager-controller                  406d
kube-controller-manager                   xxxxxx_7cddd47d-26bc-43db-89b7-a0e94dcee37e                           3y30d
kube-scheduler                            xxxxxx_54a28a2e-a26b-4e8f-b87d-d5d5574fcfd7                           3y30d

租约名称中使用的 SHA256 哈希基于 API 服务器所看到的操作系统主机名生成。 每个 kube-apiserver 都应该被配置为使用集群中唯一的主机名。 使用相同主机名的 kube-apiserver 新实例将使用新的持有者身份接管现有 Lease,而不是实例化新的 Lease 对象。 你可以通过检查 kubernetes.io/hostname 标签的值来查看 kube-apisever 所使用的主机名:

kubectl -n kube-system get lease kube-apiserver-c4vwjftbvpc5os2vvzle4qg27a -o yaml
apiVersion: coordination.k8s.io/v1
kind: Lease
metadata:
  creationTimestamp: "2022-11-30T15:37:15Z"
  labels:
    k8s.io/component: kube-apiserver
    kubernetes.io/hostname: kind-control-plane
  name: kube-apiserver-c4vwjftbvpc5os2vvzle4qg27a
  namespace: kube-system
  resourceVersion: "18171"
  uid: d6c68901-4ec5-4385-b1ef-2d783738da6c
spec:
  holderIdentity: kube-apiserver-c4vwjftbvpc5os2vvzle4qg27a_9cbf54e5-1136-44bd-8f9a-1dcd15c346b4
  leaseDurationSeconds: 3600
  renewTime: "2022-11-30T18:04:27.912073Z"

kube-apiserver 中不再存续的已到期租约将在到期 1 小时后被新的 kube-apiserver 作为垃圾收集。

你可以通过禁用 APIServerIdentity 特性门控来禁用 API 服务器身份租约。

工作负载

你自己的工作负载可以定义自己使用的 Lease。例如, 你可以运行自定义的控制器, 让主要成员或领导者成员在其中执行其对等方未执行的操作。 你定义一个 Lease,以便控制器副本可以使用 Kubernetes API 进行协调以选择或选举一个领导者。 如果你使用 Lease,良好的做法是为明显关联到产品或组件的 Lease 定义一个名称。 例如,如果你有一个名为 Example Foo 的组件,可以使用名为 example-foo 的 Lease。

如果集群操作员或其他终端用户可以部署一个组件的多个实例, 则选择名称前缀并挑选一种机制(例如 Deployment 名称的哈希)以避免 Lease 的名称冲突。

你可以使用另一种方式来达到相同的效果:不同的软件产品不相互冲突。

你可能感兴趣的:(K8S,kubernetes,容器)