Kubernetes 1.27 加快 Pod 启动速度

news2024/11/13 12:15:59

如何在大型集群中加快节点上的 Pod 启动?这是企业集群管理员常常会面临的问题。

这篇博文重点介绍了从 kubelet 一侧加快 Pod 启动的方法。此方法不涉及通过 kube-apiserver 由 controller-manager 创建 Pod 所用的时间段,也不包含 Pod 的调度时间或在其上执行 Webhook 的时间。

本文从 kubelet 的角度考虑,提及了一些重要的影响因素,但并不会详尽罗列所有诱因。此外,Kubernetes v1.27 已正式发布,本文也强调了 v1.27 中有助于加快 Pod 启动的一些主要变更。

值得一提的是,https://kubernetes.io/blog/ 近期也将上线这篇博文的中英文版,下面一起来抢先了解精彩内容。

01

并行容器
镜像拉取

拉取镜像总是需要一些时间的,更糟的是镜像拉取默认是以串行方式作业的。换言之,kubelet 一次只会向镜像服务发送一个镜像拉取请求。其他的镜像拉取请求必须等到正在处理的拉取请求被完成才能进行。

要启用并行镜像拉取,请在 kubelet 配置中将 serializeImagePulls 字段设置为 false。当 serializeImagePulls 被禁用时,将立即向镜像服务发送镜像拉取请求,并可以并行拉取多个镜像。

1.1 设定并行镜像拉取最大值有助于防止节点因镜像拉取而过载

我们在 kubelet 中引入了一个新特性,可以在节点级别设置并行镜像拉取的限值。此限值限制了可以同时拉取的最大镜像数量。如果有个镜像拉取请求超过了这个限值, 该请求将被阻止,直到其中一个正在进行的镜像拉取完成为止。在启用此特性之前,请确保容器运行时的镜像服务可以有效处理并行镜像拉取。

要限制并行镜像拉取的数量,你可以在 kubelet 中配置 maxParallelImagePulls 字段。将 maxParallelImagePulls 的值设置为 n 后,并行拉取的镜像数将不能超过 n 个。超过此限值的任何其他镜像拉取请求都需要等到至少一个正在进行的拉取被完成为止。

你可以在关联的 KEP 中找到更多细节:Kubelet 并行镜像拉取数限值 (KEP-3673)。

02

提高 kubelet 
默认 API 每秒查询值

为了在节点上具有多个 Pod 的场景中加快 Pod 启动,特别是在突然扩缩的情况下, kubelet 需要同步 Pod 状态并准备 ConfigMap、Secret 或卷。这就需要大带宽访问 kube-apiserver。

在 v1.27 之前的版本中,kubeAPIQPS 的默认值为 5,kubeAPIBurst 的默认值为 10。然而在 v1.27 中,kubelet 为了提高 Pod 启动性能,将这些默认值分别提高到了 50 和 100。值得注意的是,提高 kubelet 的 API QPS 限值并不是唯一的原因。

1. 现在它有可能会被大幅限制(默认 QPS = 5)

2. 在大型集群中,它们仍然可能产生相当大的负载,因为数量很多

3. 有一个专用的 PriorityLevel 和 FlowSchema,这点我们可以轻松控制

以前在具有 50 个以上 Pod 的节点中,我们经常在 Pod 启动期间在 kubelet 上遇到 volume mount timeout。特别是在使用裸金属节点时,我们建议集群操作员将 kubeAPIQPS 提高到 20,kubeAPIBurst 提高到 40。

更多细节请参阅 KEP https://kep.k8s.io/1040 和 PR#116121。

03

事件驱动
的容器状态更新

在 v1.27 中,Evented PLEG (PLEG 是英文 Pod Lifecycle Event Generator 的缩写,表示 “Pod 生命周期事件生成器”) 进阶至 Beta 阶段。Kubernetes 为 kubelet 提供了两种方法来检测 Pod 的生命周期事件, 例如容器中最后一个进程关闭。在 Kubernetes v1.27 中,基于事件的 机制已进阶至 Beta, 但默认被禁用。如果你显式切换为基于事件的生命周期变更检测,则 kubelet 能够比依赖轮询的默认方法更快地启动 Pod。默认的轮询生命周期更改机制会增加明显的开销, 这会影响 kubelet 处理不同任务的并行能力,并导致性能和可靠性问题。出于这些原因,我们建议你将节点切换为使用基于事件的 Pod 生命周期变更检测。

更多细节请参阅 KEP https://kep.k8s.io/3386 和容器状态从轮询切换为基于 CRI 事件更新。

04

必要时提高
Pod 资源限值

在启动时,某些 Pod 可能会消耗大量的 CPU 或内存。如果 CPU 限值较低,则可能会显著降低 Pod 启动过程的速度。为了改善内存管理,Kubernetes v1.22 引入了一个名为 MemoryQoS 的特性门控。该特性使 kubelet 能够在容器、Pod 和 QoS 级别上设置内存 QoS,以便更好地保护和确保内存质量。尽管此特性门控有所好处,但如果 Pod 启动消耗大量内存,启用此特性门控可能会影响 Pod 的启动速度。

Kubelet 配置现在包括 memoryThrottlingFactor。该因子乘以内存限制或节点可分配内存, 可以设置 cgroupv2 memory.high 值来执行 MemoryQoS。减小该因子将为容器 cgroup 设置较低的上限,同时增加了回收压力。提高此因子将减少回收压力。默认值最初为 0.8,并将在 Kubernetes v1.27 中更改为 0.9。调整此参数可以减少此特性对 Pod 启动速度的潜在影响。

更多细节请参阅 KEP https://kep.k8s.io/2570。

05

更多说明

在 Kubernetes v1.26 中,新增了一个名为 pod_start_sli_duration_seconds 的直方图指标, 用于显示 Pod 启动延迟 SLI/SLO 详情。此外,kubelet 日志现在会展示更多与 Pod 启动相关的时间戳信息,如下所示:

Dec 30 15:33:13.375379 e2e-022435249c-674b9-minion-group-gdj4 kubelet[8362]: I1230 15:33:13.375359    8362
pod_startup_latency_tracker.go:102] "Observed pod startup duration" pod="kube-system/konnectivity-agent-gnc9k"
podStartSLOduration=-9.223372029479458e+09 pod.CreationTimestamp="2022-12-30 15:33:06 +0000 UTC"
firstStartedPulling="2022-12-30 15:33:09.258791695 +0000 UTC m=+13.029631711"
lastFinishedPulling="0001-01-01 00:00:00 +0000 UTC"
observedRunningTime="2022-12-30 15:33:13.375009262 +0000 UTC m=+17.145849275"
watchObservedRunningTime="2022-12-30 15:33:13.375317944 +0000 UTC m=+17.146157970"

SELinux 挂载选项重标记功能在 v1.27 中升至 Beta 版本。该特性通过挂载具有正确 SELinux 标签的卷来加快容器启动速度, 而不是递归地更改卷上的每个文件。更多细节请参阅 KEP https://kep.k8s.io/1710。

为了确定 Pod 启动缓慢的原因,分析指标和日志可能会有所帮助,如查看其他可能会影响 Pod 启动的因素包括容器运行时、磁盘速度、节点上的 CPU 和内存资源。

SIG Node 负责确保 Pod 快速启动,而解决大型集群中的问题则属于 SIG Scalability 的范畴。

 本文作者 

徐俊杰 Paco

「DaoCloud 道客」架构师/ AD 团队 Leader

Kubernetes Kubeadm「SIG Cluster-Lifecycle」和 SIG Node, Reviewer

 本文译者 

要海峰

现任「DaoCloud 道客」高级文档工程师

K8s-zh-owner,Istio maintainer,otel 等 member

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑最牛逼的截图方式

1.电脑桌面上空白的地方新建一个文本文档,将后缀名修改为bat,截图如下: 2.右键点击该文档编辑,在编辑界面输入start snippingtool,点击保存之后关闭该文档。 3.双击该文档,在模式里面选择响应的截图方式即可…

MySQL IDE与pymysql模块

一、IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 在此我们推荐使用Navicat软件或pycharm来连接数据库,这样就能更详细直观地查询数据 掌握: #1. 测试链接数据库 #2. 新建库 #3. 新建表,新增…

2023 年程序员高考试卷!你能答对几个?

又是一年高考季,一起来做做“程序员们的高考试卷”,压压惊吧~ 2023年普通高等学校招生全国统一考试 程序员的高考试卷(A卷) 考生类别:码农 1、程序员A:借我1000元吧。 程序员B:给你凑个整数…

Linux基础知识点2

Linux基础知识 适合有Linux基础的人群进行复习。 禁止转载! 文件管理与常用命令 Linux的文件的组成部分: 文件名、inode(i节点)和block(真正存数据的区域)。 查看某个文件的属性: ls -lh #可看到有类似”-rw-r--r--”的属性符号 …

轻松来自实力,亚马逊云科技助力边界智能应对业务高峰值数据考验

边界智能(Bianjie.AI)是2016年创立于上海的国家高新技术企业和专精特新企业,同时也是以香港为全球总部、服务全球的区块链技术创新团队。公司专注于区块链技术支持的下一代互联网应用服务,自主研发了跨多条联盟链的分布式应用服务…

STL入门 + 刷题(下)

👂 Raindrops (Intl. Version) - Katja Krasavice/Leony - 单曲 - 网易云音乐 👂 Rush E (Playable Version) - Sheet Music Boss - 单曲 - 网易云音乐 👂 最美的瞬间 - 真瑞 - 单曲 - 网易云音乐 👂 你可别卷了 - SipSu小口酥…

CTF Crypto --- orz!

文章目录 题目解题过程 题目 from Crypto.Util.number import * from gmpy2 import *flag bxxx t len(flag)//3 part1 bytes_to_long(flag[:t]) part2 bytes_to_long(flag[t:2*t]) part3 bytes_to_long(flag[2*t:]) q getPrime(1024) p next_prime(q) n p * qo getPr…

面试必备,29个Java面试必考点、1000多道Java面试题

马上金九银十招聘旺季就到了,不知道大家是否准备好了,面对金九银十的招聘旺季,如果没有精心准备那笔者认为那是对自己不负责任;就我们Java程序员来说,多数的公司总体上面试都是以自我介绍项目介绍项目细节/难点提问基础…

文献下载神器:文献党下载器使用方法

文献党下载器是一款文献资源整合平台,把知网、万方、维普、超星/读秀、Web of Science、Elsevier(ScienceDirect)、Wiley 、SpringerLink、EI(工程索引)、IEEE(电气电子工程师学会)、Taylor &am…

ESP32-C3系列模组简介

ESP32-C3是一款安全稳定、低功耗、低成本的物联网芯片,搭载RISC-V 32位单核处理器,为物联网产品提供行业领先的射频性能、完善的安全机制和丰富的内存资源。 嵌入式智能终端、无线WIFI技术以及Internet的广泛应用必将使家居控制变得更加自动化、智能化和…

基础软件加速自主创新,openGauss成就业务“新箭头”

不久前,想必业界都注意到了MetaERP横空出世的消息。作为企业经营的核心系统,MetaERP突破外部封锁,实现完全自研替代,是华为有史以来牵涉面较广、复杂性较高的项目。这其实是国产基础软件迅速崛起的一个缩影。 基础软件产业是关系…

element-plus vue 错误汇总

input 无法输入0.01 element ui input 无法输入0.01 一输出0.0就报错&#xff0c;是因为写成了v-model.number&#xff0c;改成v-model即可。 <el-input v-model.number"formData.reduceMoney"class"input200"type"number"focus"discou…

C#开发的OpenRA游戏之建造物品的窗口1

C#开发的OpenRA游戏之建造物品的窗口1 前面已经分析了基地工程车的创建和移动,当玩家把基地工程车移动到合适的位置,就会进行部署基地,也即是选择一个离矿场比较近的位置,因为这样做可以提高采矿的速度,减少采矿车的运输时间。 接着下来,虽然基地是建立了,但是还需要创…

HybridCLR 最佳实践,老项目集成热更(战棋项目)

文本介绍了老项目使用HybridCLR 集成热更的过程 从项目结构调整&#xff0c;代码调整&#xff0c;打包&#xff0c;热更测试&#xff0c;跑完HybridCLR所有流程 先看效果&#xff08;安卓&#xff09; 源码及资料领取方式私信&#xff1a;领取资料&#xff1a;HybridCLR战棋热更…

2023亚马逊云科技中国峰会引领无服务器架构新潮流:Serverlesspresso Workshop

序言 在今年3月&#xff0c;我有幸接触了一个项目&#xff0c;也因此结识了 亚马逊云科技无服务器架构 Serverless。在陆续了解 Amazon 产品的过程中&#xff0c;我逐渐发现它所带给我的惊喜远远超出了最初的预期。 今天&#xff0c;想向大家介绍一个名为 Serverlesspresso Wor…

京东数据分析:2023年Q1京东奶粉品牌销量排行榜

近几年我国新生人口数量不断下降。尽管国家大力推进多胎政策&#xff0c;但奶粉的市场需求量依然有明显下滑&#xff0c;导致国内奶粉行业的发展低迷&#xff0c;今年Q1依然没有回弹的迹象。 根据鲸参谋数据显示&#xff0c;今年Q1奶粉在京东平台销量2000万件&#xff0c;同比下…

自学网络安全(白帽黑客)必看!OWASP十大漏洞解析!

在学习网络安全之前&#xff0c;需要总体了解安全趋势和常见的Web漏洞&#xff0c;在这里我首推了解OWASP&#xff0c;因为它代表着业内Web安全漏洞的趋势&#xff1b; 目录 一、OWASP简介 OWASP Top 10: 2013版至2017版改变了哪些内容 二、OWASP Top 10 A1:注入漏洞 A2:…

【C语言】整,浮点型数据存储,大小端。细节拉满!!

目录 一. 整型 1. C语言内置整型家族 类型的意义&#xff1a; 2.整型在内存如何存储的呢&#xff1f; 3. 原码&#xff0c;反码&#xff0c; 补码 原码 反码 补码 4. 当 整型遇上unsigned 会发生什么呢&#xff1f; 1. unsigned 与 signed 解析 2. printf 输出 有无…

Kafka学习---1、Kafka 概述、Kafka快速入门

1、Kafka概述 1.1 定义 1、Kafka传统定义&#xff1a;Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue)&#xff0c;主要是应用于大数据实时处理领域。 2、发布/订阅&#xff1a;消息的发布者不会将信息直接发送给特定的订阅者&#xff0c;而是将发布的信息分…

【Linux 学习 ①】- Linux 环境搭建

目录 一、GouMai 云服务器 二、使用 Xshell 远程登录服务器 三、编写一个 C 程序 四、多用户共享同一个服务器 一、GouMai 云服务器 我们以腾讯云为例&#xff08;购买其他厂商的云服务器&#xff0c;例如&#xff1a;华为云、阿里云&#xff0c;其操作也是类似的&#…