草莓不是莓,西瓜才是莓——解读 Kubernetes 中被驱逐的 Pod

每天都有成千上万的 Pod 从节点中被驱逐。它们无家可归、困惑不已,不得不放弃之前的生活方式。其中一些甚至变成无节点状态。

在 Kubernetes 中 Pod 被驱逐意味着什么?我们常常能看到 Pod 因为资源不足被终止。但为什么会发生这种情况呢?

驱逐(Eviction) 是指终止已分配到某个节点的 Pod。Kubernetes 中最常见的情况是抢占,是指为了将新的 Pod 调度到资源有限的节点上,需要终止另一个 Pod 以释放资源。

此外,Kubernetes 会不断检查资源在必要时驱逐 Pod,这个过程称为节点压力驱逐。

Pod 被驱逐的原因:抢占和节点压力

Kubernetes 中 Pod 驱逐现象发生的最主要原因如下:

  • 抢占驱逐
  • 节点压力驱逐

抢占驱逐

抢占(Preemption) 是指如果需要调度一个新的 Pod,但没有合适的节点有足够的资源, kube-scheduler 就会检查是否可以通过驱逐(终止)一些优先级较低的 Pod,来确保新的 Pod 可以调度到该节点。

首先,我们来理解下 Kubernetes 调度的工作原理。

调度

Kubernetes 调度是指 Pod 被分配到节点的过程。

默认情况下,一个名为 kube-scheduler 的 Kubernetes 实体负责调度,它在控制面中运行。Pod 在找到合适的节点前会一直处于 Pending 状态。

将 Pod 分配到节点的过程包含过滤评分两个步骤:

过滤

在过滤步骤中,kube-scheduler 将选出所有适合放置当前 Pod 的节点。该步骤会考虑污点、容忍度等特性。过滤完成后,将会列出适合该 Pod 的节点列表。

评分

在评分步骤中,kube-scheduler 将使用上一步筛选出的候选节点列表,并为每个节点打分。这样就可以按照合适程度对候选节点进行排序。如果存在两个节点得分相同,kube-scheduler 会随机排序。

但是,如果没有合适的节点可以运行 Pod,该怎么办?这时,Kubernetes 就会开始抢占,试图驱逐优先级较低的 Pod,并将此节点分配给新 Pod。

优先级驱逐

但如何防止特定 Pod 在抢占过程中被驱逐?可能有一些重要的 Pod 不应被终止。

这正是 Kubernetes 提供优先级类的原因。

Pod 优先级是一种 Kubernetes 对象,允许我们将优先级值映射到特定的 Pod。系统会将更重视优先级较高的 Pod,该 Pod 被驱逐的可能性更低。

您可以使用以下命令查询当前 Pod 的优先级:

kubectl get priorityclasses
kubectl get pc
NAME                      VALUE        GLOBAL-DEFAULT   AGE
system-cluster-critical   2000000000   false            2d
system-node-critical      2000001000   false            2dCode language: Shell Session (shell)

Pod 优先级示例

这里我们用 Lovenstein 的 Berry Club 漫画做个演示:

以下三个 Pod 分别代表蓝莓、树莓和草莓:

NAME         READY   STATUS             RESTARTS   AGE
blueberry    1/1     Running            0          4h41m
raspberry    1/1     Running            0          58m
strawberry   1/1     Running            0          5h22m
Code language: JavaScript (javascript)

且存在两个优先级类:trueberry 和 falseberry。前者的值更高,表示更高的优先级。

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: trueberry
value: 1000000
globalDefault: false
description: "This fruit is a true berry"
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: falseberry
value: 5000
globalDefault: false
description: "This fruit is a false berry"Code language: Shell Session (shell)
  • 蓝莓被设置为 trueberry 优先级类(值为 1,000,000)
  • 树莓和草莓则被设置为 falseberry 优先级类(值为 5,000)

这意味着抢占发生时,树莓和草莓更可能被驱逐,给更高优先级的 Pod 腾出空间。

可在 Pod 定义中添加以下内容来分配优先级:

priorityClassName: trueberryCode language: Shell Session (shell)

现在我们尝试添加三个新水果,但有一个小的改动。新添加的水果都设置了 trueberry,具有更高优先级。

由于这三个新水果对内存或 CPU 的需求超出了节点的能力,kubelet 会驱逐所有优先级低于新水果的 Pod。由于蓝莓优先级更高,它仍保持运行状态。

NAME         READY   STATUS             RESTARTS   AGE
banana       0/1     ContainerCreating  0          2s
blueberry    1/1     Running            0          4h42m
raspberry    0/1     Terminating        0          59m
strawberry   0/1     Terminating        0          5h23m
tomato       0/1     ContainerCreating  0          2s
watermelon   0/1     ContainerCreating  0          2sCode language: Shell Session (shell)

这是最终的 Pod 运行结果:

NAME         READY   STATUS             RESTARTS   AGE
banana       1/1     Running            0          3s
blueberry    1/1     Running            0          4h43m
tomato       1/1     Running            0          3s
watermelon   1/1     Running            0          3sCode language: Shell Session (shell)

对于 Berry Club 来说,这真是艰难的时期…

节点压力驱逐

除了抢占外,Kubernetes 还会不断检查节点资源,如磁盘压力、CPU 或内存溢出(OOM)。

如果节点上的某种资源(如 CPU内存)的使用达到一定阈值kubelet 就会开始驱逐 Pod 以释放资源。系统也会根据服务质量(QoS)确定驱逐顺序。

服务质量类驱逐

在 Kubernetes 中,如果 Pod 被赋予了以下三种 QoS 之一,这意味着它们在资源短缺情况下被驱逐的可能性等级,以下按照被驱逐的可能性从低到高排序:

  • 保证型(Guaranteed)
  • 突发型(Burstable)
  • 尽力就好型(BestEffort)

如何将这些 QoS 分配给 Pod 取决于 CPU内存限制请求值

  • 限制值:容器可以使用的资源的最大量。
  • 请求值:容器运行所需的最小资源量。

保证型

如果满足以下条件,Pod 将被赋予保证型 QoS:

  • Pod 中的所有容器都设置了 CPU 和内存的限制和请求值。
  • Pod 中所有容器的 CPU 限制和 CPU 请求的值相同。
  • Pod 中所有容器的内存限制和内存请求的值相同。

在正常情况下,保证型 Pod 不会被驱逐。

突发型

如果满足以下条件,Pod 将被赋予突发型 QoS:

  • 不符合保证型 QoS。
  • Pod 中的某个容器设置了限制值或请求值。

突发型 Pod 可能会被驱逐,但相较于比尽力就好型,其被驱逐的可能性更低。

尽力就好型

如果满足以下条件,Pod 将被赋予尽力就好型 QoS:

  • Pod 中没有为任何容器设置限制值和请求值。

在节点压力发生时,尽力就好型 Pod 最有可能被驱逐。

重要提示:限制值和请求值中可能还有其他可用资源,如 ephemeral-storage,但它们不用于 QoS 类计算。

如前所述,QoS 类将被考虑用于节点压力驱逐。以下是内部发生的过程:

kubelet 按以下顺序对要驱逐的 Pod 进行排名:

  1. 尽力就好型 Pod 或使用量超过请求的突发型 Pod
  2. 使用量低于请求的突发型 Pod 或保证型 Pod

Kubernetes 将尝试先驱逐第 1 组中的 Pod,然后再驱逐第 2 组。

可以关注以下要点:

  • 如果您在容器中设置的请求值很低,容器的 Pod 很可能被分配到第 1 组,这意味着它们被驱逐的可能性更大。
  • 您无法确定哪个特定的 Pod 将被驱逐,只知道 Kubernetes 将尝试先驱逐符合第 1 组条件的 Pod,然后再驱逐第 2 组中的。
  • 保证型 Pod 通常不会被驱逐:kubelet 不会为了调度其他 Pod 而驱逐保证型 Pod。但如果某些系统服务需要更多资源,kubelet 将在必要时终止保证型 Pod,并始终给予最低优先级。

其他类型的驱逐

本节重点关注抢占和节点压力驱逐,但 Pod 也可能会以其他方式被驱逐。例如:

API 驱动的驱逐

您可以使用 Kubernetes 的驱逐 API 请求对某个节点上的 Pod 进行即时驱逐。

基于污点的驱逐

借助 Kubernetes 污点和容忍,您可以指定如何将 Pod 分配到节点。但是,如果您对一个现有节点应用了 NoExecute 污点,所有未设置容忍该污点 Pod 都将立即被驱逐。

节点排空

有时节点可能会无法使用,或者您不想再继续使用这些节点。kubectl cordon 命令可以防止新的 Pod 被调度到该节点,但您也可以一次性清空该节点上的所有当前 Pod。执行 kubectl drain nodename 后,该节点上的所有 Pod 都将被驱逐,并遵守其优雅终止期。

使用 Prometheus 监控Kubernetes Pod 驱逐监控

您可以在云解决方案中使用 Prometheus 轻松监控 Pod 驱逐情况:

kube_pod_status_reason{reason="Evicted"} > 0Code language: JavaScript (javascript)

执行这一命令后,将显示集群中所有被驱逐的 Pod。您还可以将其与 kube_pod_status_phase{phase="Failed"} 配对,可以在 Pod 因失败而被驱逐时收到告警。

总结

驱逐只是 Kubernetes 的一个功能,可让您控制有限的资源,即 Pod 将使用的节点资源。

抢占期间,Kubernetes 会尝试通过驱逐优先级较低的 Pod 来释放资源,以调度新的 Pod。您可以使用优先级类驱逐,控制哪些 Pod 在抢占后更有可能继续运行,因为设置特定优先级的 Pod 被驱逐的可能性更小。

在执行过程中,Kubernetes 也将检查节点压力,并在需要时驱逐 Pod。您也可以在节点压力情况下,使用 QoS 类驱逐,控制哪些 Pod 更可能被驱逐。

内存和 CPU 是节点中重要的资源,您需要给 Pod、容器和节点配置恰当的使用量。如果您相应地管理这些资源,不仅可以节省成本,还可以确保无论发生什么情况,重要的流程都能保持运行。

原文链接:
https://sysdig.com/blog/kubernetes-pod-evicted/

End

KubeBlocks 已发布 v0.8.0!KubeBlocks v0.8.0 推出了 Component API,让数据库引擎的组装变得更加简单。Addon 机制也有了重大改进,数据库引擎的 helm chart 从 KubeBlocks repo 中拆分出去,从此数据库引擎或者版本的变动已与 KubeBlocks 发版解绑。v0.8.0 还支持多版本的数据库引擎定义。Pika、ClickHouse、OceanBase、MySQL、PostgreSQL、Redis 等均有功能更新,快来试试看!

小猿姐诚邀各位体验 KubeBlocks,也欢迎您成为产品的使用者和项目的贡献者。跟我们一起构建云原生数据基础设施吧!

💻 官网: www.kubeblocks.io

🌟 GitHub: https://github.com/apecloud/kubeblocks

🚀 Get started: https://cn.kubeblocks.io/docs/preview/user-docs/try-out-on-playground/try-kubeblocks-on-local-host

关注小猿姐,一起学习更多云原生技术干货。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT API技术教程OpenAI APIKey在线对接-Chat Completion对象

表示模型根据提供的输入返回的聊天完成响应。 {"id": "chatcmpl-123","object": "chat.completion","created": 1677652288,"model": "gpt-3.5-turbo-0125","system_fingerprint": "fp…

ElementUI组件库,分页组件靠右显示

ElementUI组件库,分页组件靠右显示 分页组件 ,el-pagination组件默认靠左显示,靠右显示的话只需给layout添加一个“->”属性值即可, 看图

AMEYA360代理品牌江苏润石:RS8661/2/4系列高压精密低噪声运算放大器

继RS8651/2/4系列高压精密低噪声运算放大器成功推向市场,润石科技再次成功量产RS8661/2/4系列高压精密低噪声运算放大器。 RS8661/2/4系列产品将工作电压提升到最高36V(18V)、失调电压进一步优化到5μV、在工业现场数据采集、各种仪器仪表测量设备\分析设备上有着广…

IDEA services模块无法启动springboot服务(添加了springboot但是为空白)

https://blog.csdn.net/m0_54042402/article/details/117918995 https://blog.csdn.net/qq_46550964/article/details/122235235 Alt8 显示services模块 发现有springboot启动模块,点一下springboot之后,这个模块就消失了 会自动在.idea文件夹下的work…

选专业填志愿,家庭经济条件是必须考虑因素

对比过去,大部分家庭的物质条件已经好很多了,但也有一部分家庭条件较为困难,对于家庭条件较为困难的高考学生而言,高考志愿填报需要考虑的因素更多,因为自己就读的专业,绝对不能是自己的家庭无法负担的专业…

数值分析笔记(三)函数逼近

最佳平方逼近 函数逼近是使用一种简单易算的函数来近似表示一个复杂函数。 该问题可转化为求解线性方程组 G n C F n ​ G_{n}CF_{n}​ Gn​CFn​​ 其中,系数 C ( c 0 , c 1 , ⋯ , c n ) T , F n ( ( f , φ 0 ) , ( f , φ 1 ) , ⋯ , ( f , φ n ) ) T C(c…

Java网络编程之UDP通信与TCP通信交互代码实现

​import java.net.InetAddress; import java.io.IOException; class Main {public static void main(String[] args) {try { InetAddress localAddress InetAddress.getLocalHost(); //获得本地主机 InetAddress remoteAddress InetAddress.getByName("www.itcast.cn&qu…

非强化学习的对齐方法

在文章《LLM对齐“3H原则”》和《深入理解RLHF技术》中,我们介绍了大语言模型与人类对齐的“3H原则”,以及基于人类反馈的强化学习方法(RLHF),本文将继续介绍另外一种非强化学习的对齐方法:直接偏好优化&am…

【Java】解决Java报错:IllegalMonitorStateException in Synchronization

文章目录 引言一、IllegalMonitorStateException的定义与概述1. 什么是IllegalMonitorStateException?2. IllegalMonitorStateException的常见触发场景3. 示例代码 二、解决方案1. 确保在同步代码块或方法中调用wait()、notify()和notifyAll()2. 使用同步方法3. 使用…

鸿蒙开发系统基础能力:【@ohos.inputMethod (输入法框架)】

输入法框架 说明: 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import inputMethod from ohos.inputMethod;inputMethod8 常量值。 系统能力:以下各项对应的系统能力均为Sy…

NetSuite Account Merge 科目合并功能分析

最近项目中,客户有提到过能否将不用的Account与新建的Account进行合并,即我们所说的Merge功能~可以,但是该功能有使用的限制,比如最直接的一点需要注意,不同类型的Account是不可以使用Merge功能的&#xff…

Linux系统学习——指令三

Linux系统学习——指令三 Linux系统学习——指令三chmod — 文件执行权限添加文件执行权限去除文件执行权限 查找文件中特定关键字使用vi编辑文件并查找特定关键字文本文件查找特定关键字1: 使用 grep 命令2: 使用 find 命令3: 使用 awk 命令4: 使用 sed 命令5: 使用 ag 命令&a…

一文2000字记录基于jmeter+perfmon的稳定性测试

01、任务情况 1、任务总览 本次平台稳定性测试的目的在于:在服务器压力处于较饱和(达到80%系统最大TPS)压力之下,在较长时间(>8小时)之内观测服务器稳定性问题,以及资源使用情况和异常。 …

uniapp或安卓对接扫码枪

背景介绍 最近老板又随便丢过来一个扫码枪让我研究快速上线,我心想着又是什么串口通信吗,结果发现是usb的,我想着是不是有什么协议,结果直接插上电脑或者手机 均可在输入框直接输入,不用任何的代码编写 但结合了一下…

MFC案例:自制工具条(Toolbar)按钮的小程序

程序目标:在基于对话框的MFC项目中,自制三个 Toolbar 按钮(用颜色区分,分别为红、绿、蓝);程序运行时,单击红色按钮显示一个红色的填充椭圆;再单击绿色按钮则进行清屏;最…

基于AT89C52单片机的超声波测距设计—数码管显示

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/89456475?spm=1001.2014.3001.5503 C 源码+仿真图+毕业设计+实物制作步骤+10 在这里插入图片描述 题 目: 基于52的超声波测距汽车防撞系统 学生姓名 [姓名] 学 号 [学号…

力扣921. 使括号有效的最少添加

Problem: 921. 使括号有效的最少添加 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.定义int变量res、need分别记录需要插入的左括号数和所需与左括号配对的右括号数; 2.遍历字符串: 2.1.若当为左括号,则need,表示…

QT拖放事件之八:通过全局剪切板中的接口QClipboard::mimeData()来获取MIME类型数据

1、演示效果 首先向剪切板写入数据,然后点击paste按钮进行从全局剪切板中 获取 MIME数据。。。 2、核心代码 void Widget::on_pasteBtn_clicked() {const QClipboard* clipBoard = QGuiApplication::clipboard()

win10修改远程桌面端口,Windows 10下修改远程桌面端口及服务器关闭445端口的操作指南

Windows 10下修改远程桌面端口及服务器关闭445端口的操作指南 一、修改Windows 10远程桌面端口 在Windows 10系统中,远程桌面连接默认使用3389端口。为了安全起见,建议修改此端口以减少潜在的安全风险。以下是修改远程桌面端口的步骤: 1. 打…

qt 简单实验 一个可以向右侧拖拽缩放的矩形

1.概要 目的是设置一个可以拖拽缩放的矩形,这里仅用右侧的一个边模拟这个过程。就是为了抓住核心,这个便解决了,其他的边也是一样的。而这个更能体现原理。 2.代码 2.1 resizablerectangle.h #ifndef RESIZABLERECTANGLE_H #define RESIZ…