调度器组件监视那些新创建的未指定运行节点的 Pod,并选择节点让 Pod 在上面运行。调度决策考虑的因素包括单个 Pod 和 Pod 集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限。
当前各个node节点资源会通过kubelet汇总到etcd中,当用户提交创建pod请求时,controller manager监听apiserver的pod事件并处理。此时scheduler通过etcd中存储的node信息进行预选(predict),将符合要求的node选出来。再根据优选(priorities)策略,最后执行Pod与Node绑定。
scheduler并不是每次都对所有的node进行遍历筛选,而是根据参数 percentOfNodeToScore 的值确定需要检查多少个node状态,0表示未设置。如果节点小于50,该参数不生效;超过100个节点集群,按一定的百分比选取参与调度的node节点。
scheduler 与 controller-manager 一致,也是主备模式,只有一个leader处理调度。锁对象如下:
[root@maxiaoke ~]# kubectl get endpoints -n kube-system kube-scheduler -o yaml
apiVersion: v1
kind: Endpoints
metadata:
annotations:
control-plane.alpha.kubernetes.io/leader: '{"holderIdentity":"centos-7-51_1289d143-3521-4a89-bc2d-3de666517013","leaseDurationSeconds":15,"acquireTime":"2021-03-27T02:06:23Z","renewTime":"2021-03-27T02:35:23Z","leaderTransitions":37}'
creationTimestamp: "2020-12-04T13:49:43Z"
name: kube-scheduler
namespace: kube-system
resourceVersion: "1489536"
selfLink: /api/v1/namespaces/kube-system/endpoints/kube-scheduler
uid: 520b8a44-d9bd-41f1-9a0d-cc9448411e9d