容器引擎Docker
和容器編排kubernetes`如何優雅的收集容器日誌
Log-Pilot 介紹
log-Pilot 是一個阿里開源的智慧容器日誌採集工具,它不僅能夠高效便捷地將容器日誌採集輸出到多種儲存日誌後端,同時還能夠動態地發現和採集容器內部的日誌檔案。
針對前面提出的日誌採集難題,Log-Pilot 通過宣告式配置實現強大的容器事件管理,可同時獲取容器標準輸出和內部檔案日誌,解決了動態伸縮問題,此外,Log-Pilot 具有自動發現機制,CheckPoint 及控制程式碼保持的機制,自動日誌資料打標,有效應對動態配置、日誌重複和丟失以及日誌源標記等問題。
log-pilot
開源地址: github.com/AliyunConta…
log-pilot
官方幫助文件: help.aliyun.com/document_de…
使用Log-Pilot
進行Docker
日誌收集
部署Log-Pilot
到Docker
執行docker命令啟動 log-pilot
docker run --rm -it \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /:/host \
--privileged \
registry.cn-hangzhou.aliyuncs.com/acs-sample/log-pilot:0.9.5-filebeat
複製程式碼
至此你會看到Log-Pilot
的啟動日誌
不要關閉終端。新開一個終端啟動 tomcat。tomcat 映象屬於少數同時使用了 stdout 和檔案日誌的 Docker 映象,非常適合這裡的演示。
docker run -it --rm -p 10880:8080 -v /usr/local/tomcat/logs --label aliyun.logs.catalina=stdout hub.c.163.com/library/tomcat:latest
複製程式碼
啟動 tomcat 之後,您會發現 log-pilot 的終端立即輸出了一大堆的內容,其中包含 tomcat 啟動時輸出的 stdout 日誌,也包括 log-pilot 自己輸出的一些除錯資訊。
說明:
aliyun.logs.catalina=stdout
告訴 log-pilot 這個容器要收集 stdout 日誌。aliyun.logs.access=/usr/local/tomcat/logs/localhost_access_log.*.txt
則表示要收集容器內 /usr/local/tomcat/logs/ 目錄下所有名字匹配 localhost_access_log.*.txt 的檔案日誌。後面會詳細介紹 label 的用法。
使用 ElasticSearch + kibana + Log-Pilot
說明 執行之前,先把 ELASTICSEARCH_HOST
和 ELASTICSEARCH_PORT
兩個變數替換成您實際使用的值。 ELASTICSEARCH_PORT
一般為 9200。
docker run --rm -it \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /:/host \
--privileged \
-e FLUENTD_OUTPUT=elasticsearch \
-e ELASTICSEARCH_HOST=${ELASTICSEARCH_HOST} \
-e ELASTICSEARCH_PORT=${ELASTICSEARCH_PORT} \
registry.cn-hangzhou.aliyuncs.com/acs-sample/log-pilot:0.9.5-filebeat
複製程式碼
相比前面啟動 log-pilot 的方式,這裡增加了三個環境變數:
FLUENTD_OUTPUT=elasticsearch
:把日誌傳送到 ElasticSearch。ELASTICSEARCH_HOST=${ELASTICSEARCH_HOST}
:ElasticSearch 的域名。ELASTICSEARCH_PORT=${ELASTICSEARCH_PORT}
:ElasticSearch 的埠號。
繼續執行前面的 tomcat,再次訪問,讓 tomcat 產生一些日誌,所有這些新產生的日誌都將傳送到 ElasticSearch 裡。
開啟 kibana,此時您還看不到新日誌,需要先建立 index。log-pilot 會把日誌寫到 ElasticSearch 特定的 index下,規則如下:
如果應用上使用了標籤 aliyun.logs.tags
,並且 tags
裡包含 target
,使用 target
作為 ElasticSearch 裡的 index。否則,使用標籤 aliyun.logs.XXX
裡的 XXX
作為 index。
最終會在 ElasticSearch中看到日誌資訊
label 說明
啟動 tomcat 時,宣告瞭下面兩個 label 來告訴 log-pilot 這個容器的日誌位置。
--label aliyun.logs.catalina=stdout
--label aliyun.logs.access=/usr/local/tomcat/logs/localhost_access_log.*.txt
複製程式碼
您還可以在應用容器上新增更多的標籤。
-
aliyun.logs.$name = $path 複製程式碼
- 變數
name
是日誌名稱,只能包含 0~9、a~z、A~Z 和連字元(-)。 - 變數
path
是要收集的日誌路徑,必須具體到檔案,不能只寫目錄。檔名部分可以使用萬用字元,例如,/var/log/he.log
和/var/log/*.log
都是正確的值,但/var/log
不行,不能只寫到目錄。stdout
是一個特殊值,表示標準輸出。
- 變數
-
aliyun.logs.$name.format 複製程式碼
:日誌格式,目前支援以下格式。
- none:無格式純文字。
- json:json 格式,每行一個完整的 json 字串。
- csv:csv 格式。
-
aliyun.logs.$name.tags 複製程式碼
:上報日誌時,額外增加的欄位,格式為
k1=v1,k2=v2
,每個 key-value 之間使用逗號分隔,例如aliyun.logs.access.tags="name=hello,stage=test"
,上報到儲存的日誌裡就會出現
name
欄位和stage
欄位。如果使用 ElasticSearch 作為日誌儲存,
target
這個 tag 具有特殊含義,表示 ElasticSearch 裡對應的 index。
使用Log-Pilot
對kubernetes
進行日誌收集
部署Log-pilot
到k8s
叢集中
這裡Log-Pilot
整合了ElasticSearch
作為日誌儲存
執行該yaml
檔案部署log-pliot
, 執行完成後會看到每個node節點中都有一個log-pilot的守護pod
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: log-pilot
labels:
app: log-pilot
# 設定期望部署的namespace
namespace: logging
spec:
updateStrategy:
type: RollingUpdate
template:
metadata:
labels:
app: log-pilot
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ''
spec:
# 是否允許部署到Master節點上
# tolerations:
# - key: node-role.kubernetes.io/master
# effect: NoSchedule
containers:
- name: log-pilot
# 版本請參考https://github.com/AliyunContainerService/log-pilot/releases
image: registry.cn-hangzhou.aliyuncs.com/acs/log-pilot:0.9.7-fluentd
imagePullPolicy: IfNotPresent
resources:
limits:
memory: 500Mi
requests:
cpu: 200m
memory: 200Mi
env:
- name: "NODE_NAME"
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: "LOGGING_OUTPUT"
value: "elasticsearch"
# 請確保叢集到ES網路可達
- name: "ELASTICSEARCH_HOSTS"
value: "k8s-es-service:9200"
# 配置ES訪問許可權
#- name: "ELASTICSEARCH_USER"
# value: "{es_username}"
#- name: "ELASTICSEARCH_PASSWORD"
# value: "{es_password}"
volumeMounts:
- name: sock
mountPath: /var/run/docker.sock
- name: root
mountPath: /host
readOnly: true
- name: varlib
mountPath: /var/lib/filebeat
- name: varlog
mountPath: /var/log/filebeat
- name: localtime
mountPath: /etc/localtime
readOnly: true
livenessProbe:
failureThreshold: 3
exec:
command:
- /pilot/healthz
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 2
securityContext:
capabilities:
add:
- SYS_ADMIN
terminationGracePeriodSeconds: 30
volumes:
- name: sock
hostPath:
path: /var/run/docker.sock
- name: root
hostPath:
path: /
- name: varlib
hostPath:
path: /var/lib/filebeat
type: DirectoryOrCreate
- name: varlog
hostPath:
path: /var/log/filebeat
type: DirectoryOrCreate
- name: localtime
hostPath:
path: /etc/localtime
複製程式碼
執行個demo測試log-pilot
是否正常
apiVersion: v1
kind: Pod
metadata:
name: tomcat
spec:
containers:
- name: tomcat
image: hub.c.163.com/library/tomcat:7-jre8-alpine
env:
- name: aliyun_logs_catalina
value: "stdout"
- name: aliyun_logs_access
value: "/usr/local/tomcat/logs/catalina.*.log"
- name: aliyun_logs_access_tags
value: "aa=bb,cc=dd"
- name: aliyun_logs_catalina_tags
value: "aa=bb,cc=ddaaa"
volumeMounts:
- name: tomcat-log
mountPath: /usr/local/tomcat/logs
volumes:
- name: tomcat-log
emptyDir: {}
複製程式碼
最終日誌會在es中出現,至此日誌配置完成
----------------------------------------- 廣告時間 -----------------------------------------
各位看官, 歡迎關注公眾號,每天推送有意思的小東西哦!!! 嘻嘻