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

news2025/1/16 14:46:55

文章目录

  • 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节点

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

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

相关文章

拼多多砍价群2024年最新群聊分享

分享最新拼多多现金助力互助微信群138个&#xff0c;井然有序打发时间&#xff0c;拼多多互点不求人&#xff0c;#拼多多互助群#一起来相互助力&#xff01; ​拼多多互助砍价群免费助力互助群&#xff0c;拼多多助力群免费微信&#xff0c;识别下方二维码进群。拼多多助力群免…

仅需这条指令解决 sudo 报错或将用户添加到 sudoers

解决 sudo 报错或将用户添加到 sudoers 仅需这条指令 既然找到了这里&#xff0c;我只想通过查找了整整一天得到的经验和教训告诉你答案&#xff0c;不需要 nano、vim 这类的编译器&#xff0c;也不需要 chmod 更改 /etc/sudoers 文件只读权限&#xff0c;只需要控制台终端在 …

文心一言 VS ChatGPT :谁是更好的选择?

前言 目前各种大模型、人工智能相关内容覆盖了朋友圈已经各种媒体平台&#xff0c;对于Ai目前来看只能说各有千秋。GPT的算法迭代是最先进的&#xff0c;但是它毕竟属于国外产品&#xff0c;有着网络限制、注册限制、会员费高昂等弊端&#xff0c;难以让国内用户享受。文心一言…

【Redis】关于它为什么快?使用场景?以及使用方式?为何引入多线程?

目录 1.既然redis那么快&#xff0c;为什么不用它做主数据库&#xff0c;只用它做缓存&#xff1f; 2.Redis 一般在什么场合下使用&#xff1f; 3.redis为什么这么快&#xff1f; 4.Redis为什么要引入了多线程&#xff1f; 1.既然redis那么快&#xff0c;为什么不用它做主数据…

【论文解读】Object Goal Navigation usingGoal-Oriented Semantic Exploration

论文&#xff1a;https://devendrachaplot.github.io/papers/semantic-exploration.pdf 代码&#xff1a;https://github.com/devendrachaplot/Object-Goal-Navigation 项目&#xff1a; Object Goal Navigation using Goal-Oriented Semantic Exploration example&#xff1…

找不同-《企业应用架构模式》2024典藏版

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 以下是2004年《企业应用架构模式》中译本和2024年《企业应用架构模式》典藏版译本的页面。 您能从中找出至少10处不同吗&#xff1f; 如何选择UMLChina服务 UMLChina公众号精选&…

Python代码耗时统计

time模块 在代码执行前后各记录一个时间点&#xff0c;两个时间戳相减即程序运行耗时。这种方式虽然简单&#xff0c;但使用起来比较麻烦。 time.time() 函数返回的时间是相对于1970年1月1日的秒数 import timestart time.time() time.sleep(1) end time.time() print(f&…

任正非最新讲话:没有退路就是胜利之路!

内容来源&#xff1a;本文来自心声社区 组织管理 9月4日&#xff0c;华为心声社区发布了华为创始人任正非在华为高端技术人才使用工作组对标会上的讲话。 任正非表示&#xff0c;先有专才&#xff0c;才有全才&#xff0c;要实现跨界交流、融合创新&#xff0c;让领袖自然成长…

实验3:数据显示输出

1、实验目的&#xff1a; 掌握将内存单元存储的数据显示输出到显示器的方法。 2、实验内容&#xff1a; 将内存单元存储的字节数据&#xff08;例如 56H&#xff09;的16进制数的低位输出到显示器并显示。 3、实验要求&#xff1a; &#xff08;1&#xff09;运行程序后&a…

mac安装mysql的8.0设置面板启动不了

1、前言 记得之前安装mysql5.7的时候&#xff0c;是可以直接从设置里面的mysql面板启动的&#xff0c;但是到了mysql8.0之后就启动不了了&#xff0c;这个问题不知道是版本问题还是我换了m系列芯片的mysql导致的&#xff0c;之前很多次都启动不了&#xff0c;这次搞了下&#x…

计算机提示缺失dll文件怎么办?那种dll解决方法更值得推荐

当在运行游戏&#xff0c;软件程序的过程中遇到“找不到dll”的情况时&#xff0c;这实际上意味着系统或应用程序无法定位并加载必要的动态链接库文件&#xff08;DLL&#xff09;&#xff0c;从而无法顺利完成预期的功能调用和执行流程。这种问题的发生可能会引发一系列严重后…

使用自有数据集微调ChatGLM2-6B

1 ChatGLM2-6B介绍 ChatGLM是清华技术成果转化的公司智谱AI研发的支持中英双语的对话机器人。ChatGLM基于GLM130B千亿基础模型训练&#xff0c;它具备多领域知识、代码能力、常识推理及运用能力&#xff1b;支持与用户通过自然语言对话进行交互&#xff0c;处理多种自然语言任…

MySQL中使用percona-xtrabackup工具 三种备份及恢复 (超详细教程)

CSDN 成就一亿技术人&#xff01; 今天讲讲再MySQL中使用percona-xtrabackup这个开源工具来实现在线备份。 CSDN 成就一亿技术人&#xff01; 目录 介绍percona-xtrabackup 安装Percona 完整备份 备份流程 恢复流程 1.模拟文件损坏 2.滚回日志 3.恢复数据目录 4.授权…

《动手学深度学习(PyTorch版)》笔记4.6

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过。…

北京摇号政策梳理汇总

文章目录 政策梳理 家庭申请资格 家庭积分规则 参考资料 目前&#xff0c;北京车牌摇号实施的政策&#xff0c;主要是2021年1月1日的《<北京市小客车数量调控暂行规定>实施细则》。本文梳理了与博主本人直接相关的一些内容&#xff0c;可能对大部分网友也有帮助。 政…

vue中的computed

目录 一&#xff1a;介绍 二&#xff1a;例子演示 一&#xff1a;介绍 在 Vue.js 中&#xff0c;computed 属性是一种特殊类型的属性&#xff0c;它允许你声明依赖于其他数据属性的值。computed 属性的值是通过一个函数计算得出的&#xff0c;这个函数可以在其依赖的数据发生…

Java 数据结构篇-深入了解排序算法(动态图 + 实现七种基本排序算法)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 实现冒泡排序 2.0 实现选择排序 2.1 选择排序的改良升级 3.0 实现堆排序 4.0 实现插入排序 5.0 实现希尔排序 6.0 实现归并排序 6.1 递归实现归并排序 6.2 使用…

【misc | CTF】攻防世界 2017_Dating_in_Singapore

天命&#xff1a;这次终于碰到了算是真正的misc题目了 下载附件&#xff0c;打开是PDF&#xff0c;我一开始以为是flag隐写在PDF里面了 虽然也不奇怪&#xff0c;应该是可以的&#xff0c;毕竟PDF有xss漏洞也是可以的 言归正传&#xff0c;打开PDF 看着新加坡的日历&#xff…

汽车网络安全管理体系框架与评价-汽车网络安全管理体系框架

R155《网络安全与网络安全管理系统》法规中明确指出 &#xff0c; 汽车制造商应完成 “汽车网络安全管理体系认证” &#xff08;简称&#xff1a; CSMS认证&#xff09;以及 “车辆型式审批&#xff02; 且CSMS认证&#xff0c;是车辆型式审批的前提条件。 虽然我国相关政策尚…

走方格(动态规划)

解题思路&#xff1a; 找边界&#xff0c;即行为1&#xff0c;列为1。 拆分问题&#xff0c;拆分成一次走一步&#xff0c;只能向右或者向下走。 解题代码&#xff1a; public static void main(String[] args) {int [][]arrnew int[31][31];Scanner scnew Scanner(Sys…