kubernetes官方插件使用EFK来处理容器日志, 其中F指代Fluentd(Fluentd属于CNCF项目), 用于收集容器的日志。但是由于Fluentd用起来的确不怎么舒服(Ruby风格配置文件), 而Logstash又过于重量级(光启动就需要消耗大约500M内存), 而Elatic家族的Beats系列中的Filebeat既轻量又无依赖, 因此是作为DaemonSet部署的不二之选。
架构
在进行日志收集的过程中, 我们首先想到的是使用Logstash, 因为它是ELK stack中的重要成员, 但是现在的ELK家族的产品有了新的变化:
从中可以看出Logstash的定位变了, 它用于日志的原始数据的分析和转换(grok), 因此在轻量级的方案中首选Beats系列, 下面是基于ELK改造过后的基于Filebeat的容器日志处理方案:
依赖部署
在Kubernetes中以DaemonSet部署Filebeat之前, 我们需要先做如下准备:
安装Elasticsearch, Kibana
安装Filebeat用于测试EFK已经能正常工作
以DaemonSet部署Filebeat
部署Elasticsearch和Kibana
在部署Filebeat之前需要先部署Elasticsearch和Kibana, 关于这2部分的部署请参考:
Install elaticdearch
Install kibana
安装完成后确认服务都已经对外提供服务:
[root@es-with-kb ~]# netstat -tlnup | grep -E '(:9200 |:5601)'
tcp 0 0 0.0.0.0:5601 0.0.0.0:* LISTEN 2503/./bin/../node/
tcp6 0 0 :::9200 :::* LISTEN 2367/java
对ES添加添加一些我们需要的插件
cd /usr/share/elasticsearch
# 安装插件 ES的地图需要使用GEOIP来解索IP的经纬度, 所以ES还需要安装一个GEOIP的插件
bin/elasticsearch-plugin install ingest-geoip
bin/elasticsearch-plugin install x-pack
systemctl restart elasticsearch
为内建用户初始化密码(elastic, kibana, and logstash_system):
bin/x-pack/setup-passwords interactive
1
测试ES已经正常工作
[root@es-with-kb ~]# curl http://192.168.204.14:9200
{
"name" : "7t3FhoS",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "gwxqxfOmQWKfFg_XF8-kvg",
"version" : {
"number" : "6.1.3",
"build_hash" : "af51318",
"build_date" : "2018-01-26T18:22:55.523Z",
"build_snapshot" : false,
"lucene_version" : "7.1.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
测试Kibana已经正常工作: 访问http://192.168.204.14:5601/ , 注意此时Kibana应该还没有数据。
验证EFK(Filebeat)
为了验证EFK能否正常工作, 因此我在EK的机器上安装了Filebeat, Filebeat的安装请查看官方文档: Filebeat安装文档
Filebeat是模块化的, 这里开启审计日志模块, 来进行测试:
filebeat modules enable auditd
filebeat modules list
filebeat setup -e
systemctl restart filebeat
稍等片刻我们就可以通过dashboard测试数据收集是否正常:
到此EFK工作正常。
DaemonSet部署Filebeat
以DaemonSet的方式部署Filebeat方便我们处理每个Node阶段上的容器日志, Filebeat容器会将Docker容器的日志目录(/var/lib/docker/containers)挂载进去开启一个prospector来进行处理。
下载官方manifests
curl -L -O https://raw.githubusercontent.com/elastic/beats/6.1/deploy/kubernetes/filebeat-kubernetes.yaml
1
注意这个镜像需要翻墙下载: docker.elastic.co/beats/filebeat:6.1.3, 因此提前下载好(百度网盘), 推送到自己的私有仓库, 然后修改image地址
# 修改image地址
image: 192.168.204.15/kubernetes/filebeat:6.1.3
# 设置ES相关配置(注意修改成你刚才初始化的密码)
- name: ELASTICSEARCH_HOST
value: 192.168.204.14
- name: ELASTICSEARCH_USERNAME
value: "elastic"
- name: ELASTICSEARCH_PASSWORD
value: "changme"
# 修改configMap中ES Host的默认值
output.elasticsearch:
hosts: ['${ELASTICSEARCH_HOST:192.168.204.14}:${ELASTICSEARCH_PORT:9200}']
然后开始创建:
[root@k8s-apiserver01 filebeat]# kubectl create -f filebeat-kubernetes.yaml
configmap "filebeat-config" created
configmap "filebeat-prospectors" created
daemonset "filebeat" created
clusterrolebinding "filebeat" created
clusterrole "filebeat" created
serviceaccount "filebeat" created
检查filebeat是否run起来
[root@k8s-apiserver01 filebeat]# kubectl --namespace=kube-system get ds/filebeat
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
filebeat 4 4 0 4 0 <none> 1m
[root@k8s-apiserver01 ~]# kubectl get pods -n kube-system | grep filebeat
filebeat-sltwm 1/1 Running 0 25m
filebeat-tqgjx 1/1 Running 0 25m
filebeat-vq4wj 1/1 Running 0 25m
filebeat-wq44h 1/1 Running 0 25m
注意:
如果查看filebeat的日志发现无法节点网络通信, 请使用SNAT进行转换, 如果通讯正常不必进行下面操作:
# 允许node1上的filebeat所有网络访问node网络, 通过node1为代理(node1上执行)
iptables -t nat -A POSTROUTING -s 192.168.85.0/24 -d 192.168.204.0/24 -j SNAT --to-source 192.168.204.4
# 允许node2上的filebeat所有网络访问node网络, 通过node2为代理(node2上执行)
iptables -t nat -A POSTROUTING -s 192.168.58.0/24 -d 192.168.204.0/24 -j SNAT --to-source 192.168.204.6
通过kabina观察4个节点上面的filebeat daemonset的日志是否收集:
参考