K8S之Scheduler调度器

本文深入探讨了Kubernetes Scheduler的工作原理,包括其简介、调度过程、节点和Pod的亲和性设置,以及Taint和Toleration的概念。重点介绍了调度器如何根据预选和优选策略选择节点,并解释了如何通过节点和Pod的亲和性、污点与容忍来控制Pod的调度行为。
摘要由CSDN通过智能技术生成

K8S之Scheduler调度器

kubernetes Scheduler 简介

kubernetes Scheduler 运行在 master 节点,它的核心功能是监听 apiserver 来获取 PodSpec.NodeName 为空的 pod,然后为每个这样的 pod 创建一个 binding 指示 pod 应该调度到哪个节点上。

从哪里读取还没有调度的 pod 呢?当然是 apiserver。怎么知道 pod 没有调度呢?它会向 apiserver 请求 spec.nodeName 字段为空的 pod,然后调度得到结果之后,把结果写入 apiserver。

虽然调度的原理说起来很简单,但是要编写一个优秀的调度器却不容易,因为要考虑的东西很多:

  • 公平:如何保证每个节点都能被分配资源
  • 资源高效利用:集群所有资源最大化被使用
  • 效率:调度的性能要好,能够尽快地对大批量的 pod 完成调度工作
  • 灵活:允许用户根据自己的需求控制调度的逻辑
  • 可扩展性:随着集群规模的增加,怎么保证调度器不会成为性能的瓶颈
  • 高可用性:调度器能做组成集群,任何一个调度器出现问题,不会影响整个集群的调度

调度过程

调度的过程分为两个部分:

1.首先是过滤掉不满足条件的节点,这个过程称为 predicate(预选)

Predicate 有一系列的算法可以使用:

  • PodFitsResources:节点上剩余的资源是否大于 pod 请求的资源

  • PodFitsHost:如果 pod 指定了 NodeName,检查节点名称是否和 NodeName 匹配

  • PodFitsHostPorts:节点上已经使用的 port 是否和 pod 申请的 port 冲突

  • PodSelectorMatches:过滤掉和 pod 指定的 label 不匹配的节点

  • NoDiskConflict:已经 mount 的 volume 和 pod 指定的 volume 不冲突,除非它们都是只读

有一条不符合直接pass

2.然后对通过的节点按照优先级排序,这个是 priority(优选)

最后从中选择优先级最高的节点。如果中间任何一步骤有错误,就直接返回错误

Predicate 有一系列的算法可以使用:

  • PodFitsResources:节点上剩余的资源是否大于 pod 请求的资源
  • PodFitsHost:如果 pod 指定了 NodeName,检查节点名称是否和 NodeName 匹配
  • PodFitsHostPorts:节点上已经使用的 port 是否和 pod 申请的 port 冲突
  • PodSelectorMatches:过滤掉和 pod 指定的 label 不匹配的节点
  • NoDiskConflict:已经 mount 的 volume 和 pod 指定的 volume 不冲突,除非它们都是只读

如果在 predicate 过程中没有合适的节点,pod 会一直在 pending 状态,不断重试调度,直到有节点满足条件。经过这个步骤,如果有多个节点满足条件,就继续 priorities 过程: 按照优先级大小对节点排序。

优先级由一系列键值对组成,键是该优先级项的名称,值是它的权重(该项的重要性)。这些优先级选项包括:

  • LeastRequestedPriority:通过计算 CPU 和 Memory 的使用率来决定权重,使用率越低权重越高。换句话说,这个优先级指标倾向于资源使用比例更低的节点
  • BalancedResourceAllocation:节点上 CPU 和 Memory 使用率越接近,权重越高。这个应该和上面的一起使用,不应该单独使用
  • ImageLocalityPriority:倾向于已经有要使用镜像的节点,镜像总大小值越大,权重越高

通过算法对所有的优先级项目和权重进行计算,得出最终的结果

调度器的亲和性

调度器的亲和性有两种:一种是节点的亲和性,另一种的Pod的亲和性

亲和性是在Predicate(预选)的基础上实现的

所谓的亲和性就是呆在一起,硬亲和:必须呆在一起,否则不匹配。软亲和:尽可能呆在一起,不在一起也没关系。总之一句话:我要找指定的node节点或者Pod

节点(node)亲和性-pod.spec.nodeAffinity

要创建的Pod找指定的node节点

亲和性的策略
  • requiredDuringSchedulingIgnoredDuringExecution:硬策略

硬策略指的是强制性的,必须匹配或必须不匹配

  • preferredDuringSchedulingIgnoredDuringExecution:软策略

软策略指的是尽量匹配,如果没有匹配也没有关系

键值运算关系
  • In:label 的值在某个列表中
  • NotIn:label 的值不在某个列表中
  • Gt:label 的值大于某个值
  • Lt:label 的值小于某个值
  • Exists:某个 label 存在
  • DoesNotExist:某个 label 不存在

硬匹配举例:

硬亲和性:requiredDuringSchedulingIgnoredDuringExecution

apiVersion: v1
kind: Pod
metadata:
  name: affinity
  labels:
    app: node-affinity-pod
spec:
  containers:
  - name: with-node-affinity
    image: wangyanglinux/myapp:v1
  affinity:  # 亲和性策略
    nodeAffinity
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值