1.Swap介绍
Swap Space 是开辟在操作系统磁盘上的一块区域,此块区域可以是一个分区,也可以是一个文件,或者是他们的组合。基于其场景特性,也就是说:当操作系统物理内存不够用时,Linux 系统会将内存中不常访问的数据同步至 Swap 上,这样系统就有更多的物理内存为各个进程服务;反之,当操作系统需要访问 Swap 上存储的内容时,再将Swap 上的数据加载到内存中,这就是我们常说的 Swap Out 和 Swap In。
2. Kubernetes为何强制禁用Swap
Kubernetes的核心目标是将计算资源(CPU/内存)的调度和管理
精确化、自动化
。Swap的引入会破坏这一设计原则,具体原因如下:2.1 资源隔离与调度的精确性失效
Kubernetes调度器依赖节点的真实物理内存余量决定Pod的放置。当节点启用Swap后,Pod可能通过Swap“超售”内存,导致节点实际内存使用量超过物理上限,破坏资源隔离性。
例如:若节点内存为8GB,调度器可能因Swap的存在误认为剩余内存充足,继续调度新Pod,最终引发内存耗尽崩溃。
Swap 会干扰监控:当物理内存不足时,系统会将部分内存数据转移到 Swap 分区(磁盘空间),但kubelet无法感知 Swap 的使用量,导致它误判节点剩余内存充足,进而继续调度新 Pod,最终可能引发节点资源耗尽崩。
2.2 性能断崖式下降
- Swap 本质是磁盘空间,读写速度远低于物理内存(机械硬盘延迟约毫秒级 vs 内存纳秒级)。
- 容器应用对延迟敏感(如微服务),频繁 Swap 换页会导致 I/O 阻塞,造成服务响应延迟甚至超时故障。
2.3 稳定性机制被破坏
- Kubernetes设计了内存驱逐机制(如kubelet的eviction-hard参数):当内存不足时,按优先级自动驱逐低优先级Pod释放资源。
- 若开启Swap,系统会优先将数据换出到磁盘,抑制内存压力事件,导致驱逐机制失效。最终触发Linux OOM Killer无差别杀死进程(包括核心组件),造成集群雪崩。
3. 特殊场景的权衡
尽管生产环境必须禁用 Swap,但在特定场景需注意:
- 开发/测试环境:若物理内存严重不足(如个人电脑搭建集群),k8s可通过修改kubelet参数开启 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 不同。
4. 禁用 Swap 的操作方法
4.1 临时关闭 Swap
sudo swapoff -a # 关闭所有 Swap 分区
4.2 永久关闭 Swap
sudo sed -i '/ swap / s/^/#/' /etc/fstab # 注释 Swap 挂载项
4.3 验证结果
free -h # 查看 Swap 行显示为 0 swapon --show # 无输出表示已禁用
5. 总结建议
- 生产集群必须禁用 Swap:确保 K8s 资源调度、监控和驱逐机制正常运行,避免性能抖动和不可控崩溃;
- 学习环境可灵活处理:资源不足时临时开启 Swap,但需了解其副作用;
- 替代方案:优先通过
增加物理内存
或 优化应用资源请求
(如合理设置 Pod 的 requests/limits)解决内存不足问题。
这一切,似未曾拥有