0

0

K3s kube-apiserver 内存持续上涨不释放的几种已知 bug 与缓解

冰川箭仙

冰川箭仙

发布时间:2026-01-17 22:13:02

|

844人浏览过

|

来源于php中文网

原创

K3s 中 kube-apiserver 内存持续上涨主因是旧版 Kubernetes 缺失流式 List 响应、pprof 未启用致诊断困难、Watch 缓存与 informer 泄漏,以及 SQLite 后端高写入时内存暂留。

k3s kube-apiserver 内存持续上涨不释放的几种已知 bug 与缓解

K3s 中的 kube-apiserver 内存持续上涨且不释放,不是典型的配置错误,而是与轻量级设计、组件集成方式及上游 Kubernetes 已知问题交织导致的典型现象。尤其在长期运行、资源受限的边缘或嵌入式场景中,该问题更易暴露。核心原因集中在内存无法及时回收、流式响应未启用、pprof 未开启导致诊断困难,以及部分版本存在已知泄漏点。

流式 List 响应未启用(v1.33+ 才默认支持)

Kubernetes v1.33 之前,kube-apiserver 对 List 请求(如 kubectl get pods -A)采用全量序列化:把所有对象一次性加载进内存、拼成大 JSON 块再发送。即使客户端只拉取几百个 Pod,若其中含大量 annotation 或 event,单次响应可能超数 MB。这部分内存不会随响应结束立即释放,而是滞留在 Go runtime 的堆中,等待 GC 触发——但 GC 在高负载下可能延迟或效率下降,造成“内存只涨不跌”的假象。

  • K3s 默认使用较旧的 Kubernetes 版本(如 v1.28–v1.31),尚未集成流式编码
  • 缓解方法:避免高频执行宽泛 List 操作;用 label selector 限定范围,例如 kubectl get pods -n default -l app=nginx
  • 升级到 K3s v1.33+(需确认对应 Kubernetes 版本 ≥ v1.33)可原生启用流式响应,逐 item 编码并释放内存

pprof 未启用 + heap 分析缺失

K3s 默认关闭了 kube-apiserver 的 profiling 接口(/debug/pprof/heap),导致无法导出内存快照定位具体泄漏对象(如堆积的 watch cache、未清理的 admission audit buffer、重复注册的 informer)。没有 heap 文件,就只能靠猜测——比如误以为是 etcd 或 client-go 导致,实则可能是某个自定义 webhook 的缓存未限容。

算家云
算家云

高效、便捷的人工智能算力服务平台

下载
  • 手动开启方法:编辑 /var/lib/rancher/k3s/server/manifests/kube-apiserver.yaml(或通过 k3s server --kube-apiserver-arg=profiling=true 启动)
  • 验证是否生效:curl -s http://localhost:6443/debug/pprof/heap | head -n 5 应返回 profile 数据
  • 配合 go tool pprof 分析 top allocs/inuse_space,常能发现 runtime.mallocgc 下挂载的异常结构体(如 cache.ListerWatcheradmission.Plugin 实例)

Watch 缓存与 informer 泄漏(常见于多租户或 CRD 频繁变更)

K3s 将 controller-manager、scheduler 等集成进单进程,但 kube-apiserver 仍需维护 watch cache 和 internal informer。当集群中存在大量 CRD、频繁 apply 自定义资源、或第三方 operator 频繁重建 informer(未复用 shared informer factory),会导致 watch 缓存条目堆积,且部分版本中 cache key 未正确失效,引发内存缓慢爬升。

  • 典型表现:内存增长曲线平缓但持续数天,watch_cache_size 参数未生效(K3s 不暴露该 flag)
  • 缓解方法:减少非必要 CRD;禁用不用的内置控制器(如 --disable servicelb,traefik)以降低 informer 负载
  • 检查 watch 连接数:ss -tan | grep :6443 | wc -l,若稳定在 50+ 且伴随内存增长,需排查 client 是否未 close watch 或重连过于激进

SQLite 后端在高写入下的内存暂留(K3s 单节点特有)

K3s 默认用 SQLite 替代 etcd,虽然节省资源,但其 WAL 日志和 page cache 在批量写入(如日志采集器上报大量 Event、Prometheus scrape 大量 metrics)时,会暂时将数据保留在进程内存中,直到 checkpoint 触发。SQLite 的内存管理不如 etcd 显式可控,容易被误判为“泄漏”。

  • 观察指标:sqlite_db_page_cache_bytes(若启用 metrics)或 cat /proc/$(pidof k3s)/status | grep VmRSS 结合写入节奏比对
  • 缓解方法:限制 Event 保留时间(--event-ttl=1h),关闭非必要 metrics 收集(如禁用 --metrics-server-service
  • 生产环境建议:3 节点以上集群改用 etcd 后端,规避 SQLite 的隐式内存行为

相关专题

更多
nginx 重启
nginx 重启

nginx重启对于网站的运维来说是非常重要的,根据不同的需求,可以选择简单重启、平滑重启或定时重启等方式。本专题为大家提供nginx重启的相关的文章、下载、课程内容,供大家免费下载体验。

229

2023.07.27

nginx 配置详解
nginx 配置详解

Nginx的配置是指设置和调整Nginx服务器的行为和功能的过程。通过配置文件,可以定义虚拟主机、HTTP请求处理、反向代理、缓存和负载均衡等功能。Nginx的配置语法简洁而强大,允许管理员根据自己的需要进行灵活的调整。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

498

2023.08.04

nginx配置详解
nginx配置详解

NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。本专题为大家提供nginx配置相关的文章,大家可以免费学习。

498

2023.08.04

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

227

2024.02.23

nginx报404怎么解决
nginx报404怎么解决

当访问 nginx 网页服务器时遇到 404 错误,表明服务器无法找到请求资源,可以通过以下步骤解决:1. 检查文件是否存在且路径正确;2. 检查文件权限并更改为 644 或 755;3. 检查 nginx 配置,确保根目录设置正确、没有冲突配置等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

333

2024.07.09

Nginx报404错误解决方法
Nginx报404错误解决方法

解决方法:只需要加上这段配置:try_files $uri $uri/ /index.html;即可。想了解更多Nginx的相关内容,可以阅读本专题下面的文章。

3508

2024.08.07

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

14

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

42

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.3万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号