生产K8s Rsyslogd内存优化

最近发现K8s机器经常有内存告警,上去抽了几台ECS 看了下都发现了rsyslogd占用大量内存的情况出现。

如下图:

生产K8s Rsyslogd内存优化

 

根因分析

k8s宿主机上,/var/log/messages有几个G的日志,发现rsyslog把Journal的log都进行的输出和汇总。 当容器越多是,log也就会也多,内存占用也就越多。同时也可能导致systemd-journald内存占用过高。

因此我们最好优化下journald和rsyslog的参数,将宝贵的内存资源留给业务服务去使用。

 

下图是 journalctl -xe 执行的结果示例:

生产K8s Rsyslogd内存优化

 

修改方法

# 1 备份下原先配置文件
cp /etc/systemd/journald.conf  /root/
cp /lib/systemd/system/rsyslog.service  /root/

# 2 修改journald服务
cat /etc/systemd/journald.conf 改动后的3行如下: 
[Journal]
Storage=persistent
SystemMaxUse=1024M
ForwardToSyslog=no

# 确保journal的日志路径存在(通常都是已存在的)
mkdir -pv /var/log/journal/

# 重启下服务
systemctl restart systemd-journald  

# 3 2 修改rsyslog服务
cat /lib/systemd/system/rsyslog.service 在 Service 段增加下面3行
MemoryAccounting=yes
MemoryMax=800M
MemoryLimit=800M

# 重启下服务
systemctl daemon-reload && systemctl restart rsyslog


 

多机器的话,推荐使用ansible-playbook分组部署,观察几天后,实现批量修改。

 

 

效果展示

 

生产K8s Rsyslogd内存优化

 

TODO 持续部署

对于新加的k8s节点,rsyslogd和journald的配置也需要优化,我们可以做成一个巡检类的定时任务。

step1、封装一个check-deploy.sh脚本

具体逻辑:
1、将 /etc/systemd/journald.conf 和 /lib/systemd/system/rsyslog.service 做成固定的模板文件,算出md5值。
2、如果主机的2个文件md5和期望的不一致,则用check-deploy的脚本中的文件覆盖,并重启journald或rsyslog服务。

step2、定时任务平台 从cmdb中将k8s主机列表取出来,每天下发一次 check-deploy.sh 到目标K8s机器上并执行即可(这个变更对时效性要求不高)。

 

 

参考: 
 https://blog.espnlol.com/?p=525

上一篇:Linux系统启动流程


下一篇:config : 'option forwardfor' ignored for frontend 'openshift-api-server' as it r