k8s中的List-Watch机制以及创建pod的完整流程
List-Watch机制
k8s中各组件间的协同都采用list-watch机制进行通信,主要是两个操作:
- List:客户端定期执行list操作来获取资源状态,短连接,一次通信完成之后tcp链接就断开
- Watch:通过watch操作来持续接收资源后续的更新,长连接,一次通信完成之后tcp链接依然保留
在k8s中,组件长时间都处于watch状态,关注实时信息,但仍然有可能因为一些网络抖动故障导致watch丢失了某些事件,于是组件会定期发起list操作来获取最新的全量状态,弥补watch的不足。通过这种机制,k8s可以更有效地获取资源状态的更新,并减少了网络流量和APIserver服务器的负载。
k8s中创建pod的完整流程
- controller-manager组件、scheduler组件、kubelet组件都watch监听apiserver、监听自己的关注的资源状态。只要有更新,apiserver就会上报该更新给对应的组件。
- 客户端命令kubectl提交创建pod的请求(以控制器Replicaset为例)。
- apiserver收到该请求,会把创建replicaset的请求写入etcd。
- 上报事件replicaset created给controller-mamanger。
- controller-mamanger收到replicaset created事件,进入调谐阶段,发现当前该pod是0副本,预期要创建1个副本。
- controller-mamanger发起要创建一个pod的请求给apiserver。
- apiserver将创建pod的事件存入etcd中。
- apiserver上报Pod created事件给scheduler。
- scheduler组件收到Pod created事件,经过预选与优选来选出一台合适的物理节点来创建新pod。
- scheduler把调度结果(要在某一台物理节点上创建新pod)发送给apiserver。
- apiserver将事件存入etcd中。
- apiserver上报该事件给某一个物理节点上的kubelet。
- kubelet会收到该事件,进入pod创建环节。
- kubelet会调用容器引擎以及网络插件创建出pod。
- 会先调用容器引擎创建出一个pause容器
- 调用网络插件来把pause容器的网络打通
- 调用容器引擎来创建出业务容器,并且业务容器采用的container网络模式与pause容器共享网络