k8s集群的调度

news2024/11/13 8:03:16

目录

自动调度的原则

调度约束机制:list-watch

apiserver和组件之间的watch机制

调度过程的默认算法

1.预算策略

预算的算法

2.优选策略

优选的算法

*用户定制节点部署

1.强制性节点部署

2.节点标签部署(匹配机制)

标签的增删改查

**亲和性

硬策略和软策略

匹配标签的运算符

节点亲和性 node Affinity

硬策略

软策略

多个软策略

pod亲和性 pod Affinity

硬策略

pod反亲和性 pod Anti-Affinity

硬策略

软策略

练习题


kube-scheduler是集群的调度器,主要任务就是把pod部署到节点上。

自动调度的原则

1.公平性:保证每个可用的节点都可以部署pod

2.资源的高效利用:就是集群当中的资源可以被最大化的使用

3.调度的性能要好:能够对大批量的pod完成调度工作

4.灵活性:用户可以根据自己的需求进行控制

调度约束机制:list-watch

list-watch机制进行每个组件的协作,保持数据同步、实现组件之间的解耦。

apiserver和组件之间的watch机制

kubelet、controller-manager、scheduler这些都是主动监听apiserver的信息,是根据监听到的信息来做出指定的动作,然后再传给apiserver,然后每一步的动作都会通过apiserver传到etcd里。

调度过程的默认算法

1.预算策略

预算策略就是先对节点的条件进行过滤

预算的算法

1. pod的资源适应性:节点上是否有资源能够满足pod请求的资源

2. pod的主机适应性:如果指定了节点,那么要检查集群当中是否有满足要求的节点可供部署

3. pod的主机端口适应性:它会检查节点上使用的端口是否与pod请求的端口冲突

4. pod与主机磁盘的适应性:就是每个pod之间的挂载不能冲突

如果预算条件不满足,pod会进入pending状态

2.优选策略

优选策略就是根据过滤出来的节点选择一个最优的节点

优选的算法

1. 最低请求优先级:它通过计算节点上的cpu和内存的使用率,来确定节点的权重。使用率越低权重就越大,那么就越会被选中作为部署节点。它倾向于选择资源利用率占用较少的节点。

2. 平衡资源分配:它也是根据节点上的cpu和内存的使用率,来确定节点的权重。它的权重是按照cpu和内存之间的使用率的比率,两个使用率越接近越好。(1:1)

3. 镜像本地性优先级:如果节点在本地已经有了需要的镜像,分配的概率更大。

*用户定制节点部署

1.强制性节点部署

nodeName:强制性的选择一个节点,不再需要调度器和算法,直接部署即可。

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx1
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx1
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      containers:
      - name: nginx
        image: nginx:1.22
      nodeName: node01

2.节点标签部署(匹配机制)

就是只要标签匹配都可以部署。

kubectl get nodes --show-labels   查看节点标签

注:标签的格式是键值对形式,一个节点可以有多个标签,每个标签以 ,隔开

标签的增删改查

查看标签 kubectl get nodes --show-labels

创建标签 kubectl label nodes node01 test1=a

修改标签 kubectl label nodes node01 test1=b --overwrite

删除标签 kubectl label nodes node01 test1-

根据节点标签匹配部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx1
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx1
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      containers:
      - name: nginx
        image: nginx:1.22
      nodeSelector:
        test2: b

问题:标签选举节点是否需要调度器和算法?

是需要调度器和算法来进行分配的

**亲和性

所有的亲和性都是根据节点标签和pod的标签来进行选择

硬策略和软策略

软策略语法: preferredDuringSchedulingIgnoredDuringExecution

软策略:在选择节点的时候,尽量满足部署的条件,非条件也可以部署

软策略的应用场景:尽量把资源调度到需要的节点

硬策略语法: requiredDuringSchedulingIgnoredDuringExecution

硬策略:必须满足指定的节点条件,否则pending

硬策略应用场景:一般用于特殊场景,比如节点故障,但是有业务要更新,强制性的把资源调度到指定的节点

匹配标签的运算符

键值的运算关系:

1.  In  表示在、匹配、=  (这里是大写的 i )

2.  NotIn 表示不在、不等于 、逻辑非

3.  Gt  表示大于

4.  Lt  表示小于

5.  Exists 表示存在

6. DoesNotExist  表示不存在

举例:

节点亲和性 node Affinity

是根据软策略和硬策略来分配的

硬策略

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx1
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx1
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      containers:
      - name: nginx
        image: nginx:1.22
      affinity:
#选择亲和性的字段
        nodeAffinity:
#节点亲和性
          requiredDuringSchedulingIgnoredDuringExecution:
#硬策略
            nodeSelectorTerms:
              - matchExpressions:
                - key: test3
                  operator: In
                  values:
                  - a
#节点亲和性的硬策略,表示必须选择带有标签的值是test3=a

然后kubectl get pod -o wide 就能查看部署到哪个节点了

注:1. 条件不满足,肯定pending

       2. 条件满足时,调度器即刻生效,不需要手动调整

       3.  需要调度器分配,不同节点可以有相同的标签

软策略

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx1
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx1
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      containers:
      - name: nginx
        image: nginx:1.22
      affinity:
#选择亲和性的字段
        nodeAffinity:
#节点亲和性
          preferredDuringSchedulingIgnoredDuringExecution:
#软策略
          - weight: 1
            preference:
              matchExpressions:
              - key: test3
                operator: NotIn
                values:
                - a
#节点亲和性的软策略,表示希望部署到不包含test3=a的标签节点

注:这里是尽量满足条件,不是必须,所以有可能部署到其他节点上。

多个软策略

      affinity:
#选择亲和性的字段
        nodeAffinity:
#节点亲和性
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              - key: test3
                operator: NotIn
                values:
                - a
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 2
            preference:
              matchExpressions:
              - key: test3
                operator: In
                values:
                - a
#多个软策略以权重来进行分配,权重高的,优先级大

注:如果已经有硬策略,一般不需要声明软策略。

pod亲和性 pod Affinity

是根据软策略和硬策略来分配的

topologyKey :定义节点的拓扑域,也就是用来反映pod和节点之间的关系

前提条件:首先要先在节点上创建app=nginx1的pod,得有这个pod才能匹配。

硬策略

            affinity:
#选择亲和性的字段
          podAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
            #根据标签进行选择
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - nginx1
              topologyKey: test1
#匹配pod的标签是app=nginx1,且节点上有标签名是test1

注:实际上指向节点的还是topologyKey拓扑域,pod的标签只是倾向性

pod反亲和性 pod Anti-Affinity

注:如果节点上本身没有pod也可以直接创建反亲和性

硬策略

      affinity:
#选择亲和性的字段
        podAntiAffinity:
#pod的反亲和性
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
            #根据标签进行选择
              matchExpressions:
              - key: app
                operator: In
                values:
                - nginx1
            topologyKey: test1
#只能部署在pod的标签不是app=nginx1且节点的标签名不能有test1的节点上

注:节点上不能有pod的标签是app=nginx1 且 节点的标签不能有test1

如果以上两个条件有一个满足时还能运行的原因?

答:1.能够部署的原因在于调度器,调度器的核心是为了部署pod,只要能够部署,调度器有可能会忽略规则进行部署,即使有规则,调度器依然会部署。

       2. 资源不足的情况下,为了pod能够部署,调度器极有可能忽略所有的限制。

软策略

     affinity:
#选择亲和性的字段
        podAntiAffinity:
#pod的反亲和性
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            podAffinityTerm:
              labelSelector:
            #根据标签进行选择
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - nginx1
              topologyKey: test1

总结:其实在pod的亲和性当中,起决定性作用的是拓扑域的标签。

练习题

1、实现pod的探针:就绪探针  用 tocScoket
2、做挂载卷,容器目录:/usr/share/nginx/html/  、节点目录: /opt/html

3.node的亲和性:尽量部署在node01

4、pod的亲和性:尽量部署包含有app=nginx的pod且标签名是xy102的节点。

5、软策略选择标签名不包含xy102, xy102值小于100

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2102415.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

selenium无法定位元素的几种解决方案

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 1、frame/iframe表单嵌套 WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌的页面元素无法直接定位。 解决方法: d…

Hadoop 下载

下载法一:官方下载 hadoop官网 1.选择要下载的版本,这里我以3.4.0为例进行说明; 2.跳转后,选择对应系统架构的,进行下载; 下载法二:国内镜像源下载 1.阿里云 这里我以mac m1为案例&#x…

【已解决】Halcon错误代码4104

问题描述 在运行的时候发现报错4104,如下图所示 解决 从字面上理解就是超出了计算机的内存空间了,那么着手解决的话就需要把没次训练的张数减少一些即可。去相对应的修改batch_size即可。 结果 如下图所示,正常在使用GPU训练。 搞定&…

Xilinx FFT IP使用

简介 本章节主要介绍FFT原理,以及Xilinx的FFT IP使用说明做详细介绍。 FFT介绍 FFT主要是将时域信号转换成频域信号,转换后的信号更方便分析。首先,FFT是离散傅立叶变换 (DFT) 的快速算法,那么说到FFT,我们自然要先讲清楚傅立叶变换。先来看看傅立叶变换是从哪里来的? 傅…

虚拟机无法打开网卡 service network restart失败

问题描述 命令重启网卡服务,结果报错如下:Job for network.service failed because the control process exited with error code. See "systemctl status network.service" and "journalctl -xe" for details 根据提示&#xff…

Hi3061M开发板初测——点亮小灯

目录 前言环境配置点亮led源码IDA集成了串口监视器最后下载到开发板中运行 前言 海思MCU体验官活动,Hi3061M开发板到手后,配置环境初步测试点亮小灯。 环境配置 环境配置按照gitee提供的redeme一步一步来配置起来很顺利。具体可自行查阅:环境…

文件包含漏洞PHP伪协议利用方法

使用php伪协议的前提 php.ini中的allow_url_fopen 、allow_url_include这两个参数需要修改为on 1.file协议 使用file协议读取Windows的系统文件 http://127.0.0.1/123.php?cmdfile:///c:/windows/system32/drivers/etc/hosts 2.php://filter协议 使用php://filter协议可以…

JsonCpp库的使用

目录 一、Json数据格式 二、JsonCpp介绍 2.1 Json::Value 2.2 序列化接口 2.3 反序列化接口 三、JsonCpp的使用 3.1 头文件包含 3.2 序列化 3.3 反序列化 四、补充 Json 是⼀种数据交换格式,它采⽤完全独⽴于编程语⾔的⽂本格式来存储和表示数据。 一、J…

P01-Java何谓数组

P01-Java何谓数组 一、数组声明创建 1.1 数组声明的语法 与c有所不同 在Java中,数组声明语法 首选语法: //数据类型[] 数组名称; int[] arr;次选,与c类似 //数据类型 数组名称[]; int arr[];1.2 数组创建语法 与c指针有所相似&#xff0…

嵌入式开发与应用按键外部中断实验二

一、实验目的 1. 通过实验掌握中断式键盘控制与设计方法; 2. 熟悉编写中断服务程序; 3. 掌握中断系统相关知识,掌握外部中断应用方法和处理过程; 4. 掌握实验处理器中断处理的软件编程方法; 5. 从按键程序的设计对系统的编程…

Prometheus_0基础_学习笔记

一、基本概念 Prometheus是由golang语言开发的一套开源的监控、报警、时间序列数据库的组合,是一款基于时序数据库的开源监控告警系统。 时间序列数据库:时间序列数据库(Time Serires Database , TSDB)不同于传统的关系型数据库。…

是缔造AI程序员,还是AI缔造程序员?

随着AIGC(如ChatGPT、MidJourney、Claude等)大语言模型的涌现,AI辅助编程工具的普及使得程序员的工作方式正在发生深刻变革。AI的迅猛发展,不仅提升了编程效率,也引发了对程序员未来职业前景的深思。我们应当如何在这一…

【归并分而治之】逆序对的应对之策

目录 1.前言2.题目简介3.求解思路为什么要这样做?快在哪?为什么这种方法会想到结合归并排序?如何在一左一右中统计剩下的逆序对个数?固定右边的数,用降序会怎么样???思路的本质是巧妙…

【MySQL07】【锁】

文章目录 一、前言二、事务的读写情况1. 写-写情况2. 读-写情况3. 一致性读4. 锁定读2.1 共享锁和独占锁2.2 锁定读的语句 5. 写操作 三、多粒度锁四、表锁和行锁1. 表级锁1.1 表级别的 S锁 和 X锁1.2 表级别的 IS 锁和 IX锁1.3 表级别的 AUTO-INC 锁 2. 行级锁2.1 行级锁的分类…

Qt6+VTK9环境配置

Qt6VTK9环境配置 说明1 Qt6安装2 VTK源码编译2.1 源码下载2.2 工程编译2.3 设置环境变量 3 QtVTK项目构建3.1 使用qmake管理项目3.2 使用cmake管理项目 参考资料 说明 由于想做一点新的东西,需要去探索一些工具,对于VTK之前没有了解过,在进行…

redis缓存和数据库通过延迟双删除实现数据一致性

为了提高查询的效率,我们经常会用到redis缓存,但是使用redis缓存就不可避免缓存一致性的问题。 先删缓存,再更新数据 如果并发查询可能会再删除缓存后,还没有更新数据库的时候,第二个线程读取到旧数据,并…

尚品汇-商品上下架完善(更新ES)、延迟消息(四十四)

目录: (1)改造商品搜索上下架 (2)延迟消息 (1)改造商品搜索上下架 定义商品上下架常量 在rabbit-util模块中导入常量类MqConst。 /*** 商品上下架.*/ public static final String EXCHANGE…

游戏翻译中西班牙语的特点

由于西班牙语丰富的文化多样性和广泛的使用,将游戏翻译成西班牙语带来了独特的机遇和挑战。西班牙语是全球第二大使用语言,包括西班牙、拉丁美洲和美国部分地区在内的各个地区有超过4.6亿母语人士。然而,这些地区的语言和文化差异需要量身定制…

Datawhale X 李宏毅苹果书 AI夏令营-深度学习进阶task1:局部极小值与鞍点,批量和动量

一、临界点和鞍点 在做优化的时候经常会发现,随着参数不断更新,训练的损失不会再下降, 但是我们对这个损失仍然不满意或者有时模型一开始就训练不起来,不管我们怎么更新参数,损失都降不下去。 过去常见的一个猜想是我们优化到某…

GPU环境配置:1.CUDA、Anaconda、Pytorch

一、查看显卡适配CUDA型号 查看自己电脑的显卡版本: 在 Windows 设置中查看显卡型号:使用 Windows I 快捷键打开「设置」,依次点击「系统」-「屏幕」和「高级显示器设置」,在「显示器 1」旁边就可以看到显卡名称。 右键点菜单图标…