Kubernetes v1.37 将 Memory QoS 升级为 Beta 并默认启用,适用于 cgroup v2 的 Linux 节点。默认不写入 memory.high/min/low,避免升级改变行为;memoryThrottlingFactor 默认改为 null。用户可显式配置限流与分层预留。该功能由 SIG Node 推动,下一步将迈向 GA。
SLUB是Linux内核中的对象缓存分配器,优化了内存分配效率,支持几乎无锁分配。它通过per-CPU freelist实现,支持KASAN和SLUB_DEBUG进行内存错误检测,并与cgroup v2兼容,允许限制内核内存使用。
Kubernetes v1.36更新了内存QoS功能,采用cgroup v2内存控制器,提供内存预留、分层保护和可观察性指标。Guaranteed Pods使用memory.min进行硬保护,Burstable Pods使用memory.low进行软保护。新版本允许在节点有足够余量时选择性启用内存预留,提升了内存管理的灵活性和效率。
本文介绍Linux cgroup v2的核心概念:统一层级树结构、资源控制器(cpu.weight/max、memory.max/high、io.weight/max等)、PSI压力指标,以及与systemd的整合方式。还涵盖delegation机制、常见使用姿势、诊断方法、v1迁移注意事项和典型bug,强调PSI是资源压力的权威指标。
Kubernetes改进了cgroup v1到cgroup v2的CPU权重公式,解决了CPU优先级分配问题,提升了优先级和粒度,使请求1 CPU的容器获得接近默认值的权重,改善资源分配。此变更需OCI运行时支持,建议在非生产环境中测试。
Kubernetes v1.35即将发布,计划移除cgroup v1支持和kube-proxy的ipvs模式,推荐使用cgroup v2和nftables。新特性包括节点声明、Pod资源在线更新、Pod证书、数值污点和用户命名空间,旨在提升集群的稳定性和安全性。
cgroup v2 是 cgroup v1 的升级版,提供更统一的资源管理和隔离。Kubernetes 默认支持 cgroup v2,但实际使用依赖于宿主机内核。Ubuntu 20 默认使用 cgroup v1,而 Ubuntu 22 则使用 cgroup v2。升级 cgroup 版本需在内核 5.4 及以上进行配置。
CentOS社区停止支持后,选择AlmaLinux作为替代方案,介绍了从CentOS迁移Kubernetes集群节点到AlmaLinux的最佳实践,包括移除dockershim和利用cgroup v2进行节点资源管理。cgroup v2提供更强大、动态和增强的资源分配管理,具有更好的可维护性、兼容性和性能。迁移过程中的问题已解决,计划逐步推广采用基于Cgroup V2的机器。
Kubernetes 1.31将cgroup v1支持转入维护模式,以适应cgroup v2的发展。cgroup是Linux内核的功能,用于管理系统资源分配和优先级。Kubernetes在Linux节点上使用cgroup来管理容器的资源消耗。cgroup v2提供了更统一和一致的接口,以及更好的资源控制功能。Kubernetes将更全面地采用cgroup v2,但需要小心处理以避免中断现有工作负载。维护模式不意味着废弃,cgroup v1将继续接收关键安全修复和重大错误修复。用户应计划过渡到cgroup v2。
在Docker容器内使用cgroup v2需以`--privileged --cgroupns=host`启动。作者用Docker跑模糊测试时,容器内存超限会触发OOM杀死整个容器,包括自动恢复守护进程。为让OOM只杀模糊器,需直接管理cgroup,但默认命名空间限制操作;加上`--cgroupns=host`后即可控制宿主机cgroup,保护守护进程。
在Docker容器内管理cgroup v2需用`--privileged --cgroupns=host`启动,否则无法修改cgroup.procs。作者在AWS实例上用Docker做模糊测试,因内存超限导致OOM杀死整个容器及恢复守护进程。通过该配置获得主机cgroup控制权,将OOM影响隔离到模糊测试器,保护守护进程,维持实验弹性。
本文介绍了在Docker容器中使用cgroup v2的方法,解决了内存使用超过限制导致容器终止的问题。通过添加--privileged和--cgroupns=host参数,作者成功控制了容器内的cgroups,保护了关键的自动恢复守护程序。这种设置对于维持模糊测试实验的弹性和效率非常重要。
完成下面两步后,将自动完成登录并继续当前操作。