使用filebeat收集kubernetes容器日誌
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
安裝完成後確認服務都已經對外提供服務:
[[email protected] ~]# 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已經正常工作
[[email protected] ~]# 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}']
然後開始建立:
[[email protected] 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起來
[[email protected] 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
[[email protected] ~]# 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的日誌是否收集:
參考