2018-08-09-k8s日志收集-多pod挂载不同目录方案.md

k8s的日志收集有多种方案,其中一种是将pod的日志挂载到node节点,然后在node节点运行单独的日志收集客户端,将日志收集并分发到其他日志分析服务如elasticsearch上。

一般的方案为:deployment中将目录通过hostPath的方式挂载到node上:

1
2
3
4
5
volumes:
- name: test-volume
hostPath:
path: /home/work/logs
type: DirectoryOrCreate

但是,如果pod有多个replicas时存在一个问题,多个pod的日志会写到node机器上的同一个文件中。

解决办法是:利用HOSTNAME这个环境变量(每个pod的HOSTNAME值默认为pod_name),每个pod将日志写在$HOSTNAME目录下,便可以实现不同的pod日志写到不同目录下

example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: test-hostpath
spec:
replicas: 2
selector:
matchLabels:
name: nginx
template:
metadata:
labels:
name: nginx
spec:
containers:
- image: registry.cn-beijing.aliyuncs.com/opendcp/nginx
name: nginx
command: ["/bin/bash", "-c"]
args:
- "mkdir -p /home/mount/${HOSTNAME} /home/work/logs && ln -s /home/mount/${HOSTNAME} /home/work/logs/applogs && echo ${HOSTNAME} >> /home/work/logs/applogs/nginx.log && sleep 10000000"

volumeMounts:
- mountPath: /home/mount
name: test-volume
volumes:
- name: test-volume
hostPath:
path: /home/work/logs
type: DirectoryOrCreat

==注意其中的一个软链接操作==

1
ln -s /home/mount/${HOSTNAME} /home/work/logs/applogs

这样可以保证用户只需要向目录/home/work/logs/applogs中写日志即可自动将日志写到/home/mount/${HOSTNAME}目录下,然后/home/mount这个目录又是使用hostPath挂载到node机器上的(用户不需要关心HOSTNAME),

结果