12. 集群调度

2023-11-02

该文档内容来源于尚硅谷K8S教学视频课件尚硅谷

仅用于知识整理,便于后续巩固复习,如有侵权,请联系本人删除

简介

Scheduler 是 kubernetes 的调度器,主要的任务是把定义的 pod 分配到集群的节点上。要考虑的问题有:

  • 公平:如何保证每个节点都能被分配资源
  • 资源高效利用:集群所有资源最大化被使用
  • 效率:调度的性能要好,能够尽快地对大批量的 pod 完成调度工作
  • 灵活:允许用户根据自己的需求控制调度的逻辑

Sheduler 是作为单独的程序运行的,启动之后会一直坚挺 API Server,获取 PodSpec.NodeName 为空的 pod(也就是说pod的配置文件中没有指定该pod要运行的node), 对每个 pod 都会创建一个 binding,表明该 pod 应该放到哪个节点上

调度过程

调度分为几个部分,如果中间任何一步骤有错误,就直接返回错误:

  1. 首先是过滤掉不满足条件的节点,这个过程称为 predicate
  2. 然后对通过的节点按照优先级 排序,这个是 priority
  3. 最后从中选择优先级最高的节点。

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 :倾向于已经有要使用镜像的节点,镜像总大小值越大,权重越高 通过算法对所有的优先级项目和权重进行计算,得出最终的结果

自定义调度器

除了 kubernetes 自带的调度器,你也可以编写自己的调度器。通过 spec:schedulername 参数指定调度器的名 字,可以为 pod 选择某个调度器进行调度。比如下面的 pod 选择 my-scheduler 进行调度,而不是默认的 default-scheduler :

apiVersion: v1
kind: Pod
metadata:
  name: annotation-second-scheduler
  labels:
    name: multischeduler-example
spec:
  schedulername: my-scheduler
  containers:
  - name: pod-with-second-annotation-container
    image: gcr.io/google_containers/pause:2.0

调度亲和性

Node亲和性

举例:李阳想去A大学进修,因为他觉得A大学更适合他。把李阳比作pod,把A大学比作node,这个过程就是node亲和性。其中分为两种策略,软策略和硬策略。软策略就是,李阳想去A大学(至于最后去没去,不一定);硬策略就是李阳必须去A大学,如果去不了,那就撂挑子不干了。(说白了,就是pod更倾向于在哪个node上部署)

pod.spec.nodeAffinity (k8s中通过该字段设置节点亲和性)

  • preferredDuringSchedulingIgnoredDuringExecution:软策略
  • requiredDuringSchedulingIgnoredDuringExecution:硬策略
preferredDuringSchedulingIgnoredDuringExecution
apiVersion: v1
kind: Pod
metadata:
  name: affinity
  labels:
    app: node-affinity-pod
spec:
  containers:
  - name: with-node-affinity
    image: hub.atguigu.com/library/myapp:v1
  affinity:
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      #权重的含义就是,当有多个软策略提供时,优先选择weight最大的
      - weight: 1
        preference:
          matchExpressions:
          - key: kubernetes.io/hostname
            operator: In
            values:
            - k8s-node02
            #上面这个匹配规则的含义:最好分配到label名为kubernetes.io/hostname=k8s-node02 的node上,如果没有就随机分配咯
requiredDuringSchedulingIgnoredDuringExecution
apiVersion: v1
kind: Pod
metadata:
  name: affinity
  labels:
    app: node-affinity-pod
spec:
  containers:
  - name: with-node-affinity
    image: hub.atguigu.com/library/myapp:v1
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/hostname
            operator: NotIn
            values:
            - k8s-node02
         #上面这个匹配规则的含义:只要不分配到kubernetes.io/hostname=k8s-node02的node上即可
         #kubernetes.io/hostname=k8s-node02实际上是一个node的labels,kubernetes.io/hostname是node的默认的label的键

如果nodeSelectorTerms下面有多个选项,只要满足任何一个条件即可;如果matchExpressions下面有多个选项,必须同时满足这些条件才可以正常调度pod。

合并(软硬策略同时存在)
apiVersion: v1
kind: Pod
metadata:
  name: affinity
  labels:
    app: node-affinity-pod
spec:
  containers:
  - name: with-node-affinity
    image: hub.atguigu.com/library/myapp:v1
  affinity:
    nodeAffinity:
    #必须先满足硬策略,再去考虑软策略
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/hostname
            operator: NotIn
            values:
            - k8s-node02
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: source
            operator: In
            values:
            - qikqiak

键值运算关系

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

Pod亲和性

举例:张妮和李阳青梅竹马,李阳特别想和张妮到同一所大学,把李阳、张妮比作pod,把大学比作node,这个过程就是pod亲和性。其中分为两种策略,软策略和硬策略。软策略就是,李阳最好可以与张妮去同一所大学(至于最后有没有在同一所大学,未知);硬策略就是李阳必须和张妮去同一所大学,因为爱情,如果去不了,那就下辈子再说。(说白了,就是两个或多个pod倾向于绑定在一起,部署在同一个node上)

pod.spec.affinity.podAffinity/podAntiAffinity(k8s中通过该字段设置pod亲和性)

  • preferredDuringSchedulingIgnoredDuringExecution:软策略
  • requiredDuringSchedulingIgnoredDuringExecution:硬策略
软硬策略示例
apiVersion: v1
kind: Pod
metadata:
  name: pod-3
  labels:
    app: pod-3
spec:
  containers:
  - name: pod-3
    image: hub.atguigu.com/library/myapp:v1
  affinity:
  #podAffinity 表示想要多个pod运行在同一个node上
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
        matchExpressions:
        - key: app
          operator: In
          values:
          - pod-1
      #以topologyKey为目标,判断两个pod是否在以label的键值为kubernetes.io/hostname所对应的node上
      topologyKey: kubernetes.io/hostname
   #podAntiAffinity 表示不想要多个pod运行在同一个node上
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: app
              operator: In
              values:
              - pod-2
        topologyKey: kubernetes.io/hostname

亲和性/反亲和性调度策略比较如下:

调度策略 匹配标签 操作符 拓扑域支持 调度目标
nodeAffinity 主机 In, NotIn, Exists,
DoesNotExist, Gt, Lt
指定主机
podAffinity POD In, NotIn, Exists, DoesNotExist POD与指定POD同一拓 扑域
podAnitAffinity POD In, NotIn, Exists, DoesNotExist POD与指定POD不在同 一拓扑域

Taint&Toleration(污点和容忍)

节点亲和性,是 pod 的一种属性(偏好或硬性要求),它使 pod 被吸引到一类特定的节点。Taint 则相反,它使 节点 能够 排斥 一类特定的 pod。Taint 和 toleration 相互配合,可以用来避免 pod 被分配到不合适的节点上。每个节点上都可以应用一个或多个 taint ,这表示对于那些不能容忍这些 taint 的 pod,是不会被该节点接受的。如果将 toleration 应用于 pod 上,则表示这些 pod 可以(但不要求)被调度到具有匹配 taint 的节点上。(taint作用于node上,toleration作用于pod上,两者相互配合,如果pod无法容忍某个node上的taint,那么该pod一定不会运行在该node上,如果pod可以容忍某个node上的污点,那么该pod有可能部署运行在该node上。)

Taint污点

Taint的组成

使用 kubectl taint 命令可以给某个 Node 节点设置污点,Node 被设置上污点之后就和 Pod 之间存在了一种相 斥的关系,可以让 Node 拒绝 Pod 的调度执行,甚至将 Node 已经存在的 Pod 驱逐出去。每个污点的组成如下:

key=value:effect

每个污点有一个 key 和 value 作为污点的标签,其中 value 可以为空,effect 描述污点的作用。当前 taint effect 支持如下三个选项:

  • NoSchedule :表示 k8s 将不会把 Pod 调度到具有该污点的 Node 上
  • PreferNoSchedule :表示 k8s 将尽量避免将 Pod 调度到具有该污点的 Node 上
  • NoExecute :表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上,同时会将 Node 上已经存在的 Pod 驱 逐出去

k8s集群中的master节点默认会有一个taint,这个taint的effect类型是NoExecute,这也就是为什么资源只会部署运行在其他node上,而不是在master node上

设置、查看和去除Taint
# 设置污点
kubectl taint nodes node1 key1=value1:NoSchedule

# 节点说明中,查找 Taints 字段
kubectl describe pod pod-name

# 去除污点,在设置污点的命令之后加个减号即可
kubectl taint nodes node1 key1=value1:NoSchedule-

Toleration容忍

设置了污点的 Node 将根据 taint 的 effect:NoSchedule、PreferNoSchedule、NoExecute 和 Pod 之间产生 互斥的关系,Pod 将在一定程度上不会被调度到 Node 上。 但我们可以在 Pod 上设置容忍 ( Toleration ) ,意思 是设置了容忍的 Pod 将可以容忍污点的存在,可以被调度到存在污点的 Node 上

pod.spec.tolerations

tolerations:
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoSchedule"
  tolerationSeconds: 3600
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoExecute"
- key: "key2"
  operator: "Exists"
  effect: "NoSchedule"
  • 其中 key, vaule, effect 要与 Node 上设置的 taint 保持一致
  • operator 的值为 Exists 将会忽略 value 值
  • tolerationSeconds 用于描述当 Pod 需要被驱逐时可以在 Pod 上继续保留运行的时间
当不指定 key 值时,表示容忍所有的污点 key
tolerations:
- operator: "Exists"
当不指定 effect 值时,表示容忍所有的污点作用
tolerations:
- key: "key"
  operator: "Exists"
有多个 Master 存在时,防止资源浪费,可以如下设置
# node-role.kubernetes.io/master 是k8s集群中master节点上的污点的key值
kubectl taint nodes Node-Name node-role.kubernetes.io/master=:PreferNoSchedule

指定调度节点

Pod.spec.nodeName 强制匹配节点

Pod.spec.nodeName 将 Pod 直接调度到指定的 Node 节点上,会跳过 Scheduler 的调度策略,该匹配规 则是强制匹配

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: myweb
spec:
  replicas: 7
  template:
    metadata:
      labels:
        app: myweb
    spec:
      nodeName: k8s-node01
      containers:
      - name: myweb
        image: hub.atguigu.com/library/myapp:v1
        ports:
        - containerPort: 80

Pod.spec.nodeSelector 强制约束节点

Pod.spec.nodeSelector:通过 kubernetes 的 label-selector 机制选择节点,由调度器调度策略匹配 label, 而后调度 Pod 到目标节点,该匹配规则属于强制约束。(相当于根据label选择node,不同的node可能会有同样的标签,这时就需要scheduler来调度)

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: myweb
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: myweb
    spec:
      nodeSelector: 
      #根据label选择node,
        diskname: ssd
      containers:
      - name: myweb
        image: harbor/tomcat:8.5-jre8
        ports:
        - containerPort: 80
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

12. 集群调度 的相关文章

随机推荐

  • CSS中的BFC详解

    BFC的特性和作用 1 避免外边距重叠 2 清楚浮动 3 阻止元素被浮动元素覆盖 第三条提供了布局的一种思路 左边盒子宽度固定 右边盒子宽度占满剩余的宽度 左边设置浮动 右边设置overflow hidden即可实现 或者三栏布局 两边固定
  • Ubuntu中Error: Can‘t find Python executable “python“, you can set the PYTHON env variable.

    Ubuntu中在用npm install 时报错 gyp WARN download NVM NODEJS ORG MIRROR is deprecated and will be removed in node gyp v4 please
  • linux下保存git密码

    在使用shell脚本部署项目时 我们经常从gitee或者github拉取代码 每次都输入密码会比较繁琐 这里介绍一下 如何保存git密码 https方式 1 查看服务器是否保存密码git config list 2 邮箱设置 用户名设置 保
  • 基于Javaweb的超市管理系统毕业设计项目源码+数据库+详细设计文档

    超市管理系统 介绍 大学校内超市管理系统 实现收银台 商品分类管理 商品库存管理 商品管理 营收统计等功能 完整代码下载地址 基于Javaweb的超市管理系统 软件架构 使用说明 项目导入eclipse 配置tomcat jdk sql 导
  • 使用scrapy框架进行爬虫时,报出异常:NotImplementedError: Test1Spider.parse callback is not defined

    这种错误类型今天第一次使用Scrapy框架 就出现了 找了很多博客中的解决方法 还是不能访问 改了一下execute py文件的位置就ok了 如图 书上说这三个位置放置execute py文件都可以 我把文件放在第二个目录下 就不会抛出异常
  • 从辩证的角度看待chatGPT,我们该如何对待?

    从辩证的角度 看待chatGPT 0 什么是ChatGPT 客观阐述 1 通过唯物辩证法的五对基本范畴进行分析 1 0 内容与形式 1 1 现象和本质 1 2 原因与结果 1 3 必然与偶然 1 4 现实与可能 2 使用ChatGPT会给我
  • SPADE(GauGAN)代码运行方法

    SPADE运行方法 写在前面 为什么Pix2PixHD和SPADE都不用RGB作为输入 如何运行SPADE 可能遇到的问题 2022 04 28更 如何控制合成风格 2022 07 30更 contain dontcare label参数
  • 暗影精灵5怎么调风扇转速_遗憾与真香并存的性价比产品——暗影精灵6 AMD

    惠普暗影精灵6 AMD作为一台正面与联想拯救者R7000P对线的游戏本 自有消息以来就被玩家们寄托了很高的希望 纵然随着暗影精灵6 AMD的发布 大家对其期待值有所降低 但在如今游戏本集体无货的情况下它也是一个不错的选择 本文基于目前拿到的
  • 数据结构 算法大全 入门篇

    说到数据结构是什么 我们得先来谈谈什么叫数据 正所谓 巧妇难为无米之炊 再强大的计算机 也是要有 米 下锅才可以干活的 否则就是一堆破铜烂铁 这个 米 就是数据 数据 是描述客观事物的符号 是计算机中可以操作的对象 是能被计算机识别 并输入
  • vscode配置remote ssh

    1 安装插件 vscode配置remote ssh Hello wshuo的博客 CSDN博客 remote ssh vscode 设置界面 右键最左边tab栏 主体 vscode 插件 Remote SSH Linux主体 vscode
  • 【Complex-YOLO: 点云实时目标检测】

    Complex YOLO 点云实时目标检测 前言 要点分析 具体算法分析 点云转化鸟瞰图 提取特征 B Box损失回归 前言 Complex YOLO 论文中介绍是一种仅在点云上进行的最先进的实时3D目标检测网络 借鉴了yolo v2的主干
  • Java语言实现word转PDF(10分钟解决)

    前言 经常做OA办公项目的同学一定和我一样被各种线上的office操作整疯了 基本上涉及到Java操作office的时候就会想到POI和openoffice 这两种方案都是需要找各种jar包 然后用里面繁杂的api 关键是做出来的文件格式有
  • ORA-28002 & PASSWORD_LIFE_TIME & PASSWORD_GRACE_TIME

    Normal 0 7 8 磅 0 2 false false false EN US ZH CN X NONE PASSWORD LIFE TIME 设置的是数据库开始报告ORA 28002密码要过期的时间 PASSWORD GRACE T
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • 【转载】odoo技术开发白皮书 第一部分 第九章 权限

    转载 http book odoomommy com chapter1 README8 html 第九章 权限 Odoo的权限管理 从粗到细可以大概分为四个等级 对象级 视图级 字段级 记录级 什么意思呢 总结起来大概如下面的描述 对象级
  • 大家的毕业设计怎么做的?跟我一样吗?无极低码说你:只管建库建表,剩下的交给我

    首先呢 介绍一下无敌低代码平台 无极低代码平台是作者自己搭建的一个框架 刚开始由3行代码写服务升级而来 3行代码写服务当然也是作者自己写的 目的就是为了减少基础的开发工作 让不会后端开发的人员能够通过简单的步骤实现服务接口的编写 后面觉得3
  • 对比 Exception 和 Error,运行时异常与一般异常有什么区别?

    相同点 Exception 和 Error 都是继承了 Throwable 类 在 Java 中只有 Throwable 类型的实例才可以被抛出 throw 或者捕获 catch 它是异常处理机制的基本组成类型 Exception 和 Er
  • vue5种方式实现页面“刷新“

    vue中五种方式实现页面 刷新 1 使用window location reload 强制刷新 都会使页面有短暂的空白 体验效果不是特别好 home vue
  • 提高生活、学习、工作效率的方法——时间管理Vs个人管理

    首先 我想对于大家来说 时间管理这个词应该并不陌生 不过 在开会之前 又有几个知道呢 反正我当时并不知道 这就需要反思了 不过这里 先不做反思 先说说时间管理 初次接触到这个词 我想的是 为什么要管理 怎样进行时间管理 该怎么管理 随后 米
  • 12. 集群调度

    文章目录 简介 调度过程 自定义调度器 调度亲和性 Node亲和性 preferredDuringSchedulingIgnoredDuringExecution requiredDuringSchedulingIgnoredDuringE