到-从-ListWatch-WatchList (从?到!)

教程大全 2025-07-13 09:22:11 浏览
WatchList

分析

可以先设想一下如果自己去实现的话,该如何设计。Client 和 Server 端都要去适配这是必然的,因为 Informer 现在是 listwatch 机制,服务端并不支持流式 List。因此可以有个初步的方向:

客户端的适配相对简单,重点还是放在 Server 端如何实现。先回顾下之前 List 的逻辑,在前一篇Stale Read里面已经介绍过了。

新版中已经修复了 List Stale Read 的问题,对于前两种情况,其会先从 kube-APIserver 获取 Etcd 最新的 RV,等待 WatchCache Store 内容追平 RV 后再一次性的返回。

也就是说服务端是可以知道自己是否已经包含最新全量数据的,在这个基础上再以流式方式返回即可。当前已有的流式 API 就是 Watch,所以可以在此基础上支持 List 的效果。为什么不直接在 List 请求基础上改呢,因为改 List 的话,会涉及到太多的客户端侧的适配,List 会经常单独使用,而 Watch 基本是在 Informer 里面使用。

所以最终的工作就会变成如何使用 Watch API 实现 List 的效果,但数据仍然以流式返回给客户端,同时 Informer 修改 ListWatch 方式为只使用 Watch API 实现之前的效果。下文以详细介绍服务端实现为主,客户端适配的部分会比较简单的介绍下。

原理

通过为 Watch API 添加一个SendInitialEvents=true参数来支持 List 的效果。Server 端接收到 Watch 请求后判断哪些数据是应该作为 InitEvents 发送给客户端,同时在发送完这些数据之后发送一个特定的 BOOKMARK Event(带特定 Annotation 的 BOOKMARK,其 RV 对应下文的 bookmarkAfterRV)给客户端作为服务端通知客户端 InitEvents 发送完毕的标志,客户端在接收到指定 BOOKMARK Event 后,将之前接收到的所有 InitEvent 作为 List 的结果处理。

时序图

下面是基于 v1.29 代码的分析,此时 v1.29 还在 alpha 状态,提到的旧版代表 1.27 之前的版本,新版代表 v1.29。如果你看到的代码和下面描述的不一致,有可能是代码版本导致的。

从 WatchCache 开始右面四个蓝色的是在 kube-apiserver 启动的时候开始执行的,G1 G2 代表两个 goroutine,分别用来从 Etcd 获取数据,以及发送数据给客户端 CacheWatcher 的 input chan

上述过程描述了服务端启动时的数据处理流程,接下来看有客户端请求时的处理流程

2a 开始从 WatchCache Store 中获取需要返回的数据,此时的处理逻辑旧版本相同,返回 Store 中的全部数据,并记录 Store 数据的最大 RV 供下一步使用;

2b 消费 input chan 中的事件,对比其 RV 是否比 2a 传入的 RV 大,或者如果是 BOOKMARK 类型并且 RV 等与 2a 传入的 RV,且尚未发送 bookmarkAfterRV 的事件,则此 BOOKMARK 事件就会被当做 List 结束的标志,为其设置 Annotation: K8s.io/initial-events-end,最后发送给客户端;

至此,服务端的主要流程已经介绍完,客户端 Informer 也做了对应的适配,如果开启 WathList 功能的话,会发送 Watch 请求来获取一遍全量数据,等到接收到携带 Annotation: k8s.io/initial-events-end 的 BOOKMARK 事件后,记录其 RV,将在此期间接受并处理后的对象作为 List 的结果。最后再次以上述 RV 作为参数调用 Watch 请求,从这一步开始就是 Informer 传统意义上的 Watch 逻辑了。

数据流

图片来自 KEP 3157 watch-list,其实里面也包含时序图,不过里面的书序图画的有一些问题,和代码不一致,所以这里并没有直接使用他的时序图,而是重新画了。

可以结合上面两个图理解整个过程,上图中的 a 对应时序图中的 2a,b 对应时序图中的 2b,c 对应时序图中的 G2.1。最下面白色部分对应时序图中 G1 的逻辑,即从 Etcd 获取数据,客户端请求的处理是自上到下的,而数据返回是自下而上的。

注意

上述处理逻辑中存在很多的细节,需要额外注意下

总结

本篇主要分析了 WatchList 的实现原理和逻辑,其中不乏一些细节处理,后续也会和社区就有关细节进一步讨论。在此 KEP 中同时还介绍了另外两个用来降低 kube-apiserver 内存压力的修改,篇幅有限,将会在下一篇中进行介绍,同时也会给出所有优化工作做完前后的效果对比。敬请期待~


从1到10的英语序数词是哪些

first 第一second 第二 third 第三fourth 第四fifth 第五sixth 第六seventh 第七eighth 第八ninth 第九tenth 第十

DNA的复制顺序是从5‘到3’吗?

看插入的图,本问题看图就明白了。

由于DNA聚合酶只能以5→3方向聚合子代DNA链,因此两条亲代DNA链作为模板聚合子代DNA链时的方式是不同的。 以3→5方向的亲代DNA链作模板的子代链在聚合时基本上是连续进行的,这一条链被称为前导链,而以5→3方向的亲代DNA链为模板的子代链在聚合时则是不连续的,这条链被称为滞后链。 DNA在复制时,由滞后链所形成的一些子代DNA短链称为冈崎片段。 冈崎片段的大小,在原核生物中约为1000~2000个核苷酸,而在真核生物中约为100个核苷酸。

C语言编程题,从键盘输入任意3个数,按从小到大的顺序输出

#include (){ int x,y,z,t; scanf(%d%d%d,&x,&y,&z);if(x>y){t=x;x=y;y=t;}/*交换x,y的值*/if(x>z){t=z;z=x;x=t;}/*交换x,z的值*/if(y>z){t=y;y=z;z=t;}/*交换z,y的值*/printf(smallto big: %d %d %d\n,x,y,z);}

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐