在 Kubernetes中,fluentd 以 sidecar 模式收集日志,并发送至 ElasticSearch

在 Kubernetes中,fluentd 以 sidecar 模式收集日志,并发送至 ElasticSearch_第1张图片
sidecar

1. 简介

ElasticSearch 在日志收集和分析领域非常流行,而 fluentd 是一种万用型的日志收集器,当然也支持 ES(ElasticSearch)。不过在 Kubnernetes 环境中,问题会变得有点复杂,问题在于是否要把 fluentd 放进跑业务代码的容器里:放在一起的话,fluentd 明显和业务无关;不放在一起的话,fluentd 又如何访问到跑业务容器里的日志呢。

在 Kubernetes中,fluentd 以 sidecar 模式收集日志,并发送至 ElasticSearch_第2张图片
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: |
    
      type tail
      format none
      path /var/log/1.log
      pos_file /var/log/1.log.pos
      tag count.format1
    

    
      type tail
      format none
      path /var/log/2.log
      pos_file /var/log/2.log.pos
      tag count.format2
    

    
      type elasticsearch
      host 
      port 9200
      include_tag_key true
      tag_key @log_name
      logstash_format true
      flush_interval 10s
    

接下来是创建 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

3. 参考文档

  • Logging Architecture
  • cedbossneo/fluentd-sidecar-es
  • Kubernetes Log Management using Fluentd as a Sidecar Container and preStop Lifecycle Hook- Part IV
  • Collecting Logs into Elasticsearch and S3
  • emptyDir Volumes

你可能感兴趣的:(在 Kubernetes中,fluentd 以 sidecar 模式收集日志,并发送至 ElasticSearch)