首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Kubernetes(k8s)-调度(Scheduler)介绍

Kubernetes(k8s)-调度(Scheduler)介绍

作者头像
运维小路
发布2025-02-06 12:16:43
发布2025-02-06 12:16:43
23600
代码可运行
举报
文章被收录于专栏:运维小路运维小路
运行总次数:0
代码可运行

作者介绍:简历上没有一个精通的运维工程师。下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。

我们前面的一个章节Kubernetes(k8s)-Request&Limit介绍,介绍过Request参数是决定Pod调度的一个很重要的指标,实际上在Kubernetes里面有非常多的调度算法来决定某一个Pod应该落到哪个节点上面,下面我们就来介绍下这些算法。

Pod的调度

Pod 的调度是 Kubernetes 中将 Pod 放置在合适节点上运行的过程。调度器是 Kubernetes 控制平面的一部分,它负责根据调度算法和当前集群的状态选择最佳节点。以下是 Pod 调度的主要步骤和考虑因素:

  1. 调度需求:首先,定义你的 Pod 需要什么样的资源和条件。这可以通过资源请求、限制和 Pod 亲和性规则来指定。
  2. 资源请求和限制:在 Pod 的定义中,可以为每个容器指定 resources.requests(最小资源需求)和 resources.limits(资源使用上限)。调度器会确保 Pod 分配到的节点有足够的资源来满足其请求。在真正的生产集群应该为每个Pod配置对应的资源需求和资源限制,并让服务器留有足够的冗余,当某节点故障的时候,确保还有足够的剩余资源满足故障Pod的创建。
  3. 标签和选择器:通过标签(Labels)和选择器(Selectors)可以控制 Pod 应该调度到哪些节点上。节点亲和性(node affinity)和反亲和性(node anti-affinity)规则允许 Pods 被吸引或排斥于具有特定标签的节点。
  4. 污点和容忍度:节点上的污点(Taints)阻止某些 Pod 调度到这些节点上,除非这些 Pod 有匹配的容忍度(Tolerations)。
  5. Pod 亲和性和反亲和性:Pod 可以通过 Pod 亲和性规则被调度到运行特定 Pod 的节点上,或者通过 Pod 反亲和性规则避免被调度到运行特定 Pod 的节点上。
  6. 节点选择器:通过节点选择器(nodeSelector),可以将 Pod 分配给具有特定标签的节点。
  7. PVC关联性: 某些Pod是带有PVC资源的,而部分PVC资源是绑定在某一个节点的,那么这个Pod则只能落到某一个固定节点上面。

调度器在决定将 Pod 放置在何处时,遵循以下基本流程:

  • 预选(Predicates):调度器筛选出符合 Pod 资源请求、节点选择器、容忍度等要求的节点。排除那些不满足基本前提条件的节点。
  • 优选(Priorities):对于通过预选的节点,调度器会评分,优先考虑那些资源利用率最高、最能满足 Pod 亲和性/反亲和性规则的节点。
  • 绑定(Binding):一旦选择了最佳节点,调度器会创建一个绑定操作,将 Pod 和选定的节点关联起来。

Pod 调度是一个复杂的过程,它涉及到多种不同的策略和算法。了解这些概念有助于优化 Pod 的调度策略,使得 Kubernetes 集群能够更高效、稳定地运行。它是由管控组kube-scheduler来完成的。

下面的日志就是我测试集群节点的演示日志

代码语言:javascript
代码运行次数:0
运行
复制
I0204 08:25:52.832631       1 resource_allocation.go:73] "Listing internal info for allocatable resources, requested resources and score" pod="default/nginx-deployment-c5cbddb86-66ggl" node="node01" resourceAllocationScorer="LeastAllocated" allocatableResource=map[cpu:2000 memory:3890135040] requestedResource=map[cpu:750 memory:1258291200] resourceScore=64
I0204 08:25:52.832649       1 resource_allocation.go:73] "Listing internal info for allocatable resources, requested resources and score" pod="default/nginx-deployment-c5cbddb86-66ggl" node="node01" resourceAllocationScorer="NodeResourcesBalancedAllocation" allocatableResource=map[cpu:2000 memory:3890135040] requestedResource=map[cpu:250 memory:0] resourceScore=93
I0204 08:25:52.832661       1 resource_allocation.go:73] "Listing internal info for allocatable resources, requested resources and score" pod="default/nginx-deployment-c5cbddb86-66ggl" node="node02" resourceAllocationScorer="LeastAllocated" allocatableResource=map[cpu:2000 memory:3890126848] requestedResource=map[cpu:450 memory:629145600] resourceScore=80
I0204 08:25:52.832670       1 resource_allocation.go:73] "Listing internal info for allocatable resources, requested resources and score" pod="default/nginx-deployment-c5cbddb86-66ggl" node="node02" resourceAllocationScorer="NodeResourcesBalancedAllocation" allocatableResource=map[cpu:2000 memory:3890126848] requestedResource=map[cpu:250 memory:0] resourceScore=93
I0204 08:25:52.832722       1 generic_scheduler.go:434] "Plugin scored node for pod" pod="default/nginx-deployment-c5cbddb86-66ggl" plugin="NodeResourcesFit" node="node01" score=64
I0204 08:25:52.832728       1 generic_scheduler.go:434] "Plugin scored node for pod" pod="default/nginx-deployment-c5cbddb86-66ggl" plugin="NodeResourcesFit" node="node02" score=80
I0204 08:25:52.832732       1 generic_scheduler.go:434] "Plugin scored node for pod" pod="default/nginx-deployment-c5cbddb86-66ggl" plugin="VolumeBinding" node="node01" score=0
I0204 08:25:52.832736       1 generic_scheduler.go:434] "Plugin scored node for pod" pod="default/nginx-deployment-c5cbddb86-66ggl" plugin="VolumeBinding" node="node02" score=0
I0204 08:25:52.832740       1 generic_scheduler.go:434] "Plugin scored node for pod" pod="default/nginx-deployment-c5cbddb86-66ggl" plugin="PodTopologySpread" node="node01" score=200
I0204 08:25:52.832744       1 generic_scheduler.go:434] "Plugin scored node for pod" pod="default/nginx-deployment-c5cbddb86-66ggl" plugin="PodTopologySpread" node="node02" score=200
I0204 08:25:52.832748       1 generic_scheduler.go:434] "Plugin scored node for pod" pod="default/nginx-deployment-c5cbddb86-66ggl" plugin="InterPodAffinity" node="node01" score=0
I0204 08:25:52.832752       1 generic_scheduler.go:434] "Plugin scored node for pod" pod="default/nginx-deployment-c5cbddb86-66ggl" plugin="InterPodAffinity" node="node02" score=0
I0204 08:25:52.832756       1 generic_scheduler.go:434] "Plugin scored node for pod" pod="default/nginx-deployment-c5cbddb86-66ggl" plugin="NodeResourcesBalancedAllocation" node="node01" score=93
I0204 08:25:52.832760       1 generic_scheduler.go:434] "Plugin scored node for pod" pod="default/nginx-deployment-c5cbddb86-66ggl" plugin="NodeResourcesBalancedAllocation" node="node02" score=93
I0204 08:25:52.832764       1 generic_scheduler.go:434] "Plugin scored node for pod" pod="default/nginx-deployment-c5cbddb86-66ggl" plugin="ImageLocality" node="node01" score=3
I0204 08:25:52.832768       1 generic_scheduler.go:434] "Plugin scored node for pod" pod="default/nginx-deployment-c5cbddb86-66ggl" plugin="ImageLocality" node="node02" score=0
I0204 08:25:52.832772       1 generic_scheduler.go:434] "Plugin scored node for pod" pod="default/nginx-deployment-c5cbddb86-66ggl" plugin="TaintToleration" node="node01" score=300
I0204 08:25:52.832777       1 generic_scheduler.go:434] "Plugin scored node for pod" pod="default/nginx-deployment-c5cbddb86-66ggl" plugin="TaintToleration" node="node02" score=300
I0204 08:25:52.832781       1 generic_scheduler.go:434] "Plugin scored node for pod" pod="default/nginx-deployment-c5cbddb86-66ggl" plugin="NodeAffinity" node="node01" score=0
I0204 08:25:52.832785       1 generic_scheduler.go:434] "Plugin scored node for pod" pod="default/nginx-deployment-c5cbddb86-66ggl" plugin="NodeAffinity" node="node02" score=0
I0204 08:25:52.832791       1 generic_scheduler.go:491] "Calculated node's final score for pod" pod="default/nginx-deployment-c5cbddb86-66ggl" node="node01" score=660
I0204 08:25:52.832795       1 generic_scheduler.go:491] "Calculated node's final score for pod" pod="default/nginx-deployment-c5cbddb86-66ggl" node="node02" score=673

这个打分过程包括

1. 资源分配评分插件

a. NodeResourcesFit(资源适配度)
  • 作用:检查节点资源是否能满足 Pod 需求。
b. NodeResourcesBalancedAllocation(资源平衡分配)
  • 作用:确保 CPU 和内存资源的分配平衡,避免某一资源耗尽。

2. 存储相关插件

VolumeBinding(卷绑定)
  • 作用:检查节点是否满足 Pod 的卷绑定需求(如 PVC 绑定状态)。

3. 拓扑与亲和性插件

a. PodTopologySpread(Pod 拓扑分布)
  • 作用:确保 Pod 在指定拓扑域(如节点、区域)中均匀分布。
b. InterPodAffinity(Pod 间亲和性/反亲和性)
  • 作用:检查 Pod 与其他 Pod 的亲和性/反亲和性规则。
c. NodeAffinity(节点亲和性)
  • 作用:检查节点标签是否匹配 Pod 的亲和性规则。

4. 镜像与污点容忍插件

a. ImageLocality(镜像本地性)
  • 作用:优先选择已存在 Pod 所需镜像的节点。
b. TaintToleration(污点容忍)
  • 作用:检查节点污点是否被 Pod 容忍。

5. 最终得分计算

6. 调度结果

  • 得分对比node02 总分 673 > node01 总分 660
  • 调度决策:调度器会将 Pod nginx-deployment-c5cbddb86-66ggl 绑定到 node02
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-02-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维小路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Pod的调度
    • 1. 资源分配评分插件
    • 2. 存储相关插件
    • 3. 拓扑与亲和性插件
    • 4. 镜像与污点容忍插件
    • 5. 最终得分计算
    • 6. 调度结果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档