• 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:

    1. kubectl -n kube-system get lease -l k8s.io/component=kube-apiserver
    2. NAME HOLDER AGE
    3. kube-apiserver-c4vwjftbvpc5os2vvzle4qg27a kube-apiserver-c4vwjftbvpc5os2vvzle4qg27a_9cbf54e5-1136-44bd-8f9a-1dcd15c346b4 5m33s
    4. kube-apiserver-dz2dqprdpsgnm756t5rnov7yka kube-apiserver-dz2dqprdpsgnm756t5rnov7yka_84f2a85d-37c1-4b14-b6b9-603e62e4896f 4m23s
    5. kube-apiserver-fyloo45sdenffw2ugwaz3likua kube-apiserver-fyloo45sdenffw2ugwaz3likua_c5ffa286-8a9a-45d4-91e7-61118ed58d2e 4m43s
    6. kubectl -n kube-system get lease
    7. NAME HOLDER AGE
    8. cert-manager-cainjector-leader-election cert-manager-cainjector-7458974899-l9hpz_cfcd63cf-6563-48b4-b72b-8d7d91f11682 406d
    9. cert-manager-controller cert-manager-7fc8c7b7fb-gq2bf-external-cert-manager-controller 406d
    10. kube-controller-manager xxxxxx_7cddd47d-26bc-43db-89b7-a0e94dcee37e 3y30d
    11. 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
    1. apiVersion: coordination.k8s.io/v1
    2. kind: Lease
    3. metadata:
    4. creationTimestamp: "2022-11-30T15:37:15Z"
    5. labels:
    6. k8s.io/component: kube-apiserver
    7. kubernetes.io/hostname: kind-control-plane
    8. name: kube-apiserver-c4vwjftbvpc5os2vvzle4qg27a
    9. namespace: kube-system
    10. resourceVersion: "18171"
    11. uid: d6c68901-4ec5-4385-b1ef-2d783738da6c
    12. spec:
    13. holderIdentity: kube-apiserver-c4vwjftbvpc5os2vvzle4qg27a_9cbf54e5-1136-44bd-8f9a-1dcd15c346b4
    14. leaseDurationSeconds: 3600
    15. 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 的名称冲突。

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

  • 相关阅读:
    MySQL详解
    json----fastjson的使用,jackson的使用
    linux-如何用起来ubuntu
    YOLO目标检测——钢表面缺陷检测数据集下载分享【含对应voc、coco和yolo三种格式标签】
    模型预测控制(Model predictive control,MPC)
    【开源项目】mysql大表数据迁移
    【Leetcode】旋转系列(数组、矩阵、链表、函数、字符串)
    Linux多线程(线程池与单例模式)
    【c++】用C++制作一个简易windows系统
    k8s集群的CA证书过期处理
  • 原文地址:https://blog.csdn.net/summer_fish/article/details/134050649