期待已久:K8S终于迎来交换内存Beta支持!

关注【云原生百宝箱】公众号,获取更多云原生消息

图片

Kubernetes 1.22 版本开始支持在 Linux 节点上使用交换内存的 Alpha 特性,而在 1.28 版本中升级为 Beta 版本并进行了许多改进。之前版本的 Kubernetes 不支持 Linux 系统上的交换内存,但随着 Alpha 版本和后续的改进,Kubernetes 项目团队投入大量精力支持交换内存的 Beta 版本,使其更稳定、健壮和用户友好。 

此功能的使用方法包括激活 kubelet 上的 NodeSwap 特性门控,并配置 memorySwap.swapBehavior 选项来定义节点使用交换内存的方式。

1.22前不支持交换内存

在之前的版本中,Kubernetes 不支持在 Linux 上使用交换内存,因为涉及交换时很难提供保证和解释 pod 内存利用率。作为 Kubernetes 早期设计的一部分,交换支持被认为超出了范围,如果在节点上检测到交换,则默认情况下 kubelet 将无法启动

以下是一些关于 Kubernetes 1.22版本以前禁用内存交换的考虑:

  1. 1. 性能: 内存交换可能对容器的性能产生负面影响。当容器中的进程试图访问已经被交换出去的内存时,系统需要将其从磁盘交换回内存,这会导致性能下降。

  2. 2. 不确定性: 内存交换可能会引入不确定性。容器应该在其配置的内存限制范围内运行。如果发生了内存交换,容器的实际可用内存可能会受到不可控因素的影响,从而导致应用程序运行不稳定。

  3. 3. 资源保证: Kubernetes 在调度和管理容器时会依赖 cgroups 和 Linux 内核功能来确保资源隔离和限制。内存交换可能破坏了这种隔离性,使得 Kubernetes 对容器资源的管理变得更加困难。

  4. 4. 安全性考虑: 内存交换可能会使得敏感信息泄露到交换分区,这可能对安全性造成威胁。

然而,有许多需要使用交换内存的用例[1] 将受益于支持交换的 Kubernetes 节点,包括提高节点稳定性、更好地支持内存开销高但工作集较小的应用程序、内存受限设备的使用以及内存灵活性。

1.22开始支持交换内存

Kubernetes 1.22 版本为交换内存引入了一项 Alpha 支持[2], 用于为在 Linux 节点上运行的 Kubernetes 工作负载逐个节点地配置交换内存使用。现在,在 1.28 版中,对 Linux 节点上的交换内存的支持已升级为 Beta 版,并有许多新的改进。

在 1.22 版之前,Kubernetes 不提供对 Linux 系统上交换内存的支持。这是由于在涉及交换内存时保证和计算 Pod 内存利用率的固有困难。因此,交换内存支持被认为超出了 Kubernetes 的初始设计范围,并且如果在节点上检测到交换内存, kubelet 的默认行为是无法启动。

在 1.22 版中,Linux 的交换特性以 Alpha 阶段初次引入。这代表着一项重大进步,首次为 Linux 用户提供了尝试交换内存特性的机会。然而,作为 Alpha 版本,它尚未开发完成,并存在一些问题, 包括对 cgroup v2 支持的不足、指标和 API 统计摘要不足、测试不足等等。

Kubernetes 有许多交换内存用例[3], 并适用于大量用户。因此,Kubernetes 项目内的节点特别兴趣小组投入了大量精力来支持 Linux 节点上的交换内存特性的 Beta 版本。 与 Alpha 版本相比,启用交换内存后 kubelet 的运行更加稳定和健壮,更加用户友好,并且解决了许多已知缺陷。 这次升级到 Beta 版代表朝着实现在 Kubernetes 中完全支持交换内存的目标迈出了关键一步。

如何使用此特性?

通过激活 kubelet 上的 NodeSwap 特性门控,可以在已配置交换内存的节点上使用此特性。此外,你必须禁用 failSwapOn 设置,或者停用已被弃用的 --fail-swap-on 命令行标志。

可以配置 memorySwap.swapBehavior 选项来定义节点使用交换内存的方式。例如:

# 将此段内容放入 kubelet 配置文件
memorySwap:
  swapBehavior: UnlimitedSwap

swapBehavior 的可用配置选项有:

  • • UnlimitedSwap(默认):Kubernetes 工作负载可以根据请求使用尽可能多的交换内存,最多可达到系统限制。

  • • **LimitedSwap**:Kubernetes 工作负载对交换内存的使用受到限制。只有 BurstableQoS Pod [4] 才允许使用交换内存。

如果未指定 memorySwap 的配置并且启用了特性门控,则默认情况下, kubelet 将应用与 UnlimitedSwap 设置相同的行为。

请注意,仅 cgroup v2 支持 NodeSwap针对 Kubernetes v1.28,不再支持将交换内存与 cgroup v1 一起使用。

使用 kubeadm 安装支持交换内存的集群

开始之前

此演示需要安装 kubeadm 工具, 安装过程按照 kubeadm 安装指南[5]中描述的步骤进行操作。如果节点上已启用交换内存,则可以继续创建集群。如果未启用交换内存,请参阅提供的启用交换内存说明。

创建交换内存文件并开启交换内存功能

我将演示创建 4GiB 的未加密交换内存。

dd if=/dev/zero of=/swapfile bs=128M count=32
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
swapon -s # 仅在该节点被重新启动后启用该交换内存文件

要在引导时启动交换内存文件,请将诸如 /swapfile swap swap defaults 0 0 的内容添加到 /etc/fstab 文件中。

在 Kubernetes 集群中设置开启交换内存的节点

清晰起见,这里给出启用交换内存特性的集群的 kubeadm 配置文件示例 kubeadm-config.yaml

---
apiVersion: "kubeadm.k8s.io/v1beta3"
kind: InitConfiguration
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
failSwapOn: false
featureGates:
  NodeSwap: true
memorySwap:
  swapBehavior: LimitedSwap

接下来使用 kubeadm init --config kubeadm-config.yaml 创建单节点集群。 在初始化过程中,如果 kubelet failSwapOn 设置为 true,则会出现一条警告,告知节点上启用了交换内存特性。我们计划在未来的版本中删除此警告。

如何通过 LimitedSwap 确定交换内存限额?

交换内存的配置(包括其局限性)是一项挑战。不仅容易出现配置错误,而且作为系统级属性, 任何错误配置都可能危及整个节点而不仅仅是特定的工作负载。为了减轻这种风险并确保节点的健康,我们在交换内存的 Beta 版本中实现了对缺陷的自动配置。

使用 LimitedSwap,不属于 Burstable QoS 类别的 Pod(即 BestEffort/Guaranteed QoS Pod)被禁止使用交换内存。 BestEffort QoS Pod 表现出不可预测的内存消耗模式,并且缺乏有关其内存使用情况的信息, 因此很难完成交换内存的安全分配。相反,Guaranteed QoS Pod 通常用于根据工作负载的设置精确分配资源的应用, 其中的内存资源立即可用。为了维持上述安全和节点健康保证,当 LimitedSwap 生效时,这些 Pod 将不允许使用交换内存。

在详细计算交换内存限制之前,有必要定义以下术语:

  • • nodeTotalMemory:节点上可用的物理内存总量。

  • • totalPodsSwapAvailable:节点上可供 Pod 使用的交换内存总量(可以保留一些交换内存供系统使用)。

  • • containerMemoryRequest:容器的内存请求。

交换内存限制配置为:(containerMemoryRequest / nodeTotalMemory) × totalPodsSwapAvailable

换句话说,容器能够使用的交换内存量与其内存请求、节点的总物理内存以及节点上可供 Pod 使用的交换内存总量呈比例关系。

值得注意的是,对于 Burstable QoS Pod 中的容器,可以通过设置内存限制与内存请求相同来选择不使用交换内存。以这种方式配置的容器将无法访问交换内存。

此特性如何工作?

我们可以想象可以在节点上使用交换内存的多种可能方式。当节点上提供了交换内存并可用时, SIG 节点建议[6] kubelet 应该能够遵循如下的配置:

  • • 在交换内存特性被启用时能够启动。

  • • 默认情况下,kubelet 将指示容器运行时接口(CRI)不为 Kubernetes 工作负载分配交换内存。

节点上的交换内存配置通过 KubeletConfiguration 中的 memorySwap[7] 向集群管理员公开。作为集群管理员,你可以通过设置 memorySwap.swapBehavior 来指定存在交换内存时节点的行为。

kubelet使用 CRI(容器运行时接口)[8] API 来指示 CRI 配置特定的 cgroup v2 参数(例如 memory.swap.max), 配置方式要支持容器所期望的交换内存配置。接下来,CRI 负责将这些设置写入容器级的 cgroup。

如何对交换内存进行监控?

图片

Alpha 版本的一个显著缺陷是无法监控或检视交换内存的使用情况。这个问题已在 Kubernetes 1.28 引入的 Beta 版本中得到解决,该版本现在提供了通过多种不同方法监控交换内存使用情况的能力。

kubelet 的 Beta 版本现在支持收集节点级指标统计信息[9], 可以通过 /metrics/resource 和 /stats/summary kubelet HTTP 端点进行访问。这些信息使得客户端能够在使用 LimitedSwap 时直接访问 kubelet 来监控交换内存使用情况和剩余交换内存情况。此外,cadvisor 中还添加了 machine_swap_bytes 指标,以显示机器上总的物理交换内存容量。

注意事项

在系统上提供可用交换内存会降低可预测性。由于交换内存的性能比常规内存差, 有时差距甚至在多个数量级,因而可能会导致意外的性能下降。此外,交换内存会改变系统在内存压力下的行为。由于启用交换内存允许 Kubernetes 中的工作负载使用更大的内存量,而这一用量是无法预测的, 因此也会增加嘈杂邻居和非预期的装箱配置的风险,因为调度程序无法考虑交换内存使用情况。

图片

启用交换内存的节点的性能取决于底层物理存储。当使用交换内存时,与固态硬盘或 NVMe 等更较快的存储介质相比, 在每秒 I/O 操作数(IOPS)受限的环境(例如具有 I/O 限制的云虚拟机)中,性能会明显变差。

因此,我们不提倡针对有性能约束的工作负载或环境使用交换内存。此外,建议使用 LimitedSwap,因为这可以显著减轻给节点带来的风险。

集群管理员和开发人员应该在生产场景中使用交换内存之前对其节点和应用进行基准测试, 我们需要你的帮助[10]!

安全风险

在没有加密的系统上启用交换内存会带来安全风险,因为 关键信息(例如代表 Kubernetes Secret 的卷)可能会被交换到磁盘[11]。如果未经授权的个人访问磁盘,他们就有可能获得这些机密数据。为了减轻这种风险, Kubernetes 项目强烈建议你对交换内存空间进行加密。但是,处理加密交换内存不是 kubelet 的责任; 相反,它其实是操作系统配置通用问题,应在该级别解决。管理员有责任提供加密交换内存来减轻这种风险。

此外,如前所述,启用 LimitedSwap 模式时,用户可以选择通过设置内存限制与内存请求相同来完全禁止容器使用交换内存。这种设置会阻止相应的容器访问交换内存。

展望未来

Kubernetes 1.28 版本引入了对 Linux 节点上交换内存的 Beta 支持, 我们将继续为交换内存正式发布[12]而努力。我希望这将包括:

  • • 添加根据 kubelet 在主机上检测到的内容来设置系统预留交换内存量的功能。

  • • 添加对通过 cgroup 在 Pod 级别控制交换内存用量的支持。

    • • 这一点仍在讨论中。

  • • 收集测试用例的反馈。

    • • 我们将考虑引入新的交换内存配置模式,例如在节点层面为工作负载设置交换内存限制。

如进一步学习?

你可以查看当前交换内存文档[13]以了解如何在 Kubernetes 中使用交换内存。

如需了解更多信息,以及协助测试和提供反馈,请参阅 交换内存KEP-2400[14] 及其交换内存设计提案[15]。

参考

https://kubernetes.io/blog/2021/08/09/run-nodes-with-swap-alpha/

https://kubernetes.io/blog/2023/08/24/swap-linux-beta/

引用链接

[1] 需要使用交换内存的用例: https://github.com/kubernetes/enhancements/blob/9d127347773ad19894ca488ee04f1cd3af5774fc/keps/sig-node/2400-node-swap/README.md#user-stories
[2] Kubernetes 1.22 版本为交换内存引入了一项 Alpha 支持https://kubernetes.io/blog/2021/08/09/run-nodes-with-swap-alpha/
[3] 交换内存用例: https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/2400-node-swap/README.md#user-stories
[4] BurstableQoS Pod : https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/pod-qos/#burstable
[5] kubeadm 安装指南: https://kubernetes.io/zh-cn/docs/setup/product-environment/tools/kubeadm/create-cluster-kubeadm
[6] SIG 节点建议: https://github.com/kubernetes/enhancements/blob/9d127347773ad19894ca488ee04f1cd3af5774fc/keps/sig-node/2400-node-swap/README.md#proposal
[7] KubeletConfiguration 中的 memorySwaphttps://kubernetes.io/zh-cn/docs/reference/config-api/kubelet-config.v1
[8] CRI(容器运行时接口): https://kubernetes.io/zh-cn/docs/concepts/architecture/cri
[9] 节点级指标统计信息: https://kubernetes.io/zh-cn/docs/reference/instrumentation/node-metrics/
[10] 我们需要你的帮助: https://kubernetes.io/zh-cn/blog/2023/08/24/swap-linux-beta/#how-do-i-get-involved
[11] 关键信息(例如代表 Kubernetes Secret 的卷)可能会被交换到磁盘: https://kubernetes.io/zh-cn/docs/concepts/configuration/secret/#information-security-for-secrets
[12] 交换内存正式发布: https://kubernetes.io/zh-cn/docs/reference/command-line-tools-reference/feature-gates/#feature-stages
[13] 交换内存文档: https://kubernetes.io/zh-cn/docs/concepts/architecture/nodes/#swap-memory
[14] 交换内存KEP-2400: https://github.com/kubernetes/enhancements/issues/4128
[15] 交换内存设计提案: https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/2400-node-swap/README.md


推荐阅读

  • 叮,你收到一份来自CNCF的云原生景观简介

  • 要魔改Kubernetes,我们可以从哪里扩展

  • 问题排查太烦心,试试GPT的超能力

  • Copa:无需重建镜像,直接修补容器漏洞

  • 玩转K8s网络:16张图带你从小白到专家

  • 1000节点集群,5秒搭建好

  • 流量何处来又往何处去,这次一目了然

  • Kubernetes CNI 插件选型和应用场景探讨

  • 块/文件/对象存储难统一管理,试试这个集大成者

  • GPU越来越难买,如何提高利用率

  • 监控外部服务太复杂?ServiceMonitor 和 PrometheusRule有妙招

  • 容器快了,却不安全了,Rootless 安排上

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

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

相关文章

中伟视界:AI算法+巡检机器人——闸刀开关状态实时精准识别技术助力智慧电网建设

随着智慧电网建设的不断深入,电力设备的安全和稳定运行变得尤为重要。而闸刀开关作为电网系统中的重要组成部分,其状态的实时监测和识别对于确保电力系统的正常运行至关重要。为了解决传统人工巡检效率低、准确性差等问题,近年来,…

PHP基础 - 数组遍历与排序

介绍 在PHP中,数组遍历和排序是常见的操作,用于对数组中的元素进行访问和排序 数组遍历 1)数值数组的遍历 使用 foreach 循环遍历数组:foreach 循环是最常用的遍历数组的方法,它可以遍历索引数组和关联数组。例如:$fruits = array("apple", "banana&q…

Mysql dumpling 导入导出sql文件

一:导出命令 mysqldump -u root -p saishi > saishi.sql mysqldump -u root -p saishi > saishi.sql root是用户名 saishi是数据库名 saishi.sql导出文件名 二:选择导入的数据库 cd到安装mysql的文件下(找不到可以用:wh…

将数组的行列结构调整为m行、n列ndarray.reshape(m,n)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将数组的行列结构 调整为m行、n列 ndarray.reshape(m,n) 选择题 以下代码的输出结果为? import numpy as np arr np.array([[1,2,3],[4,5,6]]) print("【显示】arr\n"…

XML映射文件(第二种方式执行SQL语句)

第一种方式是注解的方式在下面: 注解操作SQL语句https://blog.csdn.net/m0_71149935/article/details/134908856?spm1001.2014.3001.5501 要想使用XML,需要遵守三项规范: XML映射文件的名称与Mapper接口名称一致,并且将XML映射…

深入学习Redis:从入门到实战

Redis快速入门 1.初识Redis1.1.认识NoSQL1.1.1.结构化与非结构化1.1.2.关联和非关联1.1.3.查询方式1.1.4.事务1.1.5.总结 1.2.认识Redis1.3.安装Redis1.3.1.依赖库1.3.2.上传安装包并解压1.3.3.启动1.3.4.默认启动1.3.5.指定配置启动1.3.6.开机自启 1.4.Redis桌面客户端1.4.1.R…

win11系统修改电脑ip方法

之前win10系统可以很简单的修改电脑ip,更新win11后老是报这个错误 子掩码无法修改填写 接下来三张图片教你修改电脑ip

前端开发转行做渗透测试容易吗?通过挖漏洞来赚钱靠谱吗?

最近,一个做运维的朋友在学渗透测试。他说,他公司请别人做渗透测试的费用是 2w/人天,一共2周。2周 10w 的收入,好香~ CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享 于是,我也对渗透测…

2023鸿蒙开发环境初体现验

开发环境 系统:mac os 13.2.1 (22D68) / Ventura IDE: DevEco Studio 3.1.1 Release 下载地址 注:安装好整个基础的开发环境,我的电脑磁盘空间又少了十几G!!! 环境配置 下载IDE,安装启动后&a…

PUB文件可在Microsoft Publisher中打开,但没有改软件也可以打开

打开.pub文件最简单的方法是使用创建该文件的Microsoft Publisher程序。如果你没有MS Publisher,还有其他几种方法可以打开.pub。 在没有Microsoft Publisher的情况下查看PUB文件的方法 如果你有Microsoft Publisher文档,但无法使用Publisher,则可以使用一些工具、查看器和…

FISCO BCOS(十五)总体环境部署

从零进行环境搭建,拜托环境报错烦恼,为您极大的节省学习成本。 前提:使用命令解决电脑内复制虚拟机不能粘贴问题 ​ //安装工具open-vm-toolssudo apt-get install open-vm-tools //安装工具open-vm-tools-desktopsudo apt-get install open-vm-tools-d…

.NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(测试篇)

WebAppDbTest 项目测试 测试工具 ltt介绍安装使用方式1、Drill2、Hammer3、Nailgun 测试主机规格配置CRUD 性能测试对比1、ltt 工具测试1.1、AddSingle 单条数据添加1.2、AddBulk 批量数据(1000)条添加1.3、GetSingle 单条数据查询1.4、GetAll 多条&…

【小白专用】使用PHP创建和操作MySQL数据库,数据表

php数据库操作 php连接mysql数据库 <?php $hostlocalhost; // 数据库主机名 $username"root"; // 数据库用户名 $password"al6"; // 数据库密码 $dbname"mysql"; // 数据库名 $connIDmysqli_connect($host,$username,$password,$dbn…

关于uview-ui的u-tabs标签滑块不居中的问题

在uniapp中&#xff0c;打开文件 uni_modules/uview-ui/components/u-tabs/u-tabs.vue 然后在style中添加以下代码即可 /deep/ .u-tabs__wrapper__nav__line {left: 18rpx; } 之前效果图&#xff1a; 之后效果图&#xff1a; 注意&#xff0c;代码中的18rpx需要自行调整

LeetCode力扣每日一题(Java):35、搜索插入位置

一、题目 二、解题思路 1、我的思路&#xff08;又称&#xff1a;论API的重要性&#xff09; 读完题目之后&#xff0c;我心想这题目怎么看着这么眼熟&#xff1f;好像我之前学过的一个API呀&#xff01; 于是我回去翻了翻我之前写的博客&#xff1a;小白备战蓝桥杯&#xf…

女士内衣市场分析:预计2028年将达到643.08亿美元

内衣 (英文名:Underwear)&#xff0c;是指贴身穿的衣物。内衣有保暖及污秽的危害作用&#xff0c;有时会被视为性征。女士内衣行业生产的主要原料是各类织布或无纺布&#xff0c;成分有海绵、边、定型纱、骨胶、肩带等&#xff0c;布面料在内衣企业的生产成本中所占比重较大。女…

用FPGA实现四通道、全频率 GNSS RF 接收器-用于卫星的精确定位

用FPGA实现四通道、全频率 GNSS RF 接收器-用于卫星的精确定位 概念 全球导航卫星系统&#xff08;英文&#xff1a;Global Navigation Satellite System&#xff0c;GNSS &#xff09;&#xff0c;又称全球卫星导航系统&#xff0c;是能在地球表面或近地空间的任何地点为用户提…

文件误删危机!同事操作失误,老板情急之下该如何处理?

近期&#xff0c;一则企业员工误删数据事件引发热议。 &#xff08;截图源自网络&#xff09; 起因是某公司员工被公司辞退后&#xff0c;已经做完交接就离开了公司。而3天后&#xff0c;新来的员工不小心把这位同事原本办公电脑里的资料给删除了&#xff0c;且由于没有进行数…

IMU用于汽车前照灯调平

研究者进行了以创新车辆中的自动前照灯调平的实验&#xff0c;这是夜间驾驶安全的关键功能。这项科学探索围绕着使用低成本的MEMS IMU&#xff08;微机电系统惯性测量单元&#xff09;来估计道路和车辆前照灯之间的俯仰角&#xff0c;确保最佳的前照灯光束调节并减少迎面而来的…

Redis探秘:AOF日志与数据持久性之旅

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;咱们今天来聊聊Redis。你知道吗&#xff0c;Redis作为一个超高效的内存数据库&#xff0c;真的是超级给力。它可以秒速处理数据&#xff0c;让咱们的应用运行得飞快。但是&#xff0c;小黑得告诉你&#xff0c;虽…