将 kube-scheduler 的日志级别调整到 10,即加入参数--v=10 就可以看到调度 pod 的日志信息。
Kubernetes 调度会经历以下 3 个步骤:
预选。是根据预先定义的规则,把不符合条件的节点过滤掉。比较常见的两个预选规则是 PodFitsResourcesPred 和 PodFitsHost-PortsPred。前一个规则用来判断,一个节点上的剩余资源,是不是能够满足 pod 的需求;而后一个规则,检查一个节点上某一个端口是不是已经被其他 pod 所使用了。
优选。这个阶段,kube-scheduler 会根据节点可用资源及其他一些规则,给剩余节点打分。
CPU 和内存是调度算法考量的两种主要资源,LeastResourceAllocation 和 BalancedResourceAllocation。前一种方式计算 pod 调度到节点之后,节点剩余 CPU 和内存占总 CPU 和内存的比例,比例越高得分就越高;第二种方式计算节点上 CPU 和内存使用比例之差的绝对值,绝对值越大,得分越少。
等分。最后,调度算法会给所有的得分项乘以它们的权重,然后求和得到每个节点最终的得分。最终选择打分最高的主机,最高分有多个时随机选择。
其他影响调度的设置
- 节点选择器 (nodeSelector/nodeName),直接调度到选择的节点上。
- 节点亲和性 (nodeAffinity),节点亲和性是用来确定 Pod 对象调度到哪一个节点的规则,这些规则基于节点上的自定义标签和 Pod 对象上指定的标签选择器进行定义。
• 硬亲和性:实现的是强制性规则,是 Pod 调度时必须满足的规则,否则 Pod 对象的状态会一直是 Pending
• 软亲和性:实现的是一种柔性调度限制,在 Pod 调度时可以尽量满足其规则,在无法满足规则时,可以调度到一个不匹配规则的节点之上。
- Pod 亲和性 (PodAffinity),Pod 亲和性是用来描述一个 Pod 对象和现有的 Pod 对象运行的位置存在某种依赖关系
• 硬亲和性:实现的是强制性规则,是 Pod 调度时必须满足的规则,否则 Pod 对象的状态会一直是 Pending
• 软亲和性:实现的是一种柔性调度限制,在 Pod 调度时可以尽量满足其规则,在无法满足规则时,可以调度到一个不匹配规则的节点之上。
• 反亲和性 (PodAntAffinity):实现的是不想和选中的 pod 在一起
- 污点和容忍度,
污点的定义是在节点的 nodeSpec,而容忍度的定义是在 Pod 中的 podSpec。
污点 (Taint) 是节点用来定义对 pod 对象的排斥等级。
容忍度 (Toleration) 是 pod 用来定义是否能容忍节点定义的排斥。