PodSpec.NodeName
为空的 pod,对每个 pod 都会创建一个 binding,表明该 pod 应该放到哪个节点上
Kubernetes调度器的源码位于kubernetes/plugin/中,大体的代码目录结构如下所示:
kubernetes/plugin/pkg/ `-- scheduler //调度相关的具体实现 |-- algorithm | |-- predicates //节点筛选策略 | `-- priorities //节点打分策略 | `-- util |-- algorithmprovider | `-- defaults //定义默认的调度器
Predicate 预选过程——过滤不满足条件的节点,满足要求的节点在第二阶段输出
PodFitsResources
:节点上剩余的资源是否大于 pod 请求的资源PodFitsHost
:如果 pod 指定了 NodeName,检查节点名称是否和 NodeName 匹配PodFitsHostPorts
:节点上已经使用的 port 是否和 pod 申请的 port 冲突PodSelectorMatches
:过滤掉和 pod 指定的 label 不匹配的节点NoDiskConflict
:已经 mount 的 volume 和 pod 指定的 volume 不冲突,除非它们都是只读
如果predicate过程中没有合适的节点,pod会一直处于pending状态,直到出现满足条件的节点
Priorities 第二阶段,如果出现多个满足条件的节点,如何计算优先级?
BalancedResourceAllocation
:节点上 CPU 和 Memory 使用率越接近,权重越高。这个应该和上面的一起使用,不应该单独使用
ImageLocalityPriority
:倾向于已经有要使用镜像的节点,镜像总大小值越大,权重越高
Kubernetes中的调度策略主要分为全局调度与运行时调度2种。其中全局调度策略在调度器启动时配置,而运行时调度策略主要包括选择节点(
nodeSelector),节点亲和性(nodeAffinity),pod亲和与反亲和性(podAffinity与podAntiAffinity)。Node Affinity、
podAffinity/AntiAffinity以及后文即将介绍的污点(Taints)与容忍(tolerations)等特性,在Kuberntes1.6中均处于Beta阶段。
所有评论(0)