作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。
我们前面的一个章节Kubernetes(k8s)-Request&Limit介绍,介绍过Request参数是决定Pod调度的一个很重要的指标,实际上在Kubernetes里面有非常多的调度算法来决定某一个Pod应该落到哪个节点上面,下面我们就来介绍下这些算法。
Pod的调度
Pod 的调度是 Kubernetes 中将 Pod 放置在合适节点上运行的过程。调度器是 Kubernetes 控制平面的一部分,它负责根据调度算法和当前集群的状态选择最佳节点。以下是 Pod 调度的主要步骤和考虑因素:
-
调度需求:首先,定义你的 Pod 需要什么样的资源和条件。这可以通过资源请求、限制和 Pod 亲和性规则来指定。
-
资源请求和限制:在 Pod 的定义中,可以为每个容器指定
resources.requests
(最小资源需求)和resources.limits
(资源使用上限)。调度器会确保 Pod 分配到的节点有足够的资源来满足其请求。在真正的生产集群应该为每个Pod配置对应的资源需求和资源限制,并让服务器留有足够的冗余,当某节点故障的时候,确保还有足够的剩余资源满足故障Pod的创建。 -
标签和选择器:通过标签(Labels)和选择器(Selectors)可以控制 Pod 应该调度到哪些节点上。节点亲和性(node affinity)和反亲和性(node anti-affinity)规则允许 Pods 被吸引或排斥于具有特定标签的节点。
-
污点和容忍度:节点上的污点(Taints)阻止某些 Pod 调度到这些节点上,除非这些 Pod 有匹配的容忍度(Tolerations)。
-
Pod 亲和性和反亲和性:Pod 可以通过 Pod 亲和性规则被调度到运行特定 Pod 的节点上,或者通过 Pod 反亲和性规则避免被调度到运行特定 Pod 的节点上。
-
节点选择器:通过节点选择器(nodeSelector),可以将 Pod 分配给具有特定标签的节点。
-
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
。
运维小路
一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!
关注微信公众号《运维小路》获取更多内容。