k8s安全主机设置陷阱

一、背景
最近在公司迁移存量系统到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进行如下配置
图一
k8s安全主机设置陷阱_第1张图片
图二
k8s安全主机设置陷阱_第2张图片
设置的内存初始值为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、实践出真理,生产无小事,谨慎对待和评估每个配置改动对生产业务的影响。

你可能感兴趣的:(k8s安全主机设置陷阱)