1. 程式人生 > >使用filebeat收集kubernetes容器日誌

使用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的日誌是否收集: 

參考