1、依赖于K8s组件中的Etcd分布式数据库存储集群信息,任何操作都是通过apiserver来修改Etcd的,其它
组件不可以直接与Etcd通信
客户端(kubelet/scheduler/controller-manager)通过list-watch监听apiserver中资(pod/rs
/rc等等)的create,update和delete事件,并针对事件类型调用相应的事件处理函数。
2、list-watch有两部分组成,分别是list和watch。
list:调用资源的list API罗列资源,基于HTTP短链接实现;
watch:调用资源的watch API监听资源变更事件,基于HTTP 长链接实现;
K8S的informer模块封装list-watch API,用户只需要指定资源,编写事件处理函数,
AddFunc,UpdateFunc和DeleteFunc等。informer首先通过list API罗列资源,然后
调用watch API监听资源的变更事件,并将结果放入到一个FIFO 队列,队列的另一头有
协程从中取出事件,并调用对应的注册函数处理事件。
注意:Informer还维护了一个只读的Map Store缓存,提升查询的效率,降低apiserver负载。
四个要素:
消息可靠性
消息实时性
消息顺序性
高性能
1、可靠性:
list和watch一起保证了消息的可靠性,避免因消息丢失而造成状态不一致场景。list API可以查询当前
的资源及其对应的状态(即期望的状态),客户端通过拿期望的状态和实际的状态进行对比,纠正状态不一致
的资源。Watch API和apiserver保持一个长链接,接收资源的状态变更事件并做相应处理。如果仅调用
watch API,若某个时间点连接中断,就有可能导致消息丢失,所以需要通过list API解决消息丢失问题。
我们可以认为list API获取全量数据,watch API获取增量数据。虽然仅仅通过轮询list API,也能达到
同步资源状态的效果,存在上面提到轮询的缺点:开销大,实时性不足的问题。
(也就是说list机制用于辅助修正)
2、实时性:
list-watch机制下,每当apiserver的资源产生状态变更事件,都会将事件及时的推送给客户端,从而保证
消息的实时性。
3、顺序性:
在并发的场景下,客户端在短时间内可能会收到同一个资源的多个事件,对关注最终一致性的K8S来说,它需
要知道哪个是最近发生的事件,并保证资源的最终状态如同最近事件所表述的状态一样。K8S在每个资源事件
中都带一个resourceVersion的标签,这个标签是递增的数字,所以当客户端并发处理同一个资源事件时,
它就可以对比resourceVersion来保证最终的状态和最新的事件所期望的状态保持一致。
(客户端就通过resrouceVersion来确定数据是不是处于同一时间版本)
4、高性能:
List-watch通过异步通知达到高性能的特点,因为虽然仅通过周期性调用list API也能达到资源最终一致
性的效果,但是周期性频繁的轮询大大的增大了开销,增加apiserver的压力。而watch作为异步消息通知
机制,复用一条长链接,保证实时性的同时也保证了性能。
Etcd通过异常重试机制,来保证watch特性的可靠性,在网络波动以及高CPU负载情况下,依然可以不丢失watch事件;
如果在处理slow watch期间,etcd进程重启了,client端会收到什么结果呢?client应该如何应对呢?
serverWatchStream如果给每一个watcher都维护一个channel,那么当watcher数量很大时,会不会占用etcd大量内存呢?
二、Watch事件通知模式
1.Etcd v2 轮询
Etcd v2 Watch机制采用HTTP/1.x实现,每个Watcher对应一个TCP连接。Client通过HTTP/1.x长连接定时轮询Server,获取最新的数据变化事件;
这种实现的好处是简单,但是这种机制有一个致命缺点,Watcher数量很多时,就算集群空负载,大量轮询也会导致Server消耗大量的Socket,内存等资源,导致Etcd的扩展性和稳定性无法满足K8s业务场景;
2.Etcd v3 流式推送
Etcd v3基于HTTP/2的gRPC协议,双向流的Watch API设计,实现了连接多路复用。一个client/TCP连接支持多个gRPC Stream,一个gRPC Stream又支持多个Watcher ,同时事件通知模式也从client轮询优化为server流式推送,极大降低server端Socker、内存等资源
三、Watch可靠性
Client和Server出现网络抖动后、导致Server时间堆积时,Server会丢弃事件吗?若监听的历史版本号Server端不存在了,你的代码要如何处理?
弄清楚可靠性,先要了解Watch特性的整体架构和核心流程。
TRANSLATE with x
English
Arabic | Hebrew | Polish |
Bulgarian | Hindi | Portuguese |
Catalan | Hmong Daw | Romanian |
Chinese Simplified | Hungarian | Russian |
Chinese Traditional | Indonesian | Slovak |
Czech | Italian | Slovenian |
Danish | Japanese | Spanish |
Dutch | Klingon | Swedish |
English | Korean | Thai |
Estonian | Latvian | Turkish |
Finnish | Lithuanian | Ukrainian |
French | Malay | Urdu |
German | Maltese | Vietnamese |
Greek | Norwegian | Welsh |
Haitian Creole | Persian |
|
TRANSLATE with
COPY THE URL BELOW
Back
EMBED THE SNIPPET BELOW IN YOUR SITE
Enable collaborative features and customize widget: Bing Webmaster Portal
Back
此页面的语言为中文(简体)
翻译为
- 中文(简体)
- 中文(繁体)
- 丹麦语
- 乌克兰语
- 乌尔都语
- 亚美尼亚语
- 俄语
- 保加利亚语
- 克罗地亚语
- 冰岛语
- 加泰罗尼亚语
- 匈牙利语
- 卡纳达语
- 印地语
- 印尼语
- 古吉拉特语
- 哈萨克语
- 土耳其语
- 威尔士语
- 孟加拉语
- 尼泊尔语
- 布尔语(南非荷兰语)
- 希伯来语
- 希腊语
- 库尔德语
- 德语
- 意大利语
- 拉脱维亚语
- 挪威语
- 捷克语
- 斯洛伐克语
- 斯洛文尼亚语
- 旁遮普语
- 日语
- 普什图语
- 毛利语
- 法语
- 波兰语
- 波斯语
- 泰卢固语
- 泰米尔语
- 泰语
- 海地克里奥尔语
- 爱沙尼亚语
- 瑞典语
- 立陶宛语
- 缅甸语
- 罗马尼亚语
- 老挝语
- 芬兰语
- 英语
- 荷兰语
- 萨摩亚语
- 葡萄牙语
- 西班牙语
- 越南语
- 阿塞拜疆语
- 阿姆哈拉语
- 阿尔巴尼亚语
- 阿拉伯语
- 韩语
- 马尔加什语
- 马拉地语
- 马拉雅拉姆语
- 马来语
- 马耳他语
- 高棉语
随时将中文(简体)翻译为PRO
一律不翻译中文(简体) 一律不翻译i.
所有的悲情叙事,都是因为你的基础体能不够
















