傳統項目裏面記錄日誌大多數都是將日誌記錄到日誌文件,升級到分佈式架構之後,日誌開始由文件轉移到elasticsearch(es)中來存儲,達到集中管理。在kubernetes平臺裏面把日誌記錄到es有兩種簡單的方案:git
首先在docker容器裏面作掛載,指定一個固定的虛擬機目錄,而後應用程序把日誌寫入到這個目錄,虛擬機上開啓logstash服務來收集日誌文件,而後把日誌傳輸到es,在經過kibana作展現,這種方案也是最傳統的ELK的作法。
優勢:應用程序耦合相對較低,使用傳統的日誌組件好比log4net就能把日誌輸出到文件,對於系統的改形成原本說較低。也沒有語言依賴。
缺點:須要在宿主機上面作不少額外的配置,每增長一臺宿主機,這個工做就要重複作一次,須要運維人員參與。github
直接在代碼層面把日誌寫入es。
優勢:日誌在應用層面處理了,不須要虛擬機上作額外的工做。 缺點:日誌和應用程序耦合的很是高,每一個應用程序都須要單獨的配置,配置有變化均可能致使日誌收集失敗。若是一個項目由多種語言開發須要開發各類語言的SDK來支持日誌的寫入。docker
回到咱們的標題的問題。有沒有一種方案可以不依賴日誌組件,就單純的把日誌輸出到控制檯就能記錄日誌呢?在應用層面不依賴各類組件,在宿主機上面也不用大量額外的配置就能統一的收集日誌呢?答案是有的。api
介紹咱們今天的主角:log-pilot架構
log-pilot是阿里雲開發的一款開源的容器日誌採集工具,能夠直接獲取容器的標準輸入和內部文件日誌,在每臺機器上都安裝一個log-pilot實例,這樣就能收集整個kubernetes集羣的docker容器的日誌。該項目地址是 https://github.com/AliyunContainerService/log-pilotapp
下面咱們一步一步將log-pilot部署出來。運維
阿里雲提供了一些安裝腳本,感興趣的同窗能夠看腳本源碼
下面的演示基於阿里雲的kubernetes集羣elasticsearch
kubectl apply -f https://acs-logging.oss-cn-hangzhou.aliyuncs.com/elasticsearch.yml
kubectl apply -f https://acs-logging.oss-cn-hangzhou.aliyuncs.com/log-pilot.yml
由於要在集羣全部的機器上面都安裝log-polot,因此要指定
kind: DaemonSet
分佈式
kubectl apply -f https://acs-logging.oss-cn-hangzhou.aliyuncs.com/kibana.yml
a) 要讓kibana可以外網展現因此還須要配置一個ingress工具
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: kibana-ingress namespace: kube-system spec: rules: - http: paths: - path: / backend: serviceName: kibana servicePort: 80
b) 建立成功之後獲取訪問地址
kubectl get ingress -n=kube-system
任意語言應用程序都行,日誌輸出到控制檯便可,筆者用的的一個dotnet core應用程序
apiVersion: v1 kind: Pod metadata: name: testapi namespace: default labels: name: testapi spec: containers: env: - name: aliyun_logs_catalina value: "stdout"
上面配置不是一個真實的編排文件,核心代碼只有這兩句
- name: aliyun_logs_catalina value: "stdout"
aliyun_logs_catalina=stdout表示要收集容器的 stdout 日誌。也能夠收集保存到文件的日誌,請自行參考官方文檔
a) 先查看容器內記錄的日誌,爲正式環境的一部分截圖
b) kibana查詢日誌
經過這種方案,能讓咱們快速的把整個kubernetes集羣內的應用程序日誌接入到es,遷移和維護成本很是低,極大提高運維效率。
筆者目前在武漢工做,不知道是否有.net相關的線下組織,主要想推進一下.net在武漢地區的發展,有這方面經驗的朋友能夠給我發下私信,很是感謝。