Kubernetes基础(六)-常见 Kubernetes Pod 驱逐场景

Kubernetes Pod 被驱逐是什么意思?

它们被终止,通常是没有足够资源的结果。但是为什么会这样呢?

驱逐是指派给节点的Pod 被终止的过程。

Kubernetes 中最常见的情况之一是Preemption,为了在资源有限的节点中调度新的 Pod,需要终止另一个 Pod 以释放资源。

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

本文主要介绍一下几种驱逐场景

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

  • 抢占式驱逐

    • Pod 调度

    • Pod 优先级

    • 优先级示例

  • 节点压力驱逐

    • 服务质量等级

  • 其他类型的驱逐

    • API 发起的驱逐

    • 基于污点的驱逐

    • Node 级别排空(drain)

  • Prometheus 中的 Pod 驱逐监控

  • 结论

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

在 Kubernetes 中发生 Pod 驱逐的原因有多种。最重要的是:

  • 抢占

  • 节点压力驱逐

抢占式驱逐

抢占是这样一个过程:如果一个新的 Pod 需要被调度,但是没有任何合适的节点拥有足够的资源,那么 kube-scheduler 将通过驱逐终止一些优先级较低的 Pod 来检查新的 Pod 是否可以成为那个节点的一部分。

先了解一下 Kubernetes 调度是如何工作的。

Pod 调度

Kubernetes调度是将 Pod分配给节点的过程。默认情况下,有一个 Kubernetes 实体负责调度,称为kube-scheduler将在控制平面中运行。Pod 将以 Pending 状态启动,直到找到匹配的节点。将 Pod 分配给节点的过程遵循以下顺序:

  1. 过滤

  2. 计分

过滤

过滤步骤中, kube-scheduler将选择当前 Pod 可能放置的所有节点。此处将考虑 Taints 和 Tolerations 等功能。完成后,它将有一个适合该 Pod 的节点列表。

计分

评分 步骤中,kube-scheduler将获取上一步的结果列表并为每个节点分配一个分数。这样,候选节点从最适合到最不适合排序。如果两个节点的分数相同,kube-scheduler 会随机对它们进行排序。

但是,如果没有适合 Pod 运行的节点怎么办?

在这种情况下,Kubernetes 将启动抢占过程,尝试驱逐优先级较低的 Pod,以便分配新的 Pod。

Pod 优先级

在抢占过程中如何防止特定 Pod 被驱逐?

很有可能,一个特定的 Pod 对你来说很重要,永远不应该被终止。

这就是 Kubernetes 具有 Priority Classes 的原因。

优先级类是一个 Kubernetes 对象,它允许我们将数字优先级值映射到特定的 Pod。那些具有更高价值的 Pod 被归类为更重要并且不太可能被驱逐。

您可以使用以下方式查询当前的优先级:

$ kubectl get priorityclasses
$ kubectl get pcNAME                      VALUE        GLOBAL-DEFAULT   AGE
system-cluster-critical   2000000000   false            2d
system-node-critical      2000001000   false            2d

优先级示例

使用 Lovenstein 先生的 Berry Club 漫画做一个实际的例子:

https://www.mrlovenstein.com/ https://tapas.io/episode/220482

共有三个 Pod 分别代表蓝莓、树莓和草莓:

NAME         READY   STATUS             RESTARTS   AGE
blueberry    1/1     Running            0          4h41m
raspberry    1/1     Running            0          58m
strawberry   1/1     Running            0          5h22m

并且有两个优先等级:真莓和假莓。第一个将具有更高的值,表示更高的优先级。

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"
  • 蓝莓 将具有 trueberry 优先级(值 = 1000000)

  • 树莓和草莓都将具有 falseberry 优先级(值 = 5000)

这意味着在抢占的情况下,树莓和草莓更有可能被驱逐,为更高优先级的 Pod 腾出空间。

然后通过将此添加到 Pod 定义来将优先级类分配给 Pod:

priorityClassName: trueberry

现在让我们尝试再添加三种水果,但要稍加改动。所有新水果都将包含更高的优先级,称为trueberry

由于三个新水果有节点无法满足的内存或 CPU 要求,kubelet驱逐所有优先级低于新水果的 Pod。Blueberry 保持运行,因为它具有更高的优先级。

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          2s

这是最终结果:

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          3s

节点压力驱逐

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

如果节点中的资源(如CPU内存)消耗达到某个阈值kubelet将开始驱逐 Pod 以释放资源。将考虑服务质量 (QoS) 来确定驱逐顺序。

服务质量等级

在 Kubernetes 中,Pod 提供三个QoS 类之一,这将定义在缺乏资源的情况下它们被驱逐的可能性,从不太可能到更有可能:

  • Guaranteed 有保证的

  • Burstable 可爆发的

  • BestEffort 尽最大努力

这些 QoS 等级是如何分配给 Pod 的?这是基于对 CPU和内存的限制和请求。提醒一句:

  • Limits 限制:容器可以使用的最大资源量。

  • Requests 请求:容器运行所需的最小资源量。

有关限制和请求的更多信息,请查看通过示例了解 Kubernetes 限制和请求

https://sysdig.com/blog/kubernetes-limits-requests/

 

Guaranteed

如果满足以下条件,Pod 将分配有保证的 QoS 等级:

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

  • Pod 中的所有容器都具有相同的 CPU Limit 和 CPU Request 值。

  • Pod 中所有容器都具有相同的 memory Limit 和 memory Request 值

Guaranteed Pod 在正常情况下不会被驱逐。

Burstable

如果满足以下条件,Pod 将分配有可突发的 QoS 等级:

  • 它没有 Guaranteed QoS 等级。

  • 已为 Pod 中的容器设置了 Limits 或 Requests 。

Burstable Pod 可以被驱逐,但比下一个类别更不可能。

BestEffort

如果出现以下情况,Pod 将分配有 BestEffort 的 QoS 等级:

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

在发生节点压力过程的情况下,BestEffort Pod 被驱逐的可能性最大。

重要提示:Limits 和 Requests 中可能还有其他资源,如 ephemeral-storage,但它们不用于 QoS Class 计算。

如前所述,QoS 类将被考虑用于节点压力驱逐。这是内部发生的过程。kubelet 按照以下顺序对要驱逐的 Pod 进行排序:

  1. BestEffort 或 Burstable使用量超过 requests 的 Pod

  2. Burstable使用量低于 requests 的 Pod 或者 GuaranteedPod

Kubernetes 将优先从第 1 组中驱逐 Pod,然后才会尝试在第 2 组驱逐。

上面的一些要点:

  • 如果您在容器中添加非常低的请求,它们的 Pod 可能会被分配到组 1,这意味着它更有可能被驱逐。

  • 你无法判断哪个特定的 Pod 将被驱逐,只是 Kubernetes 会尝试在第 2 组之前驱逐第 1 组中的 Pod。

  • GuaranteedPod 通常不会被驱逐:kubelet不会为了安排其他 Pod 而驱逐它们。但是如果某些系统服务需要更多资源,kubelet 将在必要时终止Guaranteed Pod

其他类型的驱逐

本文重点介绍抢占和节点压力驱逐,但 Pod 也可以通过其他方式驱逐。例子包括:

API 发起的驱逐

可以使用 Kubernetes Eviction API 请求按需驱逐一个节点中的 Pod。

https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.25/#create-eviction-pod-v1-core

请记住,Eviction API 不同于 Delete Pod,前者是 CREATE 动作,请求会创建 pods/eviction 子资源,后者是 DELETE 动作请求

基于污点的驱逐

借助 Kubernetes Taints and Tolerations,您可以指导如何将 Pod 分配给节点。但是,如果您NoExecute对现有节点应用污点,所有不能容忍它的 Pod 将立即被驱逐。

node 级别排空(drain)

有时节点变得不可用或者不想再在这些节点上工作时。kubectl cordon命令会阻止在其上安排新的 Pod,运行kubectl drain nodename也可以一次完全清空所有当前节点上 Pod。节点中的所有 Pod 都将被驱逐,遵守其正常终止限期。

Prometheus 中的 Pod 驱逐监控

可以使用 Prometheus 通过执行以下操作轻松监控 Pod 驱逐:

kube_pod_status_reason{reason="Evicted"} > 0

 

这将显示集群中所有被驱逐的 Pod。您还可以将它与 kube_pod_status_phase{phase="Failed"}结合,以提醒那些在 Pod 出现故障后被驱逐的。

如果想深入挖掘,请查看以下有关在 Prometheus 中监控资源的文章:

  • 如何调整 Kubernetes 资源限制

https://sysdig.com/blog/kubernetes-resource-limits/

  • Kubernetes 容量规划:如何调整集群请求的大小

https://sysdig.com/blog/kubernetes-capacity-planning/

结论

抢占(preemption)期间,Kubernetes 将尝试通过驱逐优先级较低的 Pod 释放资源,来安排新的 Pod 。使用优先级类别(Priority Classes),可以控制哪些 Pod 在抢占时更有可能继续运行,因为它们被驱逐的可能性较小。

在执行期间,Kubernetes 将检查节点压力并在需要时驱逐 Pod。使用 QoS classes,可以控制在节点压力的情况下哪些 Pod 更有可能被驱逐。

内存和 CPU 是节点中的重要资源,您需要配置 Pod、容器和节点以使用适量的内存和 CPU。如果您合理地管理这些资源,不仅可以降低成本,还可以确保重要流程无论如何都能继续运行。

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

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

相关文章

微信小程序开发之会议oa(首页搭建)

前言: 上一篇我们掌握了关于小程序的框架,这篇博客带你完成小程序版的会议OA首页。效果如下: 一, 1.1先创建OA首页页面: 首先我们先建一个新项目,在app.json中编写代码 {"pages": ["pages/…

对称(镜像)二叉树

之前写的比较两棵树是否相等,是左子树和左子树比,右子树和右子树比——利用这个思想镜像二叉树就是从第二层的两个节点作为两棵树的根,然后比较,这里的比较是左子树和右子树比,右子树和左子树比 ——也就是利用比较两个…

告别手动调节!iOS 17让你全自动调节音量大小,那么如何实现个性化音量呢

多亏了iOS 17,你的AirPods Pro 2现在具有个性化音量功能,可以根据周围环境智能调整音频音量。 这很酷,任何喜欢尽可能降低音量以避免听力受损的人都会对此表示赞赏。使用个性化音量,你的iPhone将检测音量何时可以降低&#xff0c…

凉鞋的 Unity 笔记 108. 第二个通识:增删改查

在这一篇,我们来学习此教程的第二个通识,即:增删改查。 增删改查我们不只是一次接触到了。 在最先接触的场景层次窗口中,我们是对 GameObject 进行增删改查。 在 Project 文件窗口中,我们是对文件&文件夹进行增删…

Everything和SVN结合使用-在Everything中显示SVN

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&…

Vue之Vue的介绍安装开发实例生命周期钩子

博主心得: keyup必须与change一起使用v-on.click可以直接写成clickclick“setVal”里的setVal换成数字之后有惊喜VS Code是真的狗,一些报错根本不会直接显示总结:VS code太狗了 1.vue介绍 1.1 什么是vue vue是一个构建用户界面UI的渐进式jav…

linux 服务器类型Apache配置https访问

一:查看服务器类型,下载相应的SSL证书 命令:netstat -anp | grep :80 httpd是Apache超文本传输协议(HTTP)服务器的主程序,所以下载Apache证书 二:将证书解压后复制到服务器上 三个文件:xxx.key xxx_publ…

Spring Cloud Alibaba—Sentinel 控制台安装

1、Sentinel 控制台包含如下功能: 查看机器列表以及健康情况:收集 Sentinel 客户端发送的心跳包,用于判断机器是否在线。 监控 (单机和集群聚合):通过 Sentinel 客户端暴露的监控 API,定期拉取并且聚合应用监控信息,最…

行情分析——加密货币市场大盘走势(10.17)

大饼昨日在受到假消息美国证券交易委员会(SEC)通过大饼ETF后迅速上涨,一度上涨到30000,而很快回落到28000附近。从MACD日线来看,现在完全进入多头趋势,同时大饼再次进入蓝色上涨趋势线,目前按照…

node 通过axios发送post请求(FormData)

方案一: const axios require(axios) const FormData require(form-data) const fs require(fs)const sdUpscaleOnAzure async (req, res) > {const data new FormData()data.append(image, fs.readFileSync(/temp/ai/sd/download/1.png))let config {hea…

Py之trl:trl(一款采用强化学习训练Transformer语言模型和稳定扩散模型的全栈库)的简介、安装、使用方法之详细攻略

Py之trl:trl(一款采用强化学习训练Transformer语言模型和稳定扩散模型的全栈库)的简介、安装、使用方法之详细攻略 目录 trl的简介 1、亮点 2、PPO是如何工作的:PPO对语言模型微调三步骤,Rollout→Evaluation→Optimization trl的安装 t…

云汉芯城一站式电子制造平台启想智联顺利通过IATF16949:2016质量管理体系认证

近日,云汉芯城旗下一站式电子制造服务平台上海启想智能科技有限公司(以下简称“启想智联”)顺利通过IATF16949:2016质量管理体系认证,并获得由URS颁发的认证证书。通过此项认证,标志着启想智联在全球汽车行业的技术规范…

【Linux初阶】多线程3 | 线程同步,生产消费者模型(普通版、BlockingQueue版)

文章目录 ☀️一、线程同步🌻1.条件变量🌻2.同步概念与竞态条件🌻3.条件变量函数🌻4.条件变量使用规范🌻5.代码案例 ☀️二、生产者消费者模型🌻1.为何要使用生产者消费者模型🌻2.生产者消费者模…

【iOS】计算器仿写

文章目录 前言一、构建View界面二、Model中进行数据处理三、Controller层实现View与Model交互总结 前言 在前两周组内进行了计算器的仿写,计算器仿写主要用到了MVC框架的思想以及数据结构中用栈进行四则运算的思想,还有就是对OC中的字符串进行各种判错操…

C++stack和queue模拟实现以及deque的介绍

stack和queue介绍以及模拟实现 1.stack1.1stack的介绍1.2stack的使用 2.queue2.1queue的介绍2.2queue的使用 3.容器适配器3.1什么是适配器 4.stack模拟实现5.queue的模拟实现6.deque(双端队列) 1.stack 1.1stack的介绍 stack的文档介绍 stack是一种容…

Springboot整合WebSocket实现浏览器和服务器交互

Websocket定义 代码实现 引入maven依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>配置类 import org.springframework.context.annotation.Bean;i…

2023 编程资料合集汇总

资源合集 名称链接Rabbitmq精讲&#xff0c;项目驱动落地&#xff0c;分布式事务拔高资料https://www.aliyundrive.com/s/5VwmhTCPBNa程序员书籍大全https://www.aliyundrive.com/s/Kz5UiijQB7i后端Java教程&#xff08;学完直接去BAT&#xff09;https://www.aliyundrive.com…

机器学习笔记 - 3D 对象跟踪极简概述

一、简述 大多数对象跟踪应用程序都是 2D 的。但现实世界是 3D 的,无论您是跟踪汽车、人、直升机、导弹,还是进行增强现实,您都需要使用 3D。在 CVPR 2022(计算机视觉和模式识别)会议上,已经出现了大量3D目标检测论文。 二、什么是 3D 对象跟踪? 对象跟踪是指随着时间的…

【环境搭建】linux docker-compose安装seata1.6.1,使用nacos注册、db模式

新建目录&#xff0c;挂载用 mkdir -p /data/docker/seata/resources mkdir -p /data/docker/seata/logs 给权限 chmod -R 777 /data/docker/seata 先在/data/docker/seata目录编写一个使用file启动的docker-compose.yml文件&#xff08;seata包目录的script文件夹有&#…

项目管理软件排行榜:点赞榜TOP5揭晓!

通过项目管理软件企业可以快速、高效地管理项目、整合团队成员以及资源。现如今市场上各类项目管理软件层出不穷&#xff0c;因此选择一款适合自身企业需求的软件显得尤为重要。本文将为大家介绍项目管理软件排行榜点赞榜&#xff0c;为大家选购提供一些参考。 1.Zoho Project…