0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

深入研究Kubernetes调度

阿铭linux 来源:K8sMeetup社区 作者:Ron Sobol 2021-08-23 10:39 次阅读

“本文从 Pod 和节点的配置开始,介绍了 Kubernetes Scheduler 框架、扩展点、API 以及可能发生的与资源相关的瓶颈,并展示了性能调整设置,涵盖了 Kubernetes 中调度的大多方面。

Kubernetes Scheduler 是 Kubernetes 控制平面的核心组件之一。它在控制平面上运行,将 Pod 分配给节点,同时平衡节点之间的资源利用率。将 Pod 分配给新节点后,在该节点上运行的 kubelet 会在 Kubernetes API 中检索 Pod 定义,根据节点上的 Pod 规范创建资源和容器。换句话说,Scheduler 在控制平面内运行,并将工作负载分配给 Kubernetes 集群。

本文将对 Kubernetes Scheduler 进行深入研究,首先概述一般的调度以及具有亲和力(affinity)和 taint 的驱逐调度,然后讨论调度程序的瓶颈以及生产中可能遇到的问题,最后研究如何微调调度程序的参数以适合集群。

调度简介

Kubernetes 调度是将 Pod 分配给集群中匹配节点的过程。Scheduler 监控新创建的 Pod,并为其分配最佳节点。它会根据 Kubernetes 的调度原则和我们的配置选项选择最佳节点。最简单的配置选项是直接在 PodSpec 设置 nodeName:

apiVersion: v1

kind: Pod

metadata:

name: nginx

spec:

containers

- name: nginx

image: nginx

nodeName: node-01

上面的 nginx pod 默认情况下将在 node-01 上运行,但是 nodeName 有许多限制导致无法正常运行 Pod,例如云中节点名称未知、资源节点不足以及节点网络间歇性问题等。因此,除了测试或开发期间,我们最好不使用 nodeName。

如果要在一组特定的节点上运行 Pod,可以使用 nodeSelector。我们在 PodSpec 中将 nodeSelector 定义为一组键值对:

apiVersion: v1

kind: Pod

metadata:

name: nginx

spec:

containers:

- name: nginx

image: nginx

nodeSelector:

disktype: ssd

对于上面的 nginx pod,Kubernetes Scheduler 将找到一个磁盘类型为 ssd 的节点。当然,该节点可以具有其他标签。我们可以在 Kubernetes 参考文档中查看标签的完整列表。

地址:https://kubernetes.io/docs/reference/kubernetes-api/labels-annotations-taints/

使用 nodeSelector 有约束 Pod 可以在有特定标签的节点上运行。但它的使用仅受标签及其值限制。Kubernetes 中有两个更全面的功能来表达更复杂的调度需求:节点亲和力(node affinity),标记容器以将其吸引到一组节点上;taint 和 toleration,标记节点以排斥 Pod。这些功能将在下面讨论。

节点亲和力

节点亲和力(Node Affinity)是在 Pod 上定义的一组约束,用于确定哪些节点适合进行调度,即使用亲和性规则为 Pod 的节点分配定义硬性要求和软性要求。例如可以将 Pod 配置为仅运行带有 GPU 的节点,并且最好使用 NVIDIA_TESLA_V100 运行深度学习工作负载。Scheduler 会评估规则,并在定义的约束内找到合适的节点。与 nodeSelectors 相似,节点亲和性规则可与节点标签一起使用,但它比 nodeSelectors 更强大。

我们可以为 podspec 添加四个相似性规则:

requiredDuringSchedulingIgnoredDuringExecution

requiredDuringSchedulingRequiredDuringExecution

preferredDuringSchedulingIgnoredDuringExecution

preferredDuringSchedulingRequiredDuringExecution

这四个规则由两个条件组成:必需或首选条件,以及两个阶段:计划和执行。以 required 开头的规则描述了必须满足的严格要求。以 preferred 开头的规则是软性要求,将强制执行但不能保证。调度阶段是指将 Pod 首次分配给节点。执行阶段适用于在调度分配后节点标签发生更改的情况。

如果规则声明为 IgnoredDuringExecution,Scheduler 在第一次分配后不会检查其有效性。但如果使用 RequiredDuringExecution 指定了规则,Scheduler 会通过将容器移至合适的节点来确保规则的有效性。

以下是示例:

apiVersion: v1kind: Pod

metadata:

name: nginx

spec:

affinity:

nodeAffinity:

requiredDuringSchedulingIgnoredDuringExecution:

nodeSelectorTerms

- matchExpressions:

- key: topology.kubernetes.io/region

operator: In

values:

- us-east

preferredDuringSchedulingIgnoredDuringExecution:

- weight: 1

preference:

matchExpressions:

- key: topology.kubernetes.io/zone

operator: In

values:

- us-east-1

- us-east-2

containers:

- name: nginx

image: nginx

上面的 Nginx Pod 具有节点亲和性规则,该规则让 Kubernetes Scheduler 将 Pod 放置在 us-east 的节点上。第二条规则指示优先使用 us-east-1 或 us-east-2。

使用亲和性规则,我们可以让 Kubernetes 调度决策适用于自定义需求。

Taint 与 Toleration

集群中并非所有 Kubernetes 节点都相同。某些节点可能具有特殊的硬件,例如 GPU、磁盘或网络功能。同样,我们可能需要将一些节点专用于测试、数据保护或用户组。我们可以将 Taint 添加到节点以排斥 Pod,如以下示例所示:

kubectl taint nodes node1 test-environment=true:NoSchedule

使用 test-environment=true:NoScheduletaint 时,除非在 podspec 具有匹配的 toleration,否则 Kubernetes Scheduler 将不会分配任何 pod:

apiVersion: v1kind: Pod

metadata:

name: nginx

spec:

containers:

- name: nginx

image: nginx

tolerations:

- key: “test-environment”

operator: “Exists”

effect: “NoSchedule”

taint 和 tolerations 共同发挥作用,让 Kubernetes Scheduler 专用于某些节点并分配特定 Pod。

调度瓶颈

尽管 Kubernetes Scheduler 能选择最佳节点,但是在 Pod 开始运行之后,“最佳节点”可能会改变。所以从长远来看,Pod 的资源使用及其节点分配可能存在问题。

资源请求(Request)和限制(Limit):“Noisy Neighbor”

“Noisy Neighbor”并不特定于 Kubernetes。任何多租户系统都是它们的潜在地。假设有两个容器 A 和 B,它们在同一节点上运行。如果 Pod B 试图通过消耗所有 CPU 或内存来创造 noise,Pod A 将出现问题。如果我们为容器设置了资源请求和限制就能控制住 neighbor。Kubernetes 将确保为容器安排其请求的资源,并且不会消耗超出其资源限制的资源。如果在生产中运行 Kubernetes,最好设置资源请求和限制以确保系统可靠。

系统进程资源不足

Kubernetes 节点主要是连接到 Kubernetes 控制平面的虚拟机。因此,节点上也有自己的操作系统和相关进程。如果 Kubernetes 工作负载消耗了所有资源,则这些节点将无法运行,并会发生各种问题问题。我们需要在 kubelet 中使用 –system -reserved 设置保留资源,以防止发生这种情况。

抢占或调度 Pod

如果 Kubernetes Scheduler 无法将 Pod 调度到可用节点,则可以从节点抢占(preempt)或驱逐(evict)一些 Pod 以分配资源。如果看到 Pod 在集群中移动而没有发现特定原因,可以使用优先级类对其进行定义。同样,如果没有调度好 Pod,并且正在等待其他 Pod,也需要检查其优先级。

以下是示例:

apiVersion: scheduling.k8s.io/v1kind: PriorityClass

metadata:

name: high-priority-nonpreempting

value: 100000preemptionPolicy: NeverglobalDefault: false

description: “This priority class will not preempt other pods.”

可以通过以下方式在 podspec 中为分配优先级:

apiVersion: v1kind: Pod

metadata:

name: nginx

spec:

containers:

- name: nginx

image: nginx

priorityClassName: high-priority-nonpreempting

调度框架

Kubernetes Scheduler 具有可插拔的调度框架架构,可向框架添加一组新的插件。插件实现 Plugin API,并被编译到调度程序中。下面我们将讨论调度框架的工作流、扩展点和 Plugin API。

工作流和扩展点

调度 Pod 包括两个阶段:调度周期(scheduling cycle)和绑定周期(binding cycle)。在调度周期中,Scheduler 会找到一个可用节点,然后在绑定过程中,将决策应用于集群。

工作流中的以下几点对插件扩展开放:

QueueSort:对队列中的 Pod 进行排序

PreFilter:检查预处理 Pod 的相关信息以安排调度周期

Filter:过滤不适合该 Pod 的节点

PostFilter:如果找不到可用于 Pod 的可行节点,调用该插件

PreScore:运行 PreScore 任务以生成一个可共享状态供 Score 插件使用

Score:通过调用每个 Score 插件对过滤的节点进行排名

NormalizeScore:合并分数并计算节点的最终排名

Reserve:在绑定周期之前选择保留的节点

Permit:批准或拒绝调度周期结果

PreBind:执行任何先决条件工作,例如配置网络卷

Bind:将 Pod 分配给 Kubernetes API 中的节点

PostBind:通知绑定周期的结果

插件扩展实现了 Plugin API,是 Kubernetes Scheduler 的一部分。我们可以在 Kubernetes 存储库中检查。插件应使用以下名称进行注册:

// Plugin is the parent type for all the scheduling framework plugins.

type Plugin interface {

Name() string

}

插件还实现了相关的扩展点,如下所示:

// QueueSortPlugin is an interface that must be implemented by “QueueSort” plugins.

// These plugins are used to sort pods in the scheduling queue. Only one queue sort plugin may be enabled at a time.

type QueueSortPlugin interface {

Plugin

// Less are used to sort pods in the scheduling queue.

Less(*QueuedPodInfo, *QueuedPodInfo) bool

}

Scheduler 性能调整

Kubernetes Scheduler 有一个工作流来查找和绑定 Pod 的可行节点。当集群中的节点数量非常多时,Scheduler 的工作量将成倍增加。在大型集群中,可能需要很长时间才能找到最佳节点,因此要微调调度程序的性能,以在延迟和准确性之间找到折中方案。

percentageOfNodesToScore 将限制节点的数量来计算自己的分数。默认情况下,Kubernetes 在 100 节点集群的 50% 和 5000 节点集群的 10% 之间设置线性阈值。默认最小值为 5%,它要确保至少考虑集群中 5% 节点的调度。

下面的示例展示了如何通过性能调整 kube-scheduler 来手动设置阈值:

apiVersion: kubescheduler.config.k8s.io/v1alpha1

kind: KubeSchedulerConfiguration

algorithmSource:

provider: DefaultProvider

percentageOfNodesToScore: 50

如果有一个庞大的集群并且 Kubernetes 工作负载不能承受 Kubernetes Scheduler 引起的延迟,那么更改百分比是个好主意。

总结

本文涵盖了 Kubernetes 调度的大多方面,从 Pod 和节点的配置开始,包括 nodeSelector、亲和性规则、taint 和 toleration,然后介绍了 Kubernetes Scheduler 框架、扩展点、API 以及可能发生的与资源相关的瓶颈,最后展示了性能调整设置。尽管 Kubernetes Scheduler 能简单地将 Pod 分配给节点,但是了解其动态性并对其进行配置以实现可靠的生产级 Kubernetes 设置至关重要。

原文链接:https://thenewstack.io/a-deep-dive-into-kubernetes-scheduling/

作者:Ron Sobol. 翻译:Bach(才云)

校对:星空下的文仔(才云)、bot(才云)

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • kubernetes
    +关注

    关注

    0

    文章

    224

    浏览量

    8713

原文标题:Kubernetes 调度详解

文章出处:【微信号:aming_linux,微信公众号:阿铭linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    电力系统中电动车充电桩布局与调度的优化策略探究

    15821697760 摘要:本文深入钻研电动车充电桩于电力系统布局及调度的问题,融合地理信息系统与电网模型,综合考虑电力供应能力、民众电动车出行需求以及充电设备安全等要素,构建多因多目标优化模型
    的头像 发表于 12-13 16:39 211次阅读
    电力系统中电动车充电桩布局与<b class='flag-5'>调度</b>的优化策略探究

    对于电力系统中新能源电动车充电桩布局与调度优化方法的研究

    本文针对电动车充电桩在电力系统布局及调度方面进行深入研究,借鉴地理信息系统与电网模型,综合考量电力供应的能力,大众对电动车出行需求,以及充电设备的安全,多因多目标优化模型诞生。有效地确定充电桩的*优布局方案。
    的头像 发表于 12-12 08:39 168次阅读
    对于电力系统中新能源电动车充电桩布局与<b class='flag-5'>调度</b>优化方法的<b class='flag-5'>研究</b>

    电动汽车有序充放电分群调度:原理、策略与平台应用的深度剖析与展望

    分群调度策略实施步骤、挑战及效果评估体系。结论显示该策略在提升电网效率与用户满意度方面成果显著,未来仍需在威廉希尔官方网站 创新、用户行为探究及政策协同等方面深入挖掘。 关键词:电动汽车;有序充放电;分群调度;智能优化算法 1.
    的头像 发表于 12-04 16:36 368次阅读
    电动汽车有序充放电分群<b class='flag-5'>调度</b>:原理、策略与平台应用的深度剖析与展望

    基于量子计算威廉希尔官方网站 的AGV调度问题研究

    由于自动化和智能化的普及,AGV(自动导引车)调度问题在物流、运输和生产领域有着广泛的应用。 随着AGV数量的增加,经典计算方法难以满足大规模调度的需求,而玻色量子自研的相干光量子计算威廉希尔官方网站 具有强大
    的头像 发表于 11-11 09:36 240次阅读
    基于量子计算威廉希尔官方网站
的AGV<b class='flag-5'>调度</b>问题<b class='flag-5'>研究</b>

    构建语音控制机器人 - 深入研究电路

    2024-07-29 |Annabel Ng S1XT33N项目 正如[之前的博客文章]中提到的,加州大学伯克利分校的 EECS 16B 课程重点关注构建名为 S1XT33N 的语音控制机器人的为期一个学期的项目。然而,这个机器人并不是你在初中或高中时建造的标准机器人汽车。我和我的实验室伙伴只获得了基本的两轮机器人组件,包括轮子、电机、底盘、Arduino Leonardo、电池和面包板,我们必须自己构建和连接其他所有组件。如果您有兴趣了解有关该课程的更多信息,请访问课程网站[https://www.eec
    的头像 发表于 10-02 16:40 234次阅读
    构建语音控制机器人 - <b class='flag-5'>深入研究</b>电路

    深入探讨Linux的进程调度

    Linux操作系统作为一个开源且广泛应用的操作系统,其内核设计包含了许多核心功能,而进程调度器(Scheduler)就是其中一个至关重要的模块。进程调度器负责决定在任何给定的时刻哪个进程可以运行
    的头像 发表于 08-13 13:36 940次阅读
    <b class='flag-5'>深入</b>探讨Linux的进程<b class='flag-5'>调度</b>器

    使用Velero备份Kubernetes集群

    Velero 是 heptio 团队(被 VMWare 收购)开源的 Kubernetes 集群备份、迁移工具。
    的头像 发表于 08-05 15:43 349次阅读
    使用Velero备份<b class='flag-5'>Kubernetes</b>集群

    如何使用Kubeadm命令在PetaExpress Ubuntu系统上安装Kubernetes集群

    Kubernetes,通常缩写为K8s,是一个开源的容器编排平台,旨在自动化容器化应用的部署、扩展和管理。有了Kubernetes,您可以轻松地部署、更新和扩展应用,而无需担心底层基础设施。
    的头像 发表于 07-15 13:31 858次阅读
    如何使用Kubeadm命令在PetaExpress Ubuntu系统上安装<b class='flag-5'>Kubernetes</b>集群

    伦敦商学院深入研究中国神州数码战略转型

    China)数字化转型历程的深入研究为基础,共同撰写了案例研究「神州数码的转型:驾驭数据、云和人工智能的潜力(The Transformation of Digital China
    的头像 发表于 07-02 11:25 502次阅读
    伦敦商学院<b class='flag-5'>深入研究</b>中国神州数码战略转型

    AQY212S光耦合器:特性和应用揭秘

    让我们深入研究AQY212S的功能和应用,揭开这款令人印象深刻的器件的神秘面纱。
    的头像 发表于 01-19 16:01 1180次阅读
    AQY212S光耦合器:特性和应用揭秘

    Kubernetes Gateway API攻略教程

    Kubernetes Gateway API 刚刚 GA,旨在改进将集群服务暴露给外部的过程。这其中包括一套更标准、更强大的 API资源,用于管理已暴露的服务。在这篇文章中,我将介绍 Gateway
    的头像 发表于 01-12 11:32 887次阅读
    <b class='flag-5'>Kubernetes</b> Gateway API攻略教程

    深入研究电路设计中的“地”之谜:详解分类与作用应用

    在电路设计中,地(Ground)是一个至关重要的概念,它承担着电路中引导电流、稳定电压、保护设备等多重职责。
    的头像 发表于 01-10 15:52 2440次阅读
    <b class='flag-5'>深入研究</b>电路设计中的“地”之谜:详解分类与作用应用

    深入理解FFmpeg阅读体验》+ 书收到了,崭新的开篇

    今天收到了《深入理解FFmpeg》 崭新的书,一个在2022年较近距离接触过却尚未深入研究的领域图像处理。最近刚好在作这方面的研究,希望自己可以把握这次机会,好好学习下 FFMpeg,相信可以让自己
    发表于 01-07 18:57

    使用Jenkins和单个模板部署多个Kubernetes组件

    在持续集成和部署中,我们通常需要部署多个实例或组件到Kubernetes集群中。通过Jenkins的管道脚本,我们可以自动化这个过程。在本文中,我将演示如何使用Jenkins Pipeline及单个
    的头像 发表于 01-02 11:40 761次阅读
    使用Jenkins和单个模板部署多个<b class='flag-5'>Kubernetes</b>组件

    Kubernetes RBAC:掌握权限管理的精髓

    Kubernetes RBAC(Role-Based Access Control)是 Kubernetes 中一项关键的安全功能,它通过细粒度的权限控制机制,确保集群资源仅被授权的用户或服务账号访问。
    的头像 发表于 12-25 09:43 475次阅读