k8s 进阶实战笔记 | Scheduler 调度策略总结

文章目录

  • Scheduler 调度策略总结
    • 调度原理和过程
    • 调度策略
      • nodeSelect
      • 亲和性和反亲和性
      • NodeAffinify亲和验证
      • PodAffinity 亲和验证
      • PodAntiAffinity 反亲和验证
      • 污点与容忍
      • 跳过 Scheduler 调度策略
    • 调度策略场景总结

Scheduler 调度策略总结

调度原理和过程

Scheduler

一直监听着 api-server,如果获取到Pod.Spec.NodeName为空,会对每一个pod创建一个binding,表示放在哪一个节点上运行

把 pod 按照预设的调度策略分配到集群的节点上

  • 公平
  • 资源高效利用
  • 效率
  • 灵活

调度过程

  1. 预选(predicate

过滤步满足条件的节点

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

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

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

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

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

  1. 优选(priority

对节点按照优先级排序

  1. 选择出最优的节点
  2. 如果预选的时候没有合适的节点,pod 会一直处于 pending状态,并且会不断重试调度,直到有调度结果

调度策略

nodeSelect

  • 最简单的调度形式:节点选择约束,将 pod 调度在拥有你指定的标签的节点上

示例

一个简单的nginx编排文件如下

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: default
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: docker.m.daocloud.io/nginx
        imagePullPolicy: IfNotPresent

不进行特殊调度设置

kubectl apply -f nginx-demo.yaml

在这里插入图片描述

给节点设置一个独一无二的标签信息

# 查看节点标签信息
kubectl get node --show-labels
# 给节点新增标签信息(kubectl label nodes <NodeName> key=value)
kubectl label nodes k8s-node01 nginx=true
# 取消节点的标签信息
kubectl label nodes k8s-node01 nginx-

在这里插入图片描述

**加上调度策略nodeSelect **

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: default
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      nodeSelector:
        app: nginx
      containers:
      - name: nginx
        image: docker.m.daocloud.io/nginx
        imagePullPolicy: IfNotPresent

查看效果

在这里插入图片描述

亲和性和反亲和性

  • 相比之下,亲和性和反亲和性的表达能力更强
  • nodeSelector 只能选择所有固定标签的节点

requiredDuringSchedulingIgnoredDuringExecution

调度器只有在规则被满足的时候才能执行调度

preferredDuringSchedulingIgnoredDuringExecution

调度器会尝试寻找满足对应规则的节点,如果找不到,调度会在其他节点调度这个 pod

节点亲和性

NodeAffinity

  • “软需求”:调度器在无法找到匹配节点时候仍然会调度 pod
  • “硬需求”:如果没有节点满足需求,则不会被调度,一直处于 pending 状态

Pod亲和性

PodAffinity

  • pod可以和哪些pod部署在同一个拓扑中

Pod互斥性

PodAntiAffinity

  • pod不和哪些pod部署在同一个拓扑中

调度策略

调度策略匹配标签操作符拓扑支持调度目标
nodeAffinitynode节点In, NotIn,Exists,DoesNotExist, Gt,Lt指定主机
podAffinitypodIn, NotIn,Exists,DoesNotExistpod与指定pod一个拓扑域
PodAntiAffinitypodIn, NotIn,Exists,DoesNotExistpod与指定pod不在一个拓扑域

操作符

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

NodeAffinify亲和验证

标准yaml文件

###第一个
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx1
  namespace: default
  labels:
    app: nginx1
spec:
  selector:
    matchLabels:
      app: nginx1
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      containers:
      - name: nginx1
        image: docker.m.daocloud.io/nginx
        imagePullPolicy: IfNotPresent

###第二个
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx2
  namespace: default
  labels:
    app: nginx2
spec:
  selector:
    matchLabels:
      app: nginx2
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx2
    spec:
      containers:
      - name: nginx2
        image: docker.m.daocloud.io/nginx
        imagePullPolicy: IfNotPresent

NodeAffinify验证

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx1
  namespace: default
  labels:
    app: nginx1
spec:
  selector:
    matchLabels:
      app: nginx1
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: kubernetes.io/hostname
                    operator: In
                    values:
                      - k8s-node03
      containers:
      - name: nginx1
        image: docker.m.daocloud.io/nginx
        imagePullPolicy: IfNotPresent

在这里插入图片描述

调度结果

在这里插入图片描述

硬策略不符合要求的时候的调度结果

在这里插入图片描述

如果是软策略

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx1
  namespace: default
  labels:
    app: nginx1
spec:
  selector:
    matchLabels:
      app: nginx1
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 1
              preference:
                matchExpressions:
                  - key: kubernetes.io/hostname
                    operator: In
                    values:
                      - k8s-node04
      containers:
      - name: nginx1
        image: docker.m.daocloud.io/nginx
        imagePullPolicy: IfNotPresent

在这里插入图片描述

PodAffinity 亲和验证

nginx2的运行情况
在这里插入图片描述

看下nginx1的硬策略

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx1
  namespace: default
  labels:
    app: nginx1
spec:
  selector:
    matchLabels:
      app: nginx1
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: app
                    operator: In
                    values:
                      - nginx2
              topologyKey: kubernetes.io/hostname
      containers:
      - name: nginx1
        image: docker.m.daocloud.io/nginx
        imagePullPolicy: IfNotPresent

调度结果

在这里插入图片描述

PodAntiAffinity 反亲和验证

nginx2的运行情况

在这里插入图片描述

nginx1

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx1
  namespace: default
  labels:
    app: nginx1
spec:
  selector:
    matchLabels:
      app: nginx1
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: app
                    operator: In
                    values:
                      - nginx2
              topologyKey: kubernetes.io/hostname
      containers:
      - name: nginx1
        image: docker.m.daocloud.io/nginx
        imagePullPolicy: IfNotPresent

调度结果

在这里插入图片描述

污点与容忍

  • 污点:taints

  • 容忍:tolerations

  • 如果一个节点标记的有污点,如果对pod不进行标识为可以容忍,否则该节点不可调度pod

  • 污点组成:key=value:effect

effect:污点的作用
- NoSchedule :表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上
- PreferNoSchedule :表示 k8s 将 尽量避免 将 Pod 调度到具有该污点的 Node 上
- NoExecute :表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上,同时会将 Node 上已经存在的 Pod 驱逐出去
  • 基本操作
### 查看节点污点
kubectl describe nodes | grep -P "Name:|Taints"
### 设置污点
kubectl taint nodes <NodeName> key=value:effect
### 删除污点
kubectl taint nodes <NodeName> key=value:effect-
  • 验证
### 设置一个污点,看是否符合预期,多开一个窗口观察
kubectl taint nodes k8s-node03  app=nginx:NoExecute

在这里插入图片描述

在这里插入图片描述

设置容忍度再看下调度结果

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx1
  namespace: default
  labels:
    app: nginx1
spec:
  selector:
    matchLabels:
      app: nginx1
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      tolerations:
        - key: "app"
          operator: "Exists"
          effect: "NoExecute"
      containers:
      - name: nginx1
        image: docker.m.daocloud.io/nginx
        imagePullPolicy: IfNotPresent

在这里插入图片描述

tolerations 属性的写法

  • key、value、effect 与 Node 的 Taint 设置需保持一致
  • operator=Exists,value可以省略
  • operator=Equal,key与value之间就是等于的关系,不能省略
  • 不指定operator,则默认就是Equal

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

跳过 Scheduler 调度策略

  • 将 pod 直接调度到指定的Node节点上
###第一个
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx1
  namespace: default
  labels:
    app: nginx1
spec:
  selector:
    matchLabels:
      app: nginx1
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      nodeName: k8s-node01
      containers:
      - name: nginx1
        image: docker.m.daocloud.io/nginx
        imagePullPolicy: IfNotPresent

在这里插入图片描述

调度策略场景总结

调度策略场景说明
nodeName调度固定节点,用于验证特定节点数据、故障复现等
nodeSelect调度到拥有特定标签的节点,特殊部门、特殊业务线、测试等
podAffinity使pod处于同一个拓扑域,用于上下游应用存在大量数据交互的场景
podAntiAffinity使pod不处于同一个拓扑域,多个计算型应用是不适合调度同一台节点
nodeAffinity指定调度到指定的节点,核心应用必须调度到核心节点
nodeAntiAffinity指定不调度到指定的节点,核心节点不能被普通应用使用
taints污点节点不允许被调度pod,比如master节点,GPU高计算性能节点等
tolerations配置了才可以调度到taints节点

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux使用二进制包安装MySQL

目录 一、软件包下载 二、上传软件包到Linux根目录 1、使用xftp将软件包上传到根目录 2、解压缩 三、准备工作 四、初始化软件 五、设置MySQL的配置文件 六、配置启动脚本 一、软件包下载 官网下载&#xff1a;MySQL :: Download MySQL Community Server 二、上传软件…

【leetcode题解C++】144. 94. 145.二叉树前序、中序、后序遍历 and 102.二叉树的层序遍历

144. 二叉树前序遍历 给出一个根节点&#xff0c;返回前中后序遍历的结果的。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#xff1a;root…

vue项目如何打包,java项目如何打包

目录 vue项目如何打包 java项目如何打jar包 使用Maven打包为JAR&#xff08;方式一&#xff09;视图&#xff1a; 先双击clean再双击package即可打包 使用Maven打包为JAR&#xff08;方式二&#xff09;命令&#xff1a; 1、确保你已经安装了Maven&#xff0c;并且配置了相应…

关机恶搞小程序

1. system("shutdown")的介绍 当system函数的参数是"shutdown"时&#xff0c;它将会执行系统的关机命令。 具体来说&#xff0c;system("shutdown")的功能是向操作系统发送一个关机信号&#xff0c;请求关闭计算机。这将触发操作系统执行一系列…

uniapp实现页面左滑右滑切换内容

uniapp uview&#xff1a;使用uniapp的swiper和uview的tabs标签组合实现 Tabs 标签 | uview-plus 3.0 - 全面兼容nvue的uni-app生态框架 - uni-app UI框架 vue <template> <view class"main"> <view class""> …

ElasticSearch7.7.1集群搭建

前言 Elasticsearch&#xff08;ES&#xff09;是一个基于Apache Lucene的分布式、高扩展、近实时的搜索引擎&#xff0c;主要用于海量数据快速存储、实时检索、高效分析的场景。通过简单易用的RESTful API&#xff0c;Elasticsearch隐藏了Lucene的复杂性&#xff0c;使得全文搜…

elasticsearch8.x版本docker部署说明

前提&#xff0c;当前部署没有涉及证书和https访问 1、环境说明,我采用三个节点&#xff0c;每个节点启动两个es&#xff0c;用端口区分 主机角色ip和端口服务器Amaster192.168.2.223:9200服务器Adata192.168.2.223:9201服务器Bdata,master192.168.2.224:9200服务器Bdata192.1…

打开 IOS开发者模式

前言 需要 1、辅助设备&#xff1a;苹果电脑&#xff1b; 2、辅助应用&#xff1a;Xcode&#xff1b; 3、准备工作&#xff1a;苹果手机 使用数据线连接 苹果电脑&#xff1b; 当前系统版本 IOS 17.3 通过Xcode激活 两指同时点击 Xcode 显示选择&#xff0c;Open Develop…

眼底增强型疾病感知蒸馏模型 FDDM:无需配对,fundus 指导 OCT 分类

眼底增强型疾病感知蒸馏模型 FDDM&#xff1a;fundus 指导 OCT 分类 核心思想设计思路训练和推理 效果总结子问题: 疾病特定特征的提取与蒸馏子问题: 类间关系的理解与建模 核心思想 论文&#xff1a;https://arxiv.org/pdf/2308.00291.pdf 代码&#xff1a;https://github.c…

k8s学习-DaemonSet和Job

1.1DaemonSet是什么 Deployment部署的副本Pod会分布在各个Node上&#xff0c;每个Node都可能运行好几个副本。DaemonSet的不同之处在于&#xff1a;每个Node上最多只能运行⼀个副本。DaemonSet的典型应用场景有&#xff1a; &#xff08;1&#xff09;在集群的每个节点上运⾏存…

工业空调转IEC104协议转换网关BE108

随着电力系统信息化建设和数字化转型的进程不断加速&#xff0c;对电力能源的智能化需求也日趋增强。健全稳定的智慧电力系统能够为工业生产、基础设施建设以及国防建设提供稳定的能源支持。在此背景下&#xff0c;高性能的工业电力数据传输解决方案——协议转换网关应运而生&a…

CodeGPT--(Visual )

GitCode - 开发者的代码家园 gitcode.com/ inscode.csdn.net/liujiaping/java_1706242128563/edit?openFileMain.java&editTypelite marketplace.visualstudio.com/items?itemNameCSDN.csdn-codegpt&spm1018.2226.3001.9836&extra%5Butm_source%5Dvip_chatgpt_c…

面向Java开发者的ChatGPT提示词工程(11)扩写

什么是扩写&#xff1f; 扩写是指将较短的文本交给GPT生成更长的文本。比如&#xff1a;根据一组基本指令&#xff0c;写出一封完整的电子邮件&#xff1b;或者根据一系列主题&#xff0c;创作出一篇包含这些主题的文章。 这样的技术&#xff0c;有着广阔的应用场景&#xff…

FPGA 通过 UDP 以太网传输 JPEG 压缩图片

FPGA 通过 UDP 以太网传输 JPEG 压缩图片 简介 在 FPGA 上实现了 JPEG 压缩和 UDP 以太网传输。从摄像机的输入中获取单个灰度帧&#xff0c;使用 JPEG 标准对其进行压缩&#xff0c;然后通过UDP以太网将其传输到另一个设备&#xff08;例如计算机&#xff09;&#xff0c;所有…

excel统计分析——卡方检验(基本原理)

参考资料&#xff1a;生物统计学 卡方检验&#xff08;chi-square test&#xff09;又称检验&#xff0c;是英国数理统计学家Karl Pearson推导出来的&#xff0c;该方法是处理分类变量或离散型数据的一类重要方法。分类变量或离散型数据时生物学和医学领域常见的数据类型。 1、…

后端学习:数据库MySQL学习

数据库简介 数据库&#xff1a;英文为 DataBase&#xff0c;简称DB&#xff0c;它是存储和管理数据的仓库。   接下来&#xff0c;我们来学习Mysql的数据模型&#xff0c;数据库是如何来存储和管理数据的。在介绍 Mysql的数据模型之前&#xff0c;需要先了解一个概念&#xf…

“Morpheus-1”的全新人工智能模型声称能引发清醒梦境

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

vue3 codemirror关于 sql 和 json格式化的使用以及深入了解codemirror 使用json格式化提示错误的关键代码

文章目录 需求说明0、安装1. 导入js脚本2.配置3.html处使用4.js处理数据&#xff08;1&#xff09;json格式化处理&#xff08;2&#xff09;sql格式化处理 5. 解决问题1:json格式化错误提示报错&#xff08;1&#xff09;打开官网&#xff08;2&#xff09;打开官网&#xff0…

Python第 1 课 Python 介绍与安装

文章目录 第 1 课 Python 介绍与安装1.Python介绍1.1 面向对象概述1.2 Python 概述1.3 Python 特点 2.查看Python3.pyCharm 安装方法3.1 下载 pyCharm3.2 打开 pyCharm3.3 汉化 pyCharm3.4 pyCharm 的基本介绍和基本使用方法 第 1 课 Python 介绍与安装 1.Python介绍 1.1 面向…

qt 坦克大战游戏 GUI绘制

关于本章节中使用的图形绘制类&#xff0c;如QGraphicsView、QGraphicsScene等的详细使用说明请参见我的另一篇文章&#xff1a; 《图形绘制QGraphicsView、QGraphicsScene、QGraphicsItem、Qt GUI-CSDN博客》 本文将模仿坦克大战游戏&#xff0c;目前只绘制出一辆坦克&#…