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

作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

图片

我们上一章介绍了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来完成的。

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

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

运维小路

一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

关注微信公众号《运维小路》获取更多内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值