Kubernetes v1.35/v1.36 cgroup v2迁移指南
详解cgroup v1弃用、v2强制启用及Memory QoS等新特性
本文基于Kubernetes官方博客内容,梳理了从cgroup v1向v2迁移的关键技术要点。Kubernetes v1.31起cgroup v1进入维护模式,v1.35起默认强制使用cgroup v2。v1.36引入了基于cgroup v2的Memory QoS功能,提供分级内存保护。同时,cgroup v2支持更完善的OOM处理、rootless容器委托及PSI监控等特性。文章旨在帮助工程师理解迁移动机、掌握关键配置并平稳过渡。
技术要点
本次技术分享围绕Kubernetes对cgroup v2的支持与迁移展开,核心信息涉及多个关键版本与配置变更。
- cgroup v1的弃用与cgroup v2的强制:Kubernetes v1.31版本将cgroup v1管理支持移入维护模式。自Kubernetes v1.35版本起,
failCgroupV1配置项默认值为true,这意味着kubelet在cgroup v1节点上默认不会启动。管理员可临时在kubelet配置文件中设置failCgroupV1: false,但此选项将遵循Kubernetes的弃用政策被移除。 - kubeadm的严格检查:对于由kubeadm管理的集群,Kubernetes v1.35版本使
SystemVerification预检检查更为严格。当检测到cgroup v1且kubelet版本为v1.35或更高时,kubeadm init、kubeadm join和kubeadm upgrade命令将返回错误。 - Memory QoS功能的增强:Memory QoS在Kubernetes v1.22作为alpha功能引入,在v1.36版本中,它分离了内存限流与内存预留,并增加了分级内存保护。该功能仅在Linux节点使用cgroup v2时可用。通过启用
MemoryQoS特性门控并设置memoryReservationPolicy: TieredReservation,可以为Guaranteed Pod的内存请求提供memory.min硬保护,为Burstable Pod的内存请求提供memory.low软保护。 - 容器感知的OOM处理:在cgroup v2节点上,kubelet默认将
singleProcessOOMKill设置为false。这为每个容器cgroup设置memory.oom.group,确保OOM事件会终止容器内的所有进程,而不是单个进程。 - 其他关键特性:cgroup v2原生支持控制器委托,为rootless容器提供了基础。PSI(Pressure Stall Information)监控在支持cgroup v2的集群上默认启用,可通过kubelet的Summary API和metrics端点获取。此外,新的OCI运行时(如crun v1.23、runc v1.3.2)改进了从cgroup v1的
cpu.shares到cgroup v2的cpu.weight的转换逻辑。
原理与背景
Kubernetes使用cgroups来管理容器所需的CPU和内存等资源,确保应用间互不干扰。从cgroup v1向v2的迁移,主要基于以下设计动机和解决的问题:
- 统一与简化:cgroup v2提供了一个单一的、统一的层级结构,接口更加一致。这简化了资源管理的复杂性,为更现代的资源管理功能奠定了更坚实的基础。
- 解决cgroup v1的已知问题:在cgroup v1中,
active_file内存不被视为可回收内存。对于I/O密集型工作负载,大的页面缓存可能导致kubelet报告内存压力并驱逐Pod。虽然迁移到cgroup v2本身不改变这一计算方式,但cgroup v2提供了更清晰的内存控制模型。 - 增强资源隔离与保护:cgroup v2的内存控制器提供了更精细的控制。例如,
memory.high用于限流,memory.min和memory.low用于分级保护。这种保护模型在cgroup v1中无法实现,有助于更好地管理不同QoS级别Pod的内存资源。 - 改善进程管理与监控:cgroup v2的
memory.oom.group机制使得容器级别的OOM处理更加干净和可预测。同时,memory.events计数器为监控系统和用户空间OOM管理器提供了更丰富的观测点。PSI功能则能报告CPU、内存和I/O的争用情况,提升集群可观测性。 - 支持现代容器实践:cgroup v2官方支持控制器委托,这使得rootless容器能够更安全地将资源控制委托给非特权用户,符合容器安全最佳实践。
落地建议
为确保从cgroup v1到cgroup v2的平滑迁移,并充分利用新特性,建议采取以下通用做法:
- 评估与规划迁移:首先,检查集群中所有Linux节点的cgroup版本。如果集群版本低于v1.35,应计划将所有节点迁移到cgroup v2,然后再升级Kubernetes。如果已处于v1.35或更高版本,需确认所有节点均已使用cgroup v2,或已明确配置了
failCgroupV1: false的临时覆盖。 - 更新相关工具与软件:迁移过程中,需要更新直接读取cgroup文件系统的软件。建议将cAdvisor升级到v0.43.0或更高版本,并确保Java、Node.js及automaxprocs等工具版本兼容。
- 谨慎启用Alpha功能:对于Kubernetes v1.36中作为alpha功能的Memory QoS与分级内存保护,生产环境启用前必须进行充分测试。需注意,启用
TieredReservation会预留硬内存,需提前规划资源。 - 调整配置以适应新行为:如果需要在cgroup v2上模拟cgroup v1的单个进程OOM行为,可将kubelet配置中的
singleProcessOOMKill设置为true。对于I/O密集型容器,可考虑设置相等的内存请求和限制作为workaround。 - 关注运行时与内核版本:使用cgroup v2时,推荐使用Linux 5.9或更高内核。若使用较低内核并启用Memory QoS,kubelet会记录警告。同时,确保OCI运行时版本足够新,以支持改进的CPU权重转换。
- 利用新监控能力:充分利用cgroup v2带来的PSI监控等特性,通过kubelet暴露的指标和API,增强对集群资源争用情况的感知和调优能力。
技术分享更多资讯
布里吉斯游戏引擎更新:波次与技能机制重构
游戏开发者布里吉斯发布最新技术更新,重点重构了敌人波次生成逻辑与干员技能释放机制。此次更新涉及底层数据配置与快照保存系统的优化,为后续数据库更新及前端开发奠定基础。开发者透露将学习Unity引擎技术,并计划未来转向自研引擎,标志着项目从原型向工业化开发的重要转型。
Agent 上下文治理全景原则篇:构建目标导向的智能判断体系
本文聚焦 Agent 上下文治理的核心原则,从目标、依据、边界、记忆、探索及进展六个维度,深入剖析上下文机制如何辅助智能体围绕既定任务进行持续且精准的判断。通过明确各机制职责,旨在提升 Agent 在复杂环境下的任务执行效率与稳定性,为构建更可靠的 AI 系统提供理论框架与实践指导。
Python 3.13 引入 Queue.shutdown 解决异步退出难题
Python 3.13 正式引入 Queue.shutdown 方法,旨在解决异步消费者在收到停止信号后难以优雅退出的长期痛点。此前,开发者需手动处理取消信号,常导致部分已取出的任务处理中断或资源泄漏。新特性简化了异步队列的生命周期管理,提升了并发编程的可靠性与代码简洁性,对 Python 异步生态具有积极意义。
游戏团队管理进阶:从被动救火到主动规划
本文基于对游戏团队管理实践的深入思考,指出许多管理者陷入“解决问题”的时间陷阱。通过定期复盘日程,作者发现大量精力耗费在应对架构、需求及人员冲突等突发状况上。文章主张管理者应转变思维,从被动响应转向主动发现潜在问题,优化团队效能,避免陷入低效的救火循环,为游戏行业团队管理提供新的视角。