问题描述
在使用 haproxy 驱动 Pod 代理时,在个别 k8s 集群中 haproxy 容器 (haproxytech/haproxy-debian:2.7) 在启动时出现 OOM 秒重启,即使配置了 16GB 的内存限制依然被杀掉。而同样的镜像和配置在其他 Rocky Linux 9 集群中运行正常。
关键症状
内存占用异常:
| 内存配置 | 症状 |
|---|---|
| 2GB | OOM |
| 8GB | OOM |
| 15GB | OOM |
就是配置多大的内存都会被吞掉。当时日志记录如下
text
| |
排查过程
之前代码设计是在启动时,controller 获取 k8s pod 信息完成映射,怀疑是因为启动时大量写导致的顺时内存突发,修改代码为异步处理[1] 后问题仍然存在。
上述问题实施的内容
- 增加了 haproxy 启动延迟
- 增加了内存限制,扩大了内存
- 排查了系统版本/内核版本/k8s版本/kubelet slice 均没有任何问题,和正常运行在 k8s 集群的其他集群的配置一致。
Pod 配置为
yaml
| |
把限制从 1GB 提到 2GB,结果依然是秒OOM
text
| |
换一个节点,内存扩容到 15G 仍然会遇到 OOM 问题,如下日志所示
text
| |
最终根据 AI 提示,说是 “jemalloc 内存分配器问题”,我自己没有找到对应的相同案例
text
| |
解决方式
更换了 haproxy:2.7-alpine(alpine 使用musl libc 不使用 jemalloc),官方已经升级到版本3,并且启用了 dataplane api,但是我一直没换 sdk,也有可能是版本太旧了的问题。记录一下后面技术提升后可以复盘问题,这个问题排查了好几个星期….