k8s的日志收集有多种方案,其中一种是将pod的日志挂载到node节点,然后在node节点运行单独的日志收集客户端,将日志收集并分发到其他日志分析服务如elasticsearch上。
一般的方案为:deployment中将目录通过hostPath的方式挂载到node上:
1 | volumes: |
但是,如果pod有多个replicas时存在一个问题,多个pod的日志会写到node机器上的同一个文件中。
解决办法是:利用HOSTNAME这个环境变量(每个pod的HOSTNAME值默认为pod_name),每个pod将日志写在$HOSTNAME目录下,便可以实现不同的pod日志写到不同目录下
example
1 | apiVersion: extensions/v1beta1 |
==注意其中的一个软链接操作==
1 | ln -s /home/mount/${HOSTNAME} /home/work/logs/applogs |
这样可以保证用户只需要向目录/home/work/logs/applogs
中写日志即可自动将日志写到/home/mount/${HOSTNAME}
目录下,然后/home/mount
这个目录又是使用hostPath挂载到node机器上的(用户不需要关心HOSTNAME),
结果