Kubernetes控制平面通信规则及Pod调度相关技术问题咨询
问题1:节点资源信息更新与调度器缓存同步机制
- 节点资源容量、可分配资源的更新发起方始终是节点上的
kubelet:- 除了节点注册时首次上报容量,kubelet默认每10秒上报一次完整节点状态(包含最新的可分配资源、健康状态等),上报请求直接发送给
kube-apiserver,由apiserver写入etcd存储,这个上报周期可通过kubelet启动参数--node-status-update-frequency调整。 - 你提到的心跳分两类:节点lease心跳默认每10秒更新一次,仅同步节点存活状态,不会携带资源信息;只有完整的节点状态上报才会更新资源相关字段,二者是独立的上报逻辑。
- 调度器的缓存更新无需主动拉取:调度器和apiserver之间通过list-watch机制建立长连接,只要etcd中的Node对象发生变更,apiserver会主动推送变更事件到调度器,调度器收到后立刻更新本地缓存,缓存更新延迟通常在毫秒级。
- 除了节点注册时首次上报容量,kubelet默认每10秒上报一次完整节点状态(包含最新的可分配资源、健康状态等),上报请求直接发送给
问题2:控制平面组件的任务感知机制
- 所有控制平面组件确实都不会直接访问etcd,所有读写操作都要经过kube-apiserver,组件感知任务的核心机制就是list-watch,不需要apiserver主动逐一通知每个组件:
- 组件启动时会先向apiserver发送list请求,拉取自己关心的所有资源对象的全量数据(比如scheduler拉取所有未调度的Pod、所有Node对象,controller-manager的各个控制器拉取自己负责的资源类型,比如deployment控制器拉取deployment、replicaset、pod对象),完成本地缓存初始化。
- 拉取全量数据后,组件会和apiserver保持长连接,持续watch自己关心的资源类型的变更事件:只要有新的资源创建、更新、删除事件,apiserver会主动把事件推送给所有订阅了对应资源类型的组件。
- 以Pod创建流程为例:用户提交Pod创建请求到apiserver,apiserver校验后写入etcd,因为scheduler订阅了未调度Pod的变更事件,apiserver会立刻把这个新Pod的创建事件推送给scheduler,scheduler就会感知到有新的Pod需要调度,无需apiserver专门轮询或者逐一发通知。
内容的提问来源于stack exchange,提问作者Kerek
相关产品推荐
相关产品推荐

