先把当时的情况摆出来。编排平台里的应用每隔几小时重启一次,应用日志没有任何异常,只有事件里写着因内存超限被终止。

排查方向其实有限,先把可能性排一排。内存限制低于应用真实峰值。还有一种是容器内多个进程共用同一份额度。

少数情况下是页缓存也计入容器内存统计。

第一件事是确认容器退出原因

kubectl describe pod 名称 | grep -A3 'Last State'

再往下看容器实际内存曲线

kubectl top pod 名称 --containers

调高限制并留余量

kubectl set resources deploy/app --limits=memory=2Gi

剩下的就是核对节点剩余内存

kubectl describe node 节点名 | grep -A5 Allocated

这台环境是别人交接的,不少默认值被动过,只能一项项核。

怎么算真的好了,看的是同一批现象。容器连续运行超过一天不再重启,内存峰值低于限额的八成。

这里还有个坑。容器里的文件缓存也算内存,读写大量文件时更容易被杀;只看应用堆占用会严重低估真实用量。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189