Kubernetes核心概念汇总—调度、抢占和驱逐(Pod 调度就绪态)

news/2024/10/17 16:36:12/

Pod 一旦创建就被认为准备好进行调度。 Kubernetes 调度程序尽职尽责地寻找节点来放置所有待处理的 Pod。 然而,在实际环境中,会有一些 Pod 可能会长时间处于"缺少必要资源"状态。 这些 Pod 实际上以一种不必要的方式扰乱了调度器(以及 Cluster AutoScaler 这类下游的集成方)。

通过指定或删除 Pod 的 .spec.schedulingGates,可以控制 Pod 何时准备好被纳入考量进行调度。

1、配置 Pod schedulingGates

schedulingGates 字段包含一个字符串列表,每个字符串文字都被视为 Pod 在被认为可调度之前应该满足的标准。 该字段只能在创建 Pod 时初始化(由客户端创建,或在准入期间更改)。 创建后,每个 schedulingGate 可以按任意顺序删除,但不允许添加新的调度门控。

 图:Pod SchedulingGates

2、用法示例

要将 Pod 标记为未准备好进行调度,你可以在创建 Pod 时附带一个或多个调度门控,如下所示:


pods/pod-with-scheduling-gates.yaml

apiVersion: v1
kind: Pod
metadata:name: test-pod
spec:schedulingGates:- name: foo- name: barcontainers:- name: pauseimage: registry.k8s.io/pause:3.6

Pod 创建后,你可以使用以下方法检查其状态:

kubectl get pod test-pod

输出显示它处于 SchedulingGated 状态:

NAME       READY   STATUS            RESTARTS   AGE
test-pod   0/1     SchedulingGated   0          7s

你还可以通过运行以下命令检查其 schedulingGates 字段:

kubectl get pod test-pod -o jsonpath='{.spec.schedulingGates}'

输出是:

[{"name":"example.com/foo"},{"name":"example.com/bar"}]

要通知调度程序此 Pod 已准备好进行调度,你可以通过重新应用修改后的清单来完全删除其 schedulingGates


 pods/pod-without-scheduling-gates.yaml

apiVersion: v1
kind: Pod
metadata:name: test-pod
spec:containers:- name: pauseimage: registry.k8s.io/pause:3.6

你可以通过运行以下命令检查 schedulingGates 是否已被清空:

kubectl get pod test-pod -o jsonpath='{.spec.schedulingGates}'

预计输出为空,你可以通过运行下面的命令来检查它的最新状态:

kubectl get pod test-pod -o wide

鉴于 test-pod 不请求任何 CPU/内存资源,预计此 Pod 的状态会从之前的 SchedulingGated 转变为 Running

NAME       READY   STATUS    RESTARTS   AGE   IP         NODE  
test-pod   1/1     Running   0          15s   10.0.0.4   node-2

3、可观测性

指标 scheduler_pending_pods 带有一个新标签 "gated", 以区分 Pod 是否已尝试调度但被宣称不可调度,或明确标记为未准备好调度。 你可以使用 scheduler_pending_pods{queue="gated"} 来检查指标结果。

4、可变 Pod 调度指令

特性状态: Kubernetes v1.27 [beta]

当 Pod 具有调度门控时,你可以在某些约束条件下改变 Pod 的调度指令。 在高层次上,你只能收紧 Pod 的调度指令。换句话说,更新后的指令将导致 Pod 只能被调度到它之前匹配的节点子集上。 更具体地说,更新 Pod 的调度指令的规则如下:

  1. 对于 .spec.nodeSelector,只允许增加。如果原来未设置,则允许设置此字段。

  2. 对于 spec.affinity.nodeAffinity,如果当前值为 nil,则允许设置为任意值。

  1. 如果 NodeSelectorTerms 之前为空,则允许设置该字段。 如果之前不为空,则仅允许增加 NodeSelectorRequirements 到 matchExpressions 或 fieldExpressions,且不允许更改当前的 matchExpressions 和 fieldExpressions。 这是因为 .requiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms 中的条目被执行逻辑或运算,而 nodeSelectorTerms[].matchExpressions 和 nodeSelectorTerms[].fieldExpressions 中的表达式被执行逻辑与运算。
  1. 对于 .preferredDuringSchedulingIgnoredDuringExecution,所有更新都被允许。 这是因为首选条目不具有权威性,因此策略控制器不会验证这些条目。

http://www.ppmy.cn/news/687211.html

相关文章

远程计算机怎么安装软件安装,不需要U盘,手机电脑给电视远程安装软件的两种方法...

【天极网家电频道】如今在许多年轻家庭中,智能电视或网络机顶盒已经成为必备的家居用品。智能电视能安装第三方软件,拓展使用所有TV应用软件,弥补了电视系统自带应用有限的缺憾。而关于电视安装软件的方法上,多数是通过U盘安装&am…

允许使用计算机的软件,解决win10“你的电脑设置仅允许安装来自应用商店的应用”的方法...

windows系统一直致力于只让用户安装应用商店中提供的软件,这样安装的软件都是经过微软检测的,它们对于系统就不会产生危害。但是很多的软件在应用商店中都不能下载到,因此大家还是会选择使用别的软件或是浏览器进行下载。有不少用户在安装了w…

RT-Thread 5.0.1 qemu-virt64-aarch64 解决网络问题

参考文章 qemu 源码编译 qemu-system-aarch64 的方法 RT-Thread 5.0.1 qemu-virt64-aarch64 解决编译问题 前言 最近需要使用 RT-Thread qemu-virt64-aarch64,验证 aarch64 平台,也就是 ARM64 平台的一些网络功能,需要开启 qemu-virt64-aa…

Win10电脑下载软件有绑定软件怎么删除

电脑下载软件有绑定软件怎么删除?大家要知道删除一款软件最好的方法是卸载,而不是直接选中后删除,很多朋友下载安装软件都会不小心遇到捆绑软件,一瞬间电脑就安装了一大堆自己不需要的软件,该怎么把这些软件卸载掉呢&a…

emmx文件用什么软件打开电脑_fbx文件是什么_电脑fbx文件用什么软件打开

2018-12-28 10:36:29 运行win7系统电脑中发现fbx格式的文件,fbx文件有什么作用?该如何打开呢?fbx后缀名的文件主要用于三维设计软件之间进行模型、材质、动作和摄影机信息的互导的FilmBoX格式... 2015-03-02 16:42:19 有的用户在win7电脑系统…

华为笔记本软件商店_华为推出电脑版“应用市场”,免费无广告,再也不用担心垃圾软件...

目前主流电脑的系统分别是Windows和Mac OS两种。Mac OS有苹果的应用市场,下载软件非常安全,完全不用担心会有病毒或者捆绑软件。但是windows的应用商店就大不相同了,不仅找不到正确下载软件的地方,下载速度还非常慢,生…

新电脑基本软件安装推荐

很多朋友拿到新电脑,里面空空如也,我在计算机方面也算菜鸟级别,这里向大家介绍推荐一下我自己使用的一些基本软件,以下文章内容仅代表我个人观点,不喜勿喷,一款电脑日常使用来说,需要这几类软件:办公软件,通讯工具,输入法,浏览器,电脑安全,视频播放,音乐播放,解压刻录,图片查看…

麒麟软件商店使用错误码提示及应对方案

今日有小伙伴遇到软件商店0003的问题,前来咨询解决方案,问题解决后,特整理软件商店相关错误提示及其解决方案,希望能给大家带来帮助 以下为软件商店错误码与解决方法,请大家自行参考 ●错误码 #0001 问题分析&#xf…