复盘

线上服务突然会时不时报一下503错误,kubect top nodes发现集群有一个Node节点状态<unknown>了。

image-20191226172252034

于是SSH连上问题节点,提示一大堆错误信息。

image-20191226173319143

查看进程,发现会报-bash: fork: Cannot allocate memory错误

image-20191226173432758

本以为是内存用完了呢,查看内存发现还有很多剩余。

image-20191226173843993

查了一下资料说是进程数量达到内核最大限止了,于是 ps -eLf|wc -l 一下,好家伙确实很多。

于是是果断增把进程数限制增加了一倍

1
2
echo "kernel.pid_max=65536" >> /etc/sysctl.conf
echo 65536 > /proc/sys/kernel/pid_max

问题解决。

总结

  • 系统最大进程数限制默认为32768, 这个数量其实也不小了,但对于Kubernetes Node节点因为需要跑很多容器,所以还需要跟自己服务的情况适当加大一些,并且应该对进程数量使用情况做一下监控。
1
2
# cat /proc/sys/kernel/pid_max
32768
  • 另外kubelt 最好也启用一下资源预留,防止系统资源不足时影响系统本身及Kubernetes 自身管理进程的正常工作,导致整个节点都处于不用状态。

参考

https://unix.stackexchange.com/questions/136854/understanding-the-difference-between-pid-max-ulimit-u-and-thread-max

https://kubernetes.io/docs/tasks/administer-cluster/reserve-compute-resources/