一、聊聊什么是CRD
CRD是用户自定义的资源模型,是K8S原生API的扩展,可以通过集群管理员向已有的K8S集群中动态的注册或者删除或者更新,对集群现有资源不影响,一旦注册了某种CRD资源,操作人员就可以像直接操作pod一样通过api或者kubelet操作,就像pod,service等内部资源一样
自定义controller是一种控制器,用户可以在正在运行的集群上部署和更新,而与集群自身生命周期无关
crd中指定用户期望的状态,然后controller通过监控crd的数据实际状态以及相关联资源的状态来向实际状态靠齐,从而达到最终的期望状态
二、聊聊K8S的list-watch机制
1、在通信时,要保证消息实时性经常采用轮询,可能导致问题出现:
1、客户端轮询服务端:那么服务端压力会很大
2、服务端主动建立连接发消息告知,此时若http消息则不安全,而且还有大量端口占用问题
2、K8s的List-Watch机制:
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 长链接实现;
3、K8S的informer模块封装list-watch API,用户只需要指定资源,编写事件处理函数,AddFunc,UpdateFunc和DeleteFunc等。informer首先通过list API罗列资源,然后调用watch API监听资源的变更事件,并将结果放入到一个FIFO 队列,队列的另一头有协程从中取出事件,并调用对应的注册函数处理事件。
注意:Informer还维护了一个只读的Map Store缓存,提升查询的效率,降低apiserver负载。
K8S 的informer 模块封装 list-watch API,用户只需要指定资源,编写事件处理函数,AddFunc, UpdateFunc和 DeleteFunc等。如下图所示,informer首先通过list API 罗列资源,然后调用 watch API监听资源的变更事件,并将结果放入到一个 FIFO 队列,队列的另一头有协程从中取出事件,并调用对应的注册函数处理事件。Informer还维护了一个只读的Map Store 缓存,主要为了提升查询的效率,降低apiserver 的负载