本文分享自华为云社区《kube-scheduler如何完成调度和调整调度权重》,作者: 可以交个朋友。

一、概述

Kube-scheduler作为k8s集群的默认调度器,它监听(watch机制)kube-apiserver,查询还未调度的pod,根据调度策略将pod调度至集群内最适合的Node

二、调度流程

首先我们通过API或者kubectl工具创建pod,kube-apiserver收到请求信息存储到etcd中,调度器通过watch机制监听apiserver查看到还未被调度的pod列表,循环遍历的为每个pod尝试分配node,这个分配过程如下:

  • kube-scheduler内Informer组件list-watch apiserver,使用spec.nodeName=""筛选出还未调度的Pod

  • 预选(predicate):调度器通过Predicate算法过滤掉不满足条件的节点

  • 优选(priorlty):对于通过预选的节点,通过打分机制,筛选出得分最高的node

  • 当调度器为Pod选择了一个合适的节点后,将Pod和节点进行绑定(将节点名称赋值给pod的spec.nodeName字段)

注意:Pod.spec.nodeName用于强制约束将Pod调度到指定的Node上,通过指定nodeName可直接绕过调度器,并不会做任何的资源过滤和检查

三、kuble-scheduler调度原理

Kube-scheduler的调度框架,在 Kubernetes 里面叫作 Scheduler Framework。Pod在调度过程中,都需要依次经过以下的各个阶段,每个阶段自带调度算法,调度算法由插件提供,也可以在指定阶段开发自己的插件。每个插件可以在指定阶段实现具体的调度算法,比如NodeAffinity插件在Filter阶段过滤掉与Pod不亲和的节点。

  • PreFilter: 预处理 Pod 的相关信息,或者检查集群或Pod 必须满足的某些条件。如果 PreFilter 插件返回错误,则调度周期将终止。

  • Filter: 过滤出不能运行该 Pod 的节点。对于每个节点,调度器将按照其配置顺序调用这些过滤插件。如果任何过滤插件将节点标记为不可行,则节点直接排除,不会为该节点调用剩下的过滤插件。

  • PostFilter: 在 Filter 阶段后调用,但仅在该 Pod 没有可行的节点时调用。 典型的后筛选实现是抢占,试图通过抢占其他 Pod 的资源使该 Pod 可以调度。

  • PreScore: 运行评分任务以生成可评分插件的共享状态,如果 PreScore 插件返回错误,则调度周期将终止

  • Score: 通过调用每个评分插件对可调度节点评分

  • NormalizeScore: 规范每个插件的打分在[0,100]之间

  • Reserve: 在绑定周期之前选择保留的节点

  • Permit: 批准或拒绝pod调度周期的结果

  • PreBind: 用于执行 Pod 绑定前所需的任何工作。例如,一个预绑定插件可能需要提供网络卷并且在允许 Pod 运行在该节点之前 将其挂载到目标节点上。

  • Bind: 用于将 Pod 绑定到节点上。直到所有的PreBind 插件都完成,Bind 插件才会被调用。

  • PostBind: 这是个信息性的扩展点。绑定后插件在 Pod 成功绑定后被调用。这是绑定周期的结尾,可用于清理相关的资源

调度器预选阶段对应filter,主要用于过滤不满足Pod调度条件的节点;优选阶段对应score,主要用于为每个节点打分,节点分数=插件打分*插件权重;然后排序选出分数最高的节点

 

调度阶段

实现插件名称

插件功能介绍

filter

PodTopologySpread

判断节点是否满足Pod的拓扑分布,不满足则过滤该节点.

InterPodAffinity

判断节点是否满足Pod的亲和性配置,不满足则过滤该节点

NodePorts

判断节点是否满足Pod的端口申请,不满足则过滤该节点

NodeAffinity

判断节点是否满足Pod的节点亲和性配置,不满足则过滤该节点

VolumeBinding

判断节点是否满足pv的节点亲和性,并且将满足动态创建pvc条件(比如拓扑)的节点保存起来,以便后续阶段使用

TaintToleration

根据Pod容忍和节点污点的NoSchedule和NoExecute过滤节点

Score

NodeAffinity

根据插件权重算出得分,再根据策略权重比例算出节点分数,分数区间0~100,权重默认2

NodeResourcesBalancedAllocatio

根据不同resource(cpu、mem、volume)对节点容量的占比再加上对应resource的权重得到分数,分数区间0~100,权重默认1

ImageLocality

根据Pod中镜像大小以及镜像在所有节点上的分布来打分,分数区间0~100,权重默认1

InterPodAffinity

根据插件权重算出得分,再根据策略权重比例算出节点分数,分数区间0~100,权重默认2

TaintToleration

根据PreferNoSchedule策略算出分数,分数区间0~100,权重默认3

NodeResourcesFit

三种策略:LeastAllocated(分配越少得分越高)、MostAllocated(分配越多得分越高)、RequestedToCapacityRatio(请求值与容量比率)

PodTopologySpread

根据拓扑匹配度和权重得出分数,分数区间0~100,权重默认2

3.1 kubernetes 1.23版本调度器filter阶段和score阶段源码分析

3.2 修改调度器插件默认权重示例

3.2.1 环境准备

环境:集群中有两个节点:k8s-0001和k8s-0002;已有工作负载nginx,调度至节点k8s-0002,工作负载test,yaml文件如下:

apiVersion: apps/v1
kind: Deployment
metadata:
name: test
spec:
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
spec:
containers:
- name: container-1
image: nginx:latest
dnsPolicy: ClusterFirst
affinity:
nodeAffinity: #利用节点亲和使其调度至k8s-0001
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- k8s-0001
podAffinity: #利用负载亲和使其调度至k8s-0002
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- nginx
namespaces:
- default
topologyKey: kubernetes.io/hostname

3.2.2 调整InterPodAffinity权重,使工作负载test调度至节点k8s-0002

apiVersion: v1
kind: ConfigMap
metadata:
name: scheduler-config
namespace: kube-system
data:
scheduler-config.yaml: |
apiVersion: kubescheduler.config.k8s.io/v1beta3 #1.23以上版本集群可用v1beta3
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: default-scheduler
plugins:
score:
disabled:
- name: InterPodAffinity
- name: NodeAffinity
enabled:
- name: InterPodAffinity #提高负载亲和权重
weight: 100
- name: NodeAffinity
weight: 1

查看kube-scheduler调度日志,k8s-002 score得分为打分100 * 权重 100共得10000分,调度到k8s-002节点上

3.2.3 调整NodeAffinity权重,使工作负载test调度至节点k8s-0001

apiVersion: v1
kind: ConfigMap
metadata:
name: scheduler-config
namespace: kube-system
data:
scheduler-config.yaml: |
apiVersion: kubescheduler.config.k8s.io/v1beta3
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: default-scheduler
plugins:
score:
disabled:
- name: InterPodAffinity
- name: NodeAffinity
enabled:
- name: InterPodAffinity
weight: 1
- name: NodeAffinity #提高节点亲和权重
weight: 100

聊聊kube-scheduler如何完成调度和调整调度权重的更多相关文章

  1. DS Scheduler 0.7 发布,Linux 调度系统 - 开源中国社区

    DS Scheduler 0.7 发布,Linux 调度系统 - 开源中国社区 DS Scheduler 0.7 发布,Linux 调度系统

  2. Linux调度器 - deadline调度器

    一.概述 实时系统是这样的一种计算系统:当事件发生后,它必须在确定的时间范围内做出响应.在实时系统中,产生正确的结果不仅依赖于系统正确的逻辑动作,而且依赖于逻辑动作的时序.换句话说,当系统收到某个请求 ...

  3. Kubernetes之调度器和调度过程

    scheduler 当Scheduler通过API server 的watch接口监听到新建Pod副本的信息后,它会检查所有符合该Pod要求的Node列表,开始执行Pod调度逻辑.调度成功后将Pod绑 ...

  4. Linux进程核心调度器之主调度器schedule--Linux进程的管理与调度(十九)

    主调度器 在内核中的许多地方, 如果要将CPU分配给与当前活动进程不同的另一个进程, 都会直接调用主调度器函数schedule, 从系统调用返回后, 内核也会检查当前进程是否设置了重调度标志TLF_N ...

  5. Linux核心调度器之周期性调度器scheduler_tick--Linux进程的管理与调度(十八)

    我们前面提到linux有两种方法激活调度器:核心调度器和 周期调度器 一种是直接的, 比如进程打算睡眠或出于其他原因放弃CPU 另一种是通过周期性的机制, 以固定的频率运行, 不时的检测是否有必要 因 ...

  6. scrapy 基础组件专题(七):scrapy 调度器、调度器中间件、自定义调度器

    一.调度器 配置 SCHEDULER = 'scrapy.core.scheduler.Scheduler' #表示scrapy包下core文件夹scheduler文件Scheduler类# 可以通过 ...

  7. Go语言调度器之主动调度(20)

    本文是<Go语言调度器源代码情景分析>系列的第20篇,也是第五章<主动调度>的第1小节. Goroutine的主动调度是指当前正在运行的goroutine通过直接调用runti ...

  8. 重新梳理调度器——GMP 调度模型

    调度器--GMP 调度模型 Goroutine 调度器,它是负责在工作线程上分发准备运行的 goroutines. 首先在讲 GMP 调度模型之前,我们先了解为什么会有这个模型,之前的调度模型是什么样 ...

  9. kubernetes 设置 Master 可调度与不可调度

    kubernetes 设置 Master 可调度与不可调度 语法 kubectl taint node [node] key=value[effect] [effect] 可取值: [ NoSched ...

  10. SQLSERVER 数据调度示例,调度数据到中间表或者历史表

    USE [MeiDongPay_Test] GO /****** Object: StoredProcedure [dbo].[Job_BatchTransferOrderToMidst] Scrip ...

随机推荐

  1. Pytest 框架执行用例流程浅谈

    背景: 根据以下简单的代码示例,我们将从源码的角度分析其中的关键加载执行步骤,对pytest整体流程架构有个初步学习. 代码示例: import pytest def test_add(): asse ...

  2. 记一次weak_up函数绕过

    2023 蓝帽杯CTF LovePHP 因为比赛已经结束,所以复现环境是从本地进行复现,这次比赛本来排名挺靠前的,原本总排名是60多名,赛区排名30多名,本来是以为有希望进入半决赛的,但是没想到比赛结 ...

  3. MySQL实战实战系列 01 基础架构:一条SQL查询语句是如何执行的?

    这是专栏的第一篇文章,我想来跟你聊聊 MySQL 的基础架构.我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题.同样,对于 MySQL 的学习也是这样. ...

  4. Journey -「CQOI 2021」

    Day -1 Thu. & Fri. 恰逢学校运动会,于是向班主任申请了不去,然后就在机房坐着.不美好的事情可能就是文化课老师还留了这两天的作业,不过-> 一旦放弃了作业,什么都好说了呢 ...

  5. Teamcener AWC Solr链接被拒

    1.检查安装Solr安装情况 2.在tem上勾选添加 安装完成后,总共有2个文件夹需要注意,一个 solr-版本 的文件夹,一个 TcFTSindexer 的文件夹 如果是solr安装的是服务,则不需 ...

  6. 使用Eclipse生成CHM帮助文档(图解)

    使用Eclipse生成CHM帮助文档(图解) 博客分类: System Operate javadoc生成chm文档java生成api帮助文档api帮助文档生成工具 Eclipse JavaDoc和j ...

  7. Java虚拟机(JVM):第二幕:自动内存管理 - Java内存区域与内存溢出异常

    前言:Java与C++之间有一堵高墙,主要是有内存动态分配和垃圾收集技术组成的.墙外的人想要进来,墙内的人想要出去. 一.运行时数据区域 JVM在执行Java程序时,会将其管理的内存划分为若干个不同的 ...

  8. [GXYCTF 2019]Ping Ping Ping

    题目就是ping,而且这还有一个查询窗口,就随便查询试试 ping了一下本地,发现没有什么很大的作用,给出了提示是php可以执行系统函数这就感到神奇了,就还是上网搜了搜 发现可以在查询IP后面进行拼接 ...

  9. 【解决】elasticsearch:Could not parse aggregation keyed as [%s]问题

    背景 在做elasticsearch集群从原来的2.x版本升级到更新版本如6.x过程中,由于需要在原来的应用中,同时连接2.x的集群以及6.x的集群来做在线动态灰度切流量,保证流量平滑切换,有问题可随 ...

  10. liunx远程管理常用命令笔记

    1,关机/重启 shutdown -r now : 立刻重启的命令 2,查看或配置网卡信息 2.1  网卡和 IP 地址 2.2  ifconfig 用了管道和grep 查找到 IP 地址 2.3 p ...