一、背景
最近在公司迁徙存量零碎到k8s集群,经理解,k8s集群反对对每个利用的资源应用进行限度,以防止某个利用有限应用内存或者过高CPU导致整个集群故障。因而尝试对现有正在运行的高并发的零碎进行资源限度革新,通过实际,最终发现该个性如设置不当,会给利用零碎带来劫难。
二、应用环境
1、Docker版本
rke@k8s-master-dev-1:~$ docker -v
Docker version 18.06.0-ce, build 0ffa825
2、K8s版本
root@k8s-master-dev-1:~# su - rke
rke@k8s-master-dev-1:~$ kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.3", GitCommit:"2e7996e3e2712684bc73f0dec0200d64eec7fe40", GitTreeState:"clean", BuildDate:"2020-05-20T12:52:00Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.14", GitCommit:"89182bdd065fbcaffefec691908a739d161efc03", GitTreeState:"clean", BuildDate:"2020-12-18T12:02:35Z", GoVersion:"go1.13.15", Compiler:"gc", Platform:"linux/amd64"}
rke@k8s-master-dev-1:~$
三、问题景象
1、在k8s进行如下配置
图一

图二

设置的内存初始值为512M,最大值设置为4500M(因为jvm限度了最大内存应用为4096M,这外面预留一部分给操作系统和其余程序)
设置的CPU初始值为100mi,最大值设置为500mi
2、问题景象
(1)、利用卡顿,有时能够关上页面,有时打不开页面
经排查是因为CPU限度导致,去掉该配置,利用恢复正常
(2)、程序运行每隔20到30分钟会一直重启pod,中断业务应用
经排查操作系统日志,发现POD产生OOM,被操作系统(oom-killer)KILL
May 11 15:29:12 k8s-node-prod-3 kernel: [18750.337581] java invoked oom-killer: gfp_mask=0x6000c0(GFP_KERNEL), nodemask=(null), order=0, oom_score_adj=969
May 11 15:29:12 k8s-node-prod-3 kernel: [18750.337621] oom_kill_process.cold.30+0xb/0x1cf
四、问题总结
1、CPU尽量不要限度大小,应充分发挥其个性
2、对JAVA利用应应用-xms和-xmx设置最小和最大内存,最好不须要在k8s下面设置内存限度,否则因为设置的太小或者不到位,对业务产生影响
JAVA_OPTS="$JAVA_OPTS -server -Xms4096M -Xmx4096M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=15 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true"
3、实际出真谛,生产无小事,审慎看待和评估每个配置改变对生产业务的影响。