温馨提示×

Ubuntu Swapper在Kubernetes中如何使用

小樊
49
2026-01-08 10:32:00
栏目: 智能运维

Ubuntu 节点启用 Swap 并在 Kubernetes 中使用

术语澄清

  • 在 Ubuntu 中,启用或管理虚拟内存的常用工具是系统命令 swapon/swapoff/etc/fstab 配置;并不存在名为 “Ubuntu Swapper” 的官方组件。Kubernetes 层面过去默认要求关闭 swap,但从 v1.22 起可通过 NodeSwap 特性门控配合 kubelet 参数在有 swap 的节点上运行。若使用较新版本并正确开启特性门控,可不必完全禁用 swap。

前置检查

  • 确认 Kubernetes 版本 ≥ 1.22,并在目标节点启用 NodeSwap 特性门控(kubelet 配置层面)。旧版本或未启用该特性时,kubelet 默认会因检测到 swap 而报错或拒绝工作。
  • 检查与准备 cgroup v2:新版 kubelet 对 swap 的支持与 cgroup v2 配合更完善。可先确认系统是否使用 cgroup v2(如检查挂载信息或 systemd 是否启用 unified cgroup 层次)。若仍在 cgroup v1,建议先完成 cgroup v2 的迁移与验证,再启用 swap。

在 Ubuntu 上启用并持久化 Swap

  • 创建并启用 swap 文件(示例为 2GB):
    • 创建文件:sudo dd if=/dev/zero of=/swap/swapfile bs=1M count=2048
    • 设置权限:sudo chmod 600 /swap/swapfile
    • 格式化为 swap:sudo mkswap /swap/swapfile
    • 启用 swap:sudo swapon /swap/swapfile
  • 持久化(避免重启后失效):编辑 /etc/fstab,添加
    • /swap/swapfile none swap sw 0 0
  • 验证:free -m 应能看到 Swap 容量与已用值。

在 Kubernetes 中允许使用 Swap

  • 方式一(命令行参数,适用于 kubeadm 管理的环境)
    • 编辑 kubelet 的环境文件(常见路径:/etc/default/kubelet/var/lib/kubelet/kubeadm-flags.env),在 KUBELET_EXTRA_ARGS 中加入:
      • –fail-swap-on=false
    • 重新加载并重启 kubelet:
      • sudo systemctl daemon-reload
      • sudo systemctl restart kubelet
    • 说明:该方式会绕过 kubelet 的“检测到 swap 即失败”的默认检查,使节点在有 swap 的情况下能够启动与工作。
  • 方式二(KubeletConfiguration,推荐用于较新版本)
    • 在 kubelet 的配置文件(如 /var/lib/kubelet/config.yaml 或通过 kubeadm 的 KubeletConfiguration)中显式设置:
      • failSwapOn: false
    • 同时确保 NodeSwap 特性门控处于启用状态,然后重启 kubelet 使配置生效。

内核参数与注意事项

  • 建议按需在节点上调整与内存相关的内核参数(示例值,请结合业务与压测谨慎设置):
    • 降低 swap 倾向:sudo sysctl -w vm.swappiness=10(默认通常为 60;值越低越倾向使用物理内存)
    • 允许内存过量使用(某些工作负载下可减少 OOM 触发概率):sudo sysctl -w vm.overcommit_memory=1
    • 不建议在关键生产环境开启 panic_on_oom(可能导致节点直接重启):sudo sysctl -w vm.panic_on_oom=0
  • 风险提示:启用 swap 可能带来 Pod 延迟上升、驱逐阈值判断变化、稳定性与可观测性下降 等问题。建议先在测试/非生产环境充分验证,并配合 资源请求/限制、QoS 与驱逐策略 共同治理。

0