Kubernetes 的 Informer 机制

Kubernetes 的 Informer 机制

在 Kubernetes 中,kube-apiserver 是整个集群的大脑和心脏,是控制集群的入口,所有模块都是通过其提供的 HTTP REST API 接口来操作集群的。

由于是所有模块的数据交互和通信的枢纽,大量组件直接通过 HTTP 请求 apiserver 带来的访问压力是非常大的。一但 apiserver 出现异常,整个集群就会受到影响,甚至崩溃。

所以尽可能降低 apiserver 的访问压力是很有必要的,Informer 机制就是 Kubernetes 解决这个问题的方案。Informer 本质就是 client-go 提供的一种本地缓存机制:

  • 通过在本地缓存一份准实时的 Kubernetes 资源数据,应用在查询时直接从本地查询;
  • 当资源变化时通过长连接将变更推送到本地 Informer 并更新本地缓存;
  • 变更缓存后,触发本地的处理函数执行相关业务逻辑。

通过 Informer 机制,大大降低了 Kubernetes 各个组件跟与 API Server 的通信压力,同时 ETCD 的查询压力也同样得到缓解。

阅读更多
Kubernetes 核心组件 Leader 选举机制

Kubernetes 核心组件 Leader 选举机制

Kubernetes 内部很多核心组件是有状态的,都以一主多从多实例的方式运行。这些组件的一主多从中,只有主实例负责处理数据,从实例处在热备状态。当主实例异常时从实例将竞选成为主实例并接替进行任务处理,所以这个选举机制是 Kubernetes 对于这有状态组件高可用的保障。

核心组件如 kube-scheduler 或 kube-controller-manager 等组件,在同一时刻只有一个实例在处理业务逻辑,因此需要在启动的实例中进行选主,决定哪个实例负责处理任务。这些核心组件都是使用的 client-go 中提供的工具类 leaderelection,也就是本文的主角。

leaderelection 依赖于 Kubernetes 中提供的 EndpointsConfigMapLease 三种资源锁,leaderelection 选主的实现方式就是基于这三种资源锁:

  • 多个副本去创建资源,创建成功则获得锁成为 leader;
  • leader 在租约内去刷新锁;
  • 其他副本则通过比对锁的更新时间,判断是否竞争成为 leader。

除了能在核心组件中使用,这个组件也能使用在我们开发的应用中,前提是我们的应用运行在 Kubernetes 环境且有操作资源锁的权限。

阅读更多