Jusene's Blog

慢慢理解 kubernetes list watch

字数统计: 566阅读时长: 2 min
2020/12/01 Share

List Watch

List-Watch是k8s统一的异步消息处理机制,在k8s内部的消息通信中,如何保障消息的实时性,客户端(kubelet,kube-scheduler…)轮询apiserver,或者apiserver主动通知客户端。如果轮询,大量的worker节点轮询apiserver,压力太大,而且实时性差;如果apiserver主动发送http请求,apiserver如何保障消息准确送达,而且这种短时连接势必造成socket通信接口频繁创建销毁,服务器压力骤升。

List-Watch就是为了解决k8s内部通信,在整个k8s内部集群中,etcd负责存储集群数据信息,apiserver作为统一的入口,任何数据都必须经过apiserver。客户端通过list-watch监听apiserver中资源kind的create,update,delete事件,并针对事件类型调用相应的事件处理函数处理,这就形成了整个k8s中的消息发布订阅过程了。

那么List-Watch到底是什么,List-Watch是两部分API,分别是list和watch。list的api非常好理解,就是列出资源;而watch则是调用资源的watch接口监听资源的变更事件。

Informer

k8s的informer模块封装了list-watch的API,用户只需要指定资源,编写事件处理函数,如AddFunc,UpdateFunc,DeleteFunc等。informer首先通过list API罗列出资源,然后调用watch API监听资源的变更事件,并将结果放入到一个FIFO队列,队列的另一头有协程从中取出事件,并调用对应的注册函数处理事件。

Watch的实现

尝试了下watch API,查看了下报头,这里可以看到:

1
Transfer-Encoding: chunked

以前记得,每个请求都是有Content-Length的字段的,现在整个watch请求在不停的在分片请求,这样的设计一个长链接,实时性也强。

resourceVersion

消息的顺序性也很重要,在并发场景,客户端在短时间受到同一资源的多个请求,如何保证消息有序执行,这里每个资源都有一个resourceVersion标签,这个标签是递增的数字,所有当客户并发处理同一个资源的事件时候,可以通过对比resourceVersion来保证最终的状态和最新的事件保持一致。

CATALOG
  1. 1. List Watch
  2. 2. Informer
  3. 3. Watch的实现
  4. 4. resourceVersion