1. Kubernetes为何强制禁用Swap?核心设计逻辑​

Kubernetes的核心目标是将计算资源(CPU/内存)的调度和管理​​精确化、自动化​​。Swap的引入会破坏这一设计原则,具体原因如下:

​​1.1 资源隔离与调度的精确性失效​​

  • Kubernetes调度器依赖节点的​​真实物理内存余量​​决定Pod的放置。当节点启用Swap后,Pod可能通过Swap“超售”内存,导致节点实际内存使用量超过物理上限,破坏资源隔离性。例如:若节点内存为8GB,调度器可能因Swap的存在误认为剩余内存充足,继续调度新Pod,最终引发内存耗尽崩溃。
  • ​​Swap 会干扰监控​​:当物理内存不足时,系统会将部分内存数据转移到 Swap 分区(磁盘空间),但 kubelet ​​无法感知 Swap 的使用量​​,导致它误判节点剩余内存充足,进而继续调度新 Pod,最终可能引发节点资源耗尽崩。

1.2 性能断崖式下降​​

  • Swap 本质是磁盘空间,读写速度远低于物理内存(机械硬盘延迟约毫秒级 vs 内存纳秒级)。
  • 容器应用对延迟敏感(如微服务),频繁 Swap 换页会导致 I/O 阻塞,造成服务响应延迟甚至超时故障。

1.3 ​​稳定性机制被破坏​​

  • Kubernetes设计了​​内存驱逐机制​​(如kubelet的eviction-hard参数):当内存不足时,按优先级自动驱逐低优先级Pod释放资源。
  • 若开启Swap,系统会优先将数据换出到磁盘,​​抑制内存压力事件​​,导致驱逐机制失效。最终触发Linux OOM Killer​​无差别杀死进程​​(包括核心组件),造成集群雪崩。

2. 特殊场景的权衡​​

尽管生产环境必须禁用 Swap,但在特定场景需注意:

  • ​​开发/测试环境​​:若物理内存严重不足(如个人电脑搭建集群),可临时开启 Swap 避免崩溃,但需承担性能风险;

    • kubelet参数:--fail-swap-on=false(k8s 1.22+,截至2025年7月节点Swap内存支持功能已从Alpha升级至Beta阶段​​,但默认仍处于关闭状态,需手动启用)
    • 参数解释:Makes the Kubelet fail to start if swap is enabled on the node。如果为true(默认值)就要求必须要关闭swap,false是表示宿主开启了swap,kubelet也是可以成功启动,但是pod是允许使用swap了,这部分代码因为经常出问题,所以直接swap在宿主上禁用会比较好。
  • ​​非容器化应用​​:传统虚拟机或物理服务器可保留 Swap,因其资源管理机制与 K8s 不同。

3. 禁用 Swap 的操作方法​

3.1 ​​临时关闭 Swap​​

sudo swapoff -a           # 关闭所有 Swap 分区

3.2 ​​永久关闭 Swap​​

sudo sed -i '/ swap / s/^/#/' /etc/fstab  # 注释 Swap 挂载项

3.3 ​​验证结果

free -h                   # 查看 Swap 行显示为 0
swapon --show # 无输出表示已禁用

4. 总结建议

  • 生产集群必须禁用 Swap​​:确保 K8s 资源调度、监控和驱逐机制正常运行,避免性能抖动和不可控崩溃;
  • ​​学习环境可灵活处理​​:资源不足时临时开启 Swap,但需了解其副作用;
  • ​​替代方案​​:优先通过 ​​增加物理内存​​ 或 ​​优化应用资源请求​​(如合理设置 Pod 的 requests/limits)解决内存不足问题。

Kubernetes禁用Swap的深度解析:资源控制、性能与稳定性的基石的更多相关文章

  1. kubernetes之configmap,深度解析mountPath,subPath,key,path的关系和作用

    参考:https://www.cnblogs.com/breezey/p/6582082.html 我们知道,在几乎所有的应用开发中,都会涉及到配置文件的变更,比如说在web的程序中,需要连接数据库, ...

  2. Kafka深度解析

    本文转发自Jason’s Blog,原文链接 http://www.jasongj.com/2015/01/02/Kafka深度解析 背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅 ...

  3. SpringMVC 源码深度解析<context:component-scan>(扫描和注冊的注解Bean)

    我们在SpringMVC开发项目中,有的用注解和XML配置Bean,这两种都各有自己的优势,数据源配置比較经经常使用XML配置.控制层依赖的service比較经经常使用注解等(在部署时比較不会改变的) ...

  4. mybatis 3.x源码深度解析与最佳实践(最完整原创)

    mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...

  5. Spring源码学习-容器BeanFactory(一) BeanDefinition的创建-解析资源文件

    写在前面 从大四实习至今已一年有余,作为一个程序员,一直没有用心去记录自己工作中遇到的问题,甚是惭愧,打算从今日起开始养成写博客的习惯.作为一名java开发人员,Spring是永远绕不过的话题,它的设 ...

  6. Kafka深度解析(如何在producer中指定partition)(转)

    原文链接:Kafka深度解析 背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅的消息系统.主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能 ...

  7. 杂项-分布式-EDAS:深度解析阿里云EDAS服务

    ylbtech-杂项-分布式-EDAS:深度解析阿里云EDAS服务 1.返回顶部 1. 深度解析阿里云EDAS服务 弹性伸缩 摘要: 第一种只适用于业务较少的情况,而在新业务不断增加的情况下,增加新应 ...

  8. 《SEO深度解析——全面挖掘搜索引擎优化的核心秘密》

    <SEO深度解析——全面挖掘搜索引擎优化的核心秘密> 基本信息 作者: 痞子瑞 出版社:电子工业出版社 ISBN:9787121224041 上架时间:2014-2-28 出版日期:201 ...

  9. spring源码深度解析— IOC 之 默认标签解析(下)

    在spring源码深度解析— IOC 之 默认标签解析(上)中我们已经完成了从xml配置文件到BeanDefinition的转换,转换后的实例是GenericBeanDefinition的实例.本文主 ...

  10. Flink 源码解析 —— 深度解析 Flink 是如何管理好内存的?

    前言 如今,许多用于分析大型数据集的开源系统都是用 Java 或者是基于 JVM 的编程语言实现的.最着名的例子是 Apache Hadoop,还有较新的框架,如 Apache Spark.Apach ...

随机推荐

  1. C#之MethodImpl(MethodImplOptions.Synchronized)

    [MethodImpl(MethodImplOptions.Synchronized)] 是 C# 中用于指定方法同步的一个特性,它控制方法的执行方式,确保在多线程环境下某个方法的执行是线程安全的.它 ...

  2. eclipse界面混乱还原方法

    WindowPerspectiveReset Perspective

  3. AD 侦查-AS-REP 烘烤攻击

    本文通过 Google 翻译 AD Recon – AS-REP Roasting Attacks 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充. 导航 0 前言 1 ...

  4. STM32在使用Clion平台开发时调试失败 SystemClock_Config 返回 HAL_ERROR

    问题记录 在尝试使用Clion在STM32平台上开发调试时,需要通过OpenOCD结合ST-Link等调试器进行烧录和调试.但通过STM32CubeMX生成代码后,发现出现以下现象: 程序能够正常编译 ...

  5. 2024杭电钉耙1-1003 HDOJ7435 树

    本文同步发布于我的网站 Problem 给一棵根为 1 的有根树,点 \(i\) 具有一个权值 \(A_i\) . 定义一个点对的值 \(f(u, v)=\max \left(A_u, A_v\rig ...

  6. 双 CDN 加速 + 智能调度

    转载自我的个人博客:双 CDN 加速 + 智能调度 |未名小站 DeepSeek 的官网是一个很典型的双 CDN 加速的场景,当我们使用 IT-Dog 对其发起多地 Ping 的时候,可以看到国内使用 ...

  7. JavaWeb 中的 HTTP 基础知识

    概念:超文本传输协议,规定了浏览器和服务器之间数据传输的规则. 特点: 基于TCP协议,面向连接,更安全 基于请求-响应模型,一次请求对应一次响应 是无状态的协议,对事务处理没有记忆能力.每次请求-响 ...

  8. 【ZooKeeper面试题】从基础到深入

    ZooKeeper面试题:从基础到深入 基础概念 什么是ZooKeeper?它的主要用途是什么? ZooKeeper是一个分布式的.开源的协调服务,用于分布式应用程序 主要用途:配置管理.命名服务.分 ...

  9. 鸿蒙Next仓颉语言开发实战教程:订单列表

    大家上午好,最近不断有友友反馈仓颉语言和ArkTs很像,所以要注意不要混淆.今天要分享的是仓颉语言开发商城应用的订单列表页. 首先来分析一下这个页面,它分为三大部分,分别是导航栏.订单类型和订单列表部 ...

  10. Visual Studio 2022 中的 EF Core 反向工程和模型可视化扩展插件

    前言 在 EF 6 及其之前的版本数据库优先模式(Database First)是可以在 Visual Studio 中通过可视化界面来操作完成的,但是到了 EF Core 之后就不再支持了(因为模型 ...