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: nginxnamespace: defaultlabels:app: nginx
spec:selector:matchLabels:app: nginxreplicas: 3template:metadata:labels:app: nginxspec:containers:- name: nginximage: docker.m.daocloud.io/nginximagePullPolicy: 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: nginxnamespace: defaultlabels:app: nginx
spec:selector:matchLabels:app: nginxreplicas: 3template:metadata:labels:app: nginxspec:nodeSelector:app: nginxcontainers:- name: nginximage: docker.m.daocloud.io/nginximagePullPolicy: 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: nginx1namespace: defaultlabels:app: nginx1
spec:selector:matchLabels:app: nginx1replicas: 3template:metadata:labels:app: nginx1spec:containers:- name: nginx1image: docker.m.daocloud.io/nginximagePullPolicy: IfNotPresent###第二个
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx2namespace: defaultlabels:app: nginx2
spec:selector:matchLabels:app: nginx2replicas: 3template:metadata:labels:app: nginx2spec:containers:- name: nginx2image: docker.m.daocloud.io/nginximagePullPolicy: IfNotPresent

NodeAffinify验证

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx1namespace: defaultlabels:app: nginx1
spec:selector:matchLabels:app: nginx1replicas: 3template:metadata:labels:app: nginx1spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- k8s-node03containers:- name: nginx1image: docker.m.daocloud.io/nginximagePullPolicy: IfNotPresent

在这里插入图片描述

调度结果

在这里插入图片描述

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

在这里插入图片描述

如果是软策略

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx1namespace: defaultlabels:app: nginx1
spec:selector:matchLabels:app: nginx1replicas: 3template:metadata:labels:app: nginx1spec:affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 1preference:matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- k8s-node04containers:- name: nginx1image: docker.m.daocloud.io/nginximagePullPolicy: IfNotPresent

在这里插入图片描述

PodAffinity 亲和验证

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

看下nginx1的硬策略

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx1namespace: defaultlabels:app: nginx1
spec:selector:matchLabels:app: nginx1replicas: 3template:metadata:labels:app: nginx1spec:affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- nginx2topologyKey: kubernetes.io/hostnamecontainers:- name: nginx1image: docker.m.daocloud.io/nginximagePullPolicy: IfNotPresent

调度结果

在这里插入图片描述

PodAntiAffinity 反亲和验证

nginx2的运行情况

在这里插入图片描述

nginx1

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx1namespace: defaultlabels:app: nginx1
spec:selector:matchLabels:app: nginx1replicas: 3template:metadata:labels:app: nginx1spec:affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- nginx2topologyKey: kubernetes.io/hostnamecontainers:- name: nginx1image: docker.m.daocloud.io/nginximagePullPolicy: 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: nginx1namespace: defaultlabels:app: nginx1
spec:selector:matchLabels:app: nginx1replicas: 3template:metadata:labels:app: nginx1spec:tolerations:- key: "app"operator: "Exists"effect: "NoExecute"containers:- name: nginx1image: docker.m.daocloud.io/nginximagePullPolicy: 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: nginx1namespace: defaultlabels:app: nginx1
spec:selector:matchLabels:app: nginx1replicas: 3template:metadata:labels:app: nginx1spec:nodeName: k8s-node01containers:- name: nginx1image: docker.m.daocloud.io/nginximagePullPolicy: IfNotPresent

在这里插入图片描述

调度策略场景总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】C++入门基础讲解(二)

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 导读 接着上一篇的内容继续学习&#xff0c;今天我们需要重点学习引用。 1. 引用 在C中&#xff0c;引用是一种特殊的变量&#xff…

免费电视TV盒子软件,好用的免费电视盒子软件大全,免费电视盒子APP大全,2024最新整理

1、TVbox下载地址、影视接口、配置教程 下载地址 TVbox TVbox可用接口地址合集 注&#xff1a;接口均来源于互联网收集分享&#xff01;所有接口都是经过测试的&#xff0c;如果出现加载失败等情况&#xff0c;可能是因为接口针对的盒子有兼容问题&#xff0c;可以多试试几…

Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第十一章 反思C++面向对象与虚函数(上)

C的面向对象语言设施相比其他现代语言可算得上“简陋”&#xff0c;而且与语言的其他部分&#xff08;better C、数据抽象、泛型&#xff09;融合度较差&#xff08;见电子工业出版社出版的《C Primer&#xff08;第4版&#xff09;&#xff08;评注版&#xff09;》第15章&…

语义分割 | 基于 VGG16 预训练网络和 Segnet 架构实现迁移学习

Hi&#xff0c;大家好&#xff0c;我是源于花海。本文主要使用数据标注工具 Labelme 对猫&#xff08;cat&#xff09;和狗&#xff08;dog&#xff09;这两种训练样本进行标注&#xff0c;使用预训练模型 VGG16 作为卷积基&#xff0c;并在其之上添加了全连接层。基于标注样本…

uni-app 接口封装,token过期,自动获取最新的token

一、文件路径截图 2、新建一个文件app.js let hosthttp://172.16.192.40:8083/jeecg-boot/ //本地接口 let myApi {login: ${host}wx/wxUser/login, //登录 } module.exports myApi 3、新建一个文件request.js import myApi from /utils/app.js; export const r…

MySQL知识点总结(二)——explain执行计划、SQL优化

MySQL知识点总结&#xff08;二&#xff09;——explain执行计划、SQL优化 explain执行计划typepossible_keyskeysextra SQL优化SQL优化的流程SQL优化技巧范围查询优化排序优化分组查询优化distinct优化分页查询优化join关联查询优化排序分页 关联查询分组 关联查询 排序in与…

力扣hot100 实现Trie(前缀树) 字典树 一题双解

Problem: 208. 实现 Trie (前缀树) 文章目录 思路复杂度&#x1f49d; TrieNode版&#x1f49d; 二维数组版 思路 &#x1f469;‍&#x1f3eb; 宫水三叶 复杂度 &#x1f49d; TrieNode版 public class Trie {class TrieNode{boolean end;//标记是否有以当前节点为结尾的字…

一文学习Thrift RPC

Thrift RPC引言 Thrift RPC的特点 Thrift 是一个RPC的框架&#xff0c;和Hessian RPC有什么区别&#xff0c;最重要的区别是Thrift可以做异构系统开发。 什么是异构系统&#xff0c;服务的提供者和服务的调用者是用不同语言开发的。 为什么会当前系统会有异构系统的调用&…

XPath判断当前选中节点的元素类型 Python lxml判断当前Element的元素类型 爬虫爬取页面分元素类型提取纯文本

背景&前言 不知道你们做爬虫的时候&#xff0c;有没有碰到和我一样的情况&#xff1a;将页面提取成纯文本的时候&#xff0c;由于页面中各种链接、加粗字体等&#xff0c;直接提取会造成结果一坨一坨的&#xff0c;非常不规整。有时候还要自己对标题等元素进行修改&#x…

14.java集合

文章目录 概念Collection 接口概念示例 Iterator 迭代器基本操作&#xff1a;并发修改异常增强循环遍历数组&#xff1a;遍历集合&#xff1a;遍历字符串&#xff1a;限制 list接口ListIteratorArrayList创建 ArrayList&#xff1a;添加元素&#xff1a;获取元素&#xff1a;修…

【Unity】粒子贴图异常白边问题

从PS制作的黑底&#xff0c;白光的贴图。放入Unity粒子中&#xff0c;拉远看会有很严重的白边&#xff0c;像马赛克一样。 材质使用&#xff1a;Mobile/Particles/Additive 经测试只使用一张黑色的图片&#xff0c;也会有白边。 解决方案&#xff1a; 关闭黑色底&#xf…

【UE 材质】闪电材质

效果 步骤 1. 新建一个材质这里命名为“M_Lighting” 打开“M_Lighting”&#xff0c;设置混合模式为半透明&#xff0c;着色模型为无光照 在材质图表中添加如下节点 其中&#xff0c;纹理采样节点的纹理是一个线条 此时预览窗口中效果如文章开头所示。

自然语言NLP学习

2-7 门控循环单元&#xff08;GRU&#xff09;_哔哩哔哩_bilibili GRU LSTM 双向RNN CNN 卷积神经网络 输入层 转化为向量表示 dropout ppl 标量 在物理学和数学中&#xff0c;标量&#xff08;Scalar&#xff09;是一个只有大小、没有方向的量。它只用一个数值就可以完全…

第十三章认识Ajax(四)

认识FormData对象 FormData对象用于创建一个表示HTML表单数据的键值对集合。 它可以用于发送AJAX请求或通过XMLHttpRequest发送表单数据。 以下是FormData对象的一些作用&#xff1a; 收集表单数据&#xff1a;通过将FormData对象与表单元素关联&#xff0c;可以方便地收集表…

AF647-羧酸,Alexa-Fluor 647-羧酸,适合用于标记蛋白质

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;AF647-carboxylic-acid &#xff0c;AF647-COOH&#xff0c;AF647-acid&#xff0c;Alexa-Fluor 647-acid&#xff0c;AF647-羧酸&#xff0c;Alexa-Fluor 647-羧酸 一、基本信息 产品简介&#xff1a;AF647&#x…

周报(20240128)

日期&#xff1a;2024.1.22 - 2024.1.28 本周工作&#xff1a; 1. 阅读论文 本周阅读了以下论文&#xff1a; 《BRAU-Net&#xff1a;用于医学图像分割的U形混合CNN-Transformer网络》 背景 精确的医学图像分割对于临床量化、疾病诊断、治疗计划和许多其他应用至关重要。基…

深度学习核心技术与实践之深度学习研究篇

非书中全部内容&#xff0c;只是写了些自认为有收获的部分。 Batch Normalization 向前传播 &#xff08;1&#xff09;三个主要任务&#xff1a;计算出每批训练数据的统计量。 对数据进行标准化 对标…

赛氪荣获“2023天津高新技术企业大会支持单位”

1月23日上午&#xff0c;2023天津市高新技术企业大会新闻发布会在天开高教科技园核心区综合服务中心召开&#xff0c;市高企协以及来自高校、企业、社会组织等80余人现场参会。 大会组委会秘书长张博航介绍到&#xff1a;“本次大会将实现自开办以来的多个首次&#xff0c;首次…

AIDL实践

先贴最后的文件目录&#xff1a; aidl/android/hardware/demo/IFoo.aidl&#xff1a; package android.hardware.demo;import android.hardware.demo.IFooCallback;VintfStability interface IFoo {void doFoo();int doFooWithParameter(int param);void registerCallback(IFo…

案例分析技巧-软件工程

一、考试情况 需求分析&#xff08;※※※※&#xff09;面向对象设计&#xff08;※※&#xff09; 二、结构化需求分析 数据流图 数据流图的平衡原则 数据流图的答题技巧 利用数据平衡原则&#xff0c;比如顶层图的输入输出应与0层图一致补充实体 人物角色&#xff1a;客户、…