记一次k8s中内存泄露的问题
监控抓取的地址为cadvisor的地址,取的pod的mem分为rss、cached、used、total
- total:limit的数值
- rss:实际内存使用
- cached:缓存使用
- used:cached+rss
监控内存百分比会用used/total进行计算,所以内存不断上涨,误以为存在内存泄露
可以使用如下方式查看cadvisor的监控:
kubectl -n kube-admin get secrets k8s-mon-token-995sz -ojsonpath='{.data.token}' | base64 -d
TOKEN=$(kubectl -n kube-admin get secrets k8s-mon-token-995sz -ojsonpath='{.data.token}' | base64 -d)
curl -k --header "Authorization: Bearer $TOKEN" https://10.xxx.xxx.xxx:10250/metrics/cadvisor
通过压测得到:
k8s的limit限制,会计算rss+cache的值,写文件会导致cache不断增加,直到总量到达limit的限制值,此时cache会保持稳定。如果存在内存泄露,会导致rss不断增长,直到rss超过limit,会重启容器释放内存
我们内存告警rss的值即可,告警数值为limit的80% P2,limit的90% P1