容器引擎Docker和容器編排kubernetes如何優雅的收集容器日誌

天愛有情發表於2020-03-17

容器引擎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-PilotDocker

執行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的啟動日誌

容器引擎Docker和容器編排kubernetes如何優雅的收集容器日誌

不要關閉終端。新開一個終端啟動 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 自己輸出的一些除錯資訊。

容器引擎Docker和容器編排kubernetes如何優雅的收集容器日誌

說明:

  • 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_HOSTELASTICSEARCH_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。

容器引擎Docker和容器編排kubernetes如何優雅的收集容器日誌

最終會在 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-Pilotkubernetes進行日誌收集

部署Log-pilotk8s叢集中

​ 這裡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中出現,至此日誌配置完成

----------------------------------------- 廣告時間 -----------------------------------------

各位看官,  歡迎關注公眾號,每天推送有意思的小東西哦!!! 嘻嘻

容器引擎Docker和容器編排kubernetes如何優雅的收集容器日誌

相關文章