1. 简介
ElasticSearch 在日志收集和分析领域非常流行,而 fluentd 是一种万用型的日志收集器,当然也支持 ES(ElasticSearch)。不过在 Kubnernetes 环境中,问题会变得有点复杂,问题在于是否要把 fluentd 放进跑业务代码的容器里:放在一起的话,fluentd 明显和业务无关;不放在一起的话,fluentd 又如何访问到跑业务容器里的日志呢。
这个问题有多种解决方式,感兴趣的话,可以参考这个链接:Logging Architecture。在这里要介绍的是 sidecar 模式,sidecar 就是题图中的摩托挎斗,对应到 Kubernetes 中,就是在 Pod 中再加一个 container 来跑非核心的代码,来保证隔离性,并尽量缩减容器镜像的大小。
2. 部署
接下来我们就开始部署吧,要先准备好 fluentd 的配置文件,<source> 部分指定的是要上传的日志文件;<match> 部分指定的是日志要传输到哪里,这里指定的就是 ElasticSearch,真正使用的时候要注意根据具体环境替换 <ES-IP>。
$ cat fluentd-config-sidecar.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: fluentd-config
data:
fluentd.conf: |
<source>
type tail
format none
path /var/log/1.log
pos_file /var/log/1.log.pos
tag count.format1
</source>
<source>
type tail
format none
path /var/log/2.log
pos_file /var/log/2.log.pos
tag count.format2
</source>
<match **>
type elasticsearch
host <ES-IP>
port 9200
include_tag_key true
tag_key @log_name
logstash_format true
flush_interval 10s
</match>
接下来是创建 Pod 的 yaml 文件,其中包含了两个 container:count 和 count-agent。count 是主程序,产生日志;count-agent 是发送日志的 sidecar。这里面由几处需要注意一下:
- emptyDir:表示创建一个空的目录,之所以用这个种方式挂载日志,原因是 emptyDir 对 Pod 内的全部 container 都可见。
- fluentd 使用的镜像:原来的镜像是存放在 google container registry 里的,国内无法访问,所以使用了阿里云的源作为替代。
- FLUENTD_ARGS 环境变量:是 fluentd 的启动参数。
$ cat counter-pod-sidecar.yaml
apiVersion: v1
kind: Pod
metadata:
name: counter
spec:
containers:
- name: count
image: busybox
args:
- /bin/sh
- -c
- >
i=0;
while true;
do
echo "$i: $(date)" >> /var/log/1.log;
echo "$(date) INFO $i" >> /var/log/2.log;
i=$((i+1));
sleep 1;
done
volumeMounts:
- name: varlog
mountPath: /var/log
- name: count-agent
image: registry.cn-beijing.aliyuncs.com/k8s-mqm/fluentd-elasticsearch:v2.1.0
env:
- name: FLUENTD_ARGS
value: -c /etc/fluentd-config/fluentd.conf
volumeMounts:
- name: varlog
mountPath: /var/log
- name: config-volume
mountPath: /etc/fluentd-config
volumes:
- name: varlog
emptyDir: {}
- name: config-volume
configMap:
name: fluentd-config