k8s--集群调度(kube-scheduler)

了解kube-scheduler

由之前博客可知kube-scheduler是k8s中master的核心组件之一

scheduler:负责调度资源。把pod调度到node节点。他有两种策略:

预算策略:人为部署,指定node节点去部署新建的pod

优先策略:通过算法选择一个负载最小,资源最充沛的资源去部署。

k8s中List-watch

k8s集群当中,通过list-watch的机制进行每个组的写作,保持数据同步。这种设计可以实现每个组件之间的解耦(解耦:减少每个组件之间的关联性)。

kubectl来配置文件,向APIServer发送命令----apiserver把命令发送到各个组件。

kubectl run nginx --image=nginx:1.22-------apiserver------controller manager------scheduler-------kubelet.。

创建成功之后,kubectl get pod kubectl describe pod nginx-------保存到etcd当中

以上过程是list-watch会在每一步把监听的消息(APIserver:6443)-------controller manager,scheduler,kubelet,etcd都会监听apiserver:6443

工作流程图:

注意:在创建 Pod 的工作就已经完成了后,为什么 kubelet 还要一直监听呢?原因很简单,假设这个时候 kubectl 发命令,要扩充 Pod 副本数量,那么上面的流程又会触发一遍,kubelet 会根据最新的 Pod 的部署情况调整 Node 的资源。又或者 Pod 副本数量没有发生变化,但是其中的镜像文件升级了,kubelet 也会自动获取最新的镜像文件并且加载。
 

2.调度的过程和策略

scheduler是k8s集群的调取器,把pod分配到集群的节点。

以下几个问题需要考虑:

1.公平:每个节点都能够分配资源。

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

3.效率:调度的性能要搞好。能够尽快的完成大批量的pod的调度工作。

4.灵活:允许用户根据自己的需求,控制和改变调度的逻辑。

scheduler是一个单独运行的程序,启动之后就会一直监听APIserver,获取报文中的字段:spec.modeName

创建pod时候,为每个pod创建一个binding,表示该往哪个节点上部署。

创建pod到节点时,有两个策略:先执行预算策略再执行优先策略。这两步都必须成功,否则立刻返回报错。

也就是说,部署的node,必须满足这两个策略。

预算策略:

predicate自带一些算法来选择node节点(scheduler自带的算法策略。不需人工干预)

  • 1.podfitsresoureces:Pod的适应资源,检测节点上剩余测资源是否满足pod请求的资源主要是cpu和内存。
  • 2.podfitshost:pod适应主机,如果pod指定了node的name。
  • nginx1 pod---> node01,检测主机名是否存在,存在要和pod指定的名称匹配,这才能调度过去。
  • 3.podselectormatches:pod选择器匹配,创建pod的时候可以根据node的标签来进行匹配。查找指定的node节点上标签是否存在,存在的标签是否匹配。
  • 4.nodiskconflict:无磁盘冲突,确保已挂载的卷与pod的卷不发生冲突,除非目录是只读。

只有上述策略完成,才回到优先策略。如果预算策略都不满足,pod将始终处于pending状态,不断地重试调度,直到有节点满足条件为止。

如果node1,node2,node3经过预算策略,上述三个节点都满足条件----》优先策略

优先策略

leastreaquestedpriority:

最低请求优先级,通过算法计算节点上的cpu和内存使用率,确定节点的权重。

使用率越低的节点相应的权重就越高。调度时会更倾向于使用率低的节点。实现资源合理的利用。

balancersourceallocation:

平衡资源分配,考虑cpu和内存的使用率,给节点赋予权重。权重算的是cpu和内存使用率接近。使用率越接近,权重越高。

和上面的leastreaquestedpriority最低请求优先级一起使用。

举个例子,有node1,node2两个节点,资源分别是:

node1 cpu和内存使用率: 20:60

node2 cpu和内存使用率: 50:50

node2再被调度时会被优先

imagelocalitypriority:

节点上是否已经有了要部署的镜像。镜像的总数成正比,满足的镜像数越多,权重越高。

以上这些策略scheduler自带的算法。

通过预算选择出可以部署的节点,再通过优先选择出来最好的节点,以上都是自带的算法。k8s集群自己来选择。

总的来说:

预选策略 :通过调度算法过滤掉不满足条件的Node节点

优选策略 :通过优先级选项给满足调度条件的Node节点进行优先级权重排序,最终选择优先级最高的Node节点来调度Pod

如何指定节点部署

指定节点配置需要在spec模块中参数设置:

nodeName:node02

首先,我们为了防止缩进错误,用生成的yaml文件修改:

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginxname: nginx2
spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginx:1.22name: nginxnodeName: node02

如果指定了节点,在参数中设置了nodeName,指定了节点的名称,会跳过scheduler调度策略。这个规则是强制匹配

如何指定标签部署

我们可以通过以下命令查看node的标签

kubectl get nodes --show-labels

我们可以在命令行给node添加标签

kubectl label nodes node02 test3=c

已经部署的服务器的标签

已经部署的服务器的标签

节点资源不够会进入pending

指定节点标签部署pod,是要经过scheduler的算法,如果节点不满足条件,pod会进入penging状态,直到节点条件满足为止。

k8s集群的亲和性

软策略和硬策略

node节点亲和性:

preferredDuringSchedulingIgnoredDuringExecution软策略:

选择node节点时,我声明了我最好能部署在node01,软策略会尽量满足这个条件。不一定会完全部署在node01节点上。

requiredDuringSchedulingIgnoredDuringExecution硬策略:

选择pod时,声明了node01,我是硬策略,必须满足硬策略的条件。必须部署在node01,强制性要求

pod的亲和性

preferredDuringSchedulingIgnoredDuringExecution软策略

要求调度器将pod调度到其他pod的亲和性匹配的节点上。可以是,也可以不是,尽量满足

pod nginx1 node01

pod nginx2 node02 希望和nginx1部署在一个节点,尽量满足

requiredDuringSchedulingIgnoredDuringExecution硬策略

pod nginx1 node01

pod nginx2 node02 必须要和nginx的亲和性匹配,只能往node01。

键值的运算关系

标签:都是根据标签开选择亲和性。

In:在

选择的标签值在node节点上存在。

Notin:不在

选择label的值不在node节点上

Gt:大于,大于选择的标签值

Lt:小于,小于选择标签值。

Exists:存在,选择标签对象,值不考虑。

DoesNotExit:选择不具有指定表

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginxname: nginx2
spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:nodeSelector:test01: acontainers:- image: nginx:1.22name: nginxaffinity:
#选择亲和性部署方式nodeAffintity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:
选择了亲和性nodeSelectorsTerms你要选择哪个nodez作为node为硬策略,匹配的节点标签- matchExpressions:
定义一个符合我要选择的node节点的信息- key: test3operator: In(NotIn)
指定键值对的算法values:- cwq

删除标签

kubectl label nodes node01 test2-

              - key: memoryoperator: Gtvalues:- "612"
wq                
kubectl label nodes node02 memory=1000

Gt:大于,大于选择的标签值

Lt:小于,小于选择标签值。

只能比较整数值

亲和性策略根据标签来选择。

Exists:存在,选择标签对象,值不考虑。

DoesNotExit:选择不具有指定表

              - key: memoryoperator: Existsvalues:- "612"
wq
kubectl apply -f test1.yaml
会报错,因为不能有值所以:- key: memoryoperator: Exists
指定键值对的算法为Exists  or  DoesNotExists不能使用values字段。

软策略

     affinity:
#选择亲和性部署方式nodeAffintity:preferredDuringSchedulingIgnoredDuringExecution:-weight: 1
选择软策略之后要加上权重preference:
选择节点的倾向,尽量满足要求而不是一定。        
选择了亲和性nodeSelectorsTerms你要选择哪个nodez作为node为硬策略,匹配的节点标签- matchExpressions:
定义一个符合我要选择的node节点的信息- key: memoryoperator: DoesNotExistwq

多个软策略通过什么匹配?

      affinity:
#选择亲和性部署方式nodeAffintity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 1选择软策略之后要加上权重preference:
选择节点的倾向,尽量满足要求而不是一定。        
选择了亲和性nodeSelectorsTerms你要选择哪个nodez作为node为硬策略,匹配的节点标签- matchExpressions:
定义一个符合我要选择的node节点的信息- key: memoryoperator: DoesNotExistpreferredDuringSchedulingIgnoredDuringExecution:- weight: 10preference:matchExpressions:- key: memoryoperator: Invalues:- "500"多个软策略以权重高的为标的

软硬策略结合的话结果是什么?

      affinity:nodeAffintity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 1preference:- matchExpressions:- key: memoryoperator: Existsvalues:- "1000"requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: memoryoperator: Invalues:- "500"wqkubectl apply -f test1.yaml

多个软策略看权重,权重高,执行指定的软策略。

硬策略:先满足硬策略,硬策略一个都不满足才会执行软策略。

你在部署的时候选择一个什么样的策略:

node亲和性:性能不一致,我尽量把pod往性能高的多部署,软策略

节点故障或者节点维护,只能选择硬策略,把节点故障剔除。

举例子:

4/8G 4/8G 2/4G

node1 node2 node3

性能不一致的时候最好使用软策略

如果其中一个node 挂了,可以使用硬策略来指定部署。

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

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

相关文章

怎么做微信秒活动_掀起购物狂潮,引爆品牌影响力

微信秒杀活动:掀起购物狂潮,引爆品牌影响力 在数字化时代,微信已经成为人们日常生活中不可或缺的一部分。作为中国最大的社交媒体平台,微信不仅为人们提供了便捷的通讯方式,还为商家提供了一个广阔的营销舞台。其中&a…

vue3的福音框架arco.design

前言: 在vue2于2023年底正式宣布不在维护,vue3使用越来越频繁的时刻,我们实现项目的辅助框架也越来越多。element, iview, antd 等经典框架继续风靡一时,不过也有很多好的框架,功能也强大,比如我们今天说的…

2.【CPP】入门(宏||内联函数||拷贝构造||析构函数||构造函数)

0x01.引言 1.实现一个宏函数ADD #define ADD(x,y) ((x)(y))//宏是预编译阶段完成替换,注意括号2.宏的优缺点 优点: 1.增强代码的复用性 2.宏函数不用建立栈帧,提高性能 缺点: 1.不方便调试 2.没有安全检查 0x02.内联函数 1.以空…

什么是冒泡排序?如何实现?

一、是什么 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法 冒泡排序的思想就是在每次遍历一遍未排序的数列之后,将一个数据元素浮上去(也就是排好了一个数据) 如同碳酸饮料中二氧化碳的…

摄像头视频录制程序使用教程(Win10)

摄像头视频录制程序-Win10 🥗介绍🍛使用说明🚩config.json 说明🚩启动🚩关闭🚩什么时候开始录制?🚩什么时候触发录制?🚩调参 🥗介绍 检测画面变化…

“数据要素×”行动计划发布,粮食安全监管如何应变?

近日,国家数据局发布“数据要素”三年行动计划(2024-2026年),在“数据要素现代农业“部分提到:提升农业综合生产能力,支持农业生产经营主体和相关服务企业融合利用气象、土壤、农事作业、病虫害、市场等数据…

FineBI实战项目一(17):热门商品Top10分析开发

点击新建组件,创建热门商品Top10组件。 选择柱状图,拖拽cnt(总数)到横轴,拖拽goodName到纵轴。 选择排序规则。 修改横轴和纵轴的标签名称 切换到仪表板,拖拽组件到仪表板 效果如下:

别再纠结,这8款设计工具助你轻松绘制原型图!

原型图设计工具有很多优点。除了帮助设计师快速与客户达成协议,避免项目前景的冲突外,原型图设计工具还可以让客户看到正在创建的内容。如果需要更改,原型图设计工具也可以轻松完成。本文快速总结了8种原型图设计工具。无论你是专业设计师还是…

使用AUTOSAR来开发汽车基础软件的优点

1、高质量。以前我们采用手写代码的方式,是几个工程师在战斗。现在我们采用平台,BSW代码都是供应商提供的,我们相当于后面还有一个团队陪着我们在战斗。 2、低成本。大家都说采用AUTOSAR平台好贵,但是从长远来看是值得的&#xff…

Windows安全基础:认证基础知识

目录 Windows凭据 Windows访问控制模型 访问令牌: 安全标识符(SID): 安全描述符: 令牌安全防御 1、禁止域管理员异机登录 2、开启“审核进程创建”策略 Windows凭据 SSPI(Security Support Provide…

华为ipv4+ipv6双栈加isis多拓扑配置案例

实现效果:sw1中的ipv4和ipv6地址能ping通sw2中的ipv4和ipv6地址 R2-R4为存IPV4连接,其它为ipv6和ipv4双连接 sw1 ipv6 interface Vlanif1 ipv6 enable ip address 10.0.11.1 255.255.255.0 ipv6 address 2001:DB8:11::1/64 interface MEth0/0/1 inter…

登录模块的实现

一.前期的准备工作 1.页面的布局 (1)表单的校验: 利用element-ui提供的文档绑定rules规则后实现校验 (2)跨域的配置 : 利用proxy代理来解决跨域的问题 (3)axios拦截器的配置 两个点:1. 在请求拦截的成功回调中,如果token,因为调用其它的接口需要token才能调取。 在请…

二刷Laravel 教程(用户注册)总结Ⅳ

一、显示用户信息 1)resource Route::resource(users, UsersController); 相当于下面这7个路由 我们先用 Artisan 命令查看目前应用的路由: php artisan route:list 2) compact 方法 //我们将用户对象 $user 通过 compact 方法转化为一个关联…

数据聚合、自动补全、数据同步、es集群

目录 数据聚合 聚合的分类 DSL实现bucket聚合 DSL实现Metrics聚合 RestAPI实现聚合 多条件聚合 带过滤条件的聚合 自动补全 安装拼音分词器 自定义分词器 completion suggester查询 修改索引库数据结构 RestAPI实现自动补全查询 实现搜索框自动补全 数据同步 数…

华为HarmonyOS 创建第一个鸿蒙应用 运行Hello World

使用DevEco Studio创建第一个项目 Hello World 1.创建项目2.预览 Hello World3.安装模拟器4.运行 Hello World 1.创建项目 创建第一个项目,命名为HelloWorld,点击Finish 选择Empty Ability模板,点击Next Hello World 项目已经成功创建…

【VRTK】【VR开发】【Unity】19-VRTK实现旋转运动

课程配套学习项目源码资源下载 https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 【背景】 在实际开发中,旋转运动也是时常需要模拟的重要运动类型。常见的场景有开关门,方向盘轮胎以及拉动拉杆等等。 旋转运动的实现可以基于物理系…

使用 matlab 求解最小二乘问题

有约束线性最小二乘 其标准形式为: min ⁡ x 1 2 ∥ C x − d ∥ 2 2 \mathop {\min }\limits_x \quad \frac{1}{2}\left\| Cx-d \right\|_2^2 xmin​21​∥Cx−d∥22​ 约束条件为: A ⋅ x ≤ b A e q ⋅ x b e q l b ≤ x ≤ u b \begin{aligned} …

基于多反应堆的高并发服务器【C/C++/Reactor】(中)HttpResponse的定义和初始化 以及组织 HttpResponse 响应消息

一、HttpResponse的定义 1.定义状态码枚举 // 定义状态码枚举 enum HttpStatusCode {Unknown 0,OK 200,MovedPermanently 301,MovedTemporarily 302,BadRequest 400,NotFound 404 }; 2.HTTP 响应报文格式 这个数据块主要是分为四部分 第一部分是状态行第二部分是响应…

游戏、设计选什么内存条?光威龙武系列DDR5量大管饱

如果你是一位PC玩家或者创作者,日常工作娱乐中,确实少不了大容量高频内存的支持,这样可以获得更高的工作效率,光威龙武系列DDR5内存条无疑是理想之选。它可以为计算机提供强劲的性能表现和稳定的运行体验,让我们畅玩游…

无监督学习Principal Component Analysis(PCA)精简高维数据

目录 介绍 一、PCA之前 二、PCA之后 介绍 Principal Component Analysis (PCA) 是一种常用的数据降维和特征提取技术。PCA通过线性变换将高维数据映射到低维空间,从而得到数据的主要特征。PCA的目标是找到一个正交基的集合,使得将数据投影到这些基…