AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
`kube-scheduler`的职责主要有以下 3 个: 1. 集群高可用 `kube-scheduler`可以设置`leader-elect`启动参数,这样会通过`etcd`进行节点选主。`kube-scheduler`和`kube-controller-manager`都使用了一主多从的高可用方案。简单理解的话是这样的:`kube-scheduler`启动时,会在`etcd`中创建 endpoint,endpoint 的信息中记录了当前的 leader 节点信息,以及上次更新时间。leader 节点会定期更新 endpoint 的信息,维护自己的 leader 身份,每个从节点的服务都会定期检查 endpoint 的信息,如果 endpoint 的信息在规定的时间范围内没有更新,从节点将会尝试更新自己的 leader 节点。 2. 调度资源监听 通过 Watch 机制监听`kube-apiserver`上资源(Pod 和 Node)的变化。 `kube-apiserver`给其它的组件(比如:`kubelet`、`kube-controller-manager`、`kube-scheduler`)等提供了一套`Watch`机制用于监控各种资源的变化,类似于消息中间件的发布-订阅模式(Push),这样`kube-apiserver`可以主动通知这些组件。 `kube-apiserver`初始化时,会建立对 etcd 的连接并 watch etcd。当`kube-scheduler`客户端调用`Watch API`时,`kube-apiserver`内部会建立一个 WatchServer,WatchServer 会从`etcd`中获取资源的`Watch event`,`Watch event`经过加工过滤后就会发送给客户端,`Watch API`本质上是一个 GET 请求,通常有两种实现模式:通过`websocket`协议发送;或是通过`Transfer-Encoding=chunked`方式建立长连接。 3. 调度节点分配 这个职责也是我们本节点将会重点介绍的部分。调度节点分配分为两个环节:预选(`Predicates`)与优选(`Priorites`)。调度资源监听也是为了这个环节提供数据输入。 * 预选:遍历所有目标 Node,根据配置的预选策略`Predicates Policies`过滤掉不符合策略的 Node,剩下符合要求的候选节点。预选的输出将会作为优选的输入。预选策略默认使用的是`DefaultProvider`中定义的`default predicates policies`集合。 * 优选:根据配置的优选策略`Priorites Policies`,为前一步过滤后的 Node 进行打分排名,得分最高的 Node 将作为最适合的 Node,该 Pod 将绑定(Bind)到最适合的 Node 上。如果打分排名后,有多个 Node 并列得分最高,`kube-scheduler`会从中随机选取一个 Node 作为目标 Node。优选策略默认使用的是`DefaultProvider`中定义的`default priorites policies`集合。 `kube-scheduler`调度节点分配需要考虑的问题较多,有: * 公平:如何保证每个 Node 都能够分配资源 * 资源高效利用:集群所有资源能够被最大化使用 * 效率:调度性能高,能够尽快对大批量的 Pod 完成调度工作 * 灵活:允许用户自定义调度逻辑 `kube-scheduler`官方流程图如下所示: ~~~text For given pod: +---------------------------------------------+ | Schedulable nodes: | | | | +--------+ +--------+ +--------+ | | | node 1 | | node 2 | | node 3 | | | +--------+ +--------+ +--------+ | | | +-------------------+-------------------------+ | | v +-------------------+-------------------------+ Pred. filters: node 3 doesn't have enough resource +-------------------+-------------------------+ | | v +-------------------+-------------------------+ | remaining nodes: | | +--------+ +--------+ | | | node 1 | | node 2 | | | +--------+ +--------+ | | | +-------------------+-------------------------+ | | v +-------------------+-------------------------+ Priority function: node 1: p=2 node 2: p=5 +-------------------+-------------------------+ | | v select max{node priority} = node 2 ~~~