1. 程式人生 > >如何通過Log-Pilot來採集Kubernetes Pod日誌

如何通過Log-Pilot來採集Kubernetes Pod日誌

在前面 容器日誌採集利器Log-Pilot 中主要跟大家介紹了一個智慧的容器日誌採集利器,它採用宣告式的日誌採集配置方式,能自動地發現和採集應用容器的日誌;它不僅能夠採集容器的標準輸出日誌,同時還能夠採集容器內部的檔案日誌。

本文主要跟大家分享下如何通過Log-Pilot來配置採集Kubernetes叢集中Pod的日誌到ElasticSearch叢集中;當然Log-Pilot不僅侷限於此,它還可以採集Swarm叢集乃至直接通過docker run執行的容器的日誌,具體可參考Log-Pilot QuickStart

image

準備工作

  1. 您已經成功部署了一個Kubernetes叢集,也可直接通過
    阿里雲容器服務控制檯
    來申請Kubernetes叢集。
  2. 配置本地通過kubectl連線Kubernetes叢集,當然也可直接在Master節點上操作。

部署ElasticSearch叢集

鑑於ES叢集的穩定性考慮以及未來的系統維護成本,這裡我們可直接通過阿里雲ElasticSearch控制檯建立一個ElasticSearch叢集:

image
說明:您可依據自身實際業務的日誌資料情況來選擇合適的版本、叢集節點數以及規格等。

開啟自動建立索引

預設情況下阿里雲ElasticSearch叢集當新增的文件發現沒有索引時,不允許自動建立索引,而Log-Pilot在自動採集容器日誌時需要依據日誌採集配置來自動建立文件索引,因此我們這裡需要開啟自動建立索引功能:

image

部署Log-Pilot元件

為降低節點的資源消耗,Log-Pilot元件採用的是DaemonSet方式部署到每個叢集的Node節點上,YAML可參考如下:

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: log-pilot
  labels:
    app: log-pilot
  # 設定期望部署的namespace
  namespace: kube-system
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.6-filebeat
        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: "{es_endpoint}:{es_port}"
          # 配置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

引數說明:

  1. {es_endpoint}:ES叢集的訪問地址,若跟Kubernetes叢集在同一個VPC下,則可直接使用私網地址;請務必確保到ES叢集網路可達
  2. {es_port}:ES叢集的訪問埠,一般是9200。
  3. {es_username}:訪問ES叢集的使用者名稱。
  4. {es_password}:訪問ES叢集的使用者密碼。

部署完成後,可通過如下命令確認是否正常執行:

  ~ kubectl apply -f log-pilot.yml
daemonset.extensions "log-pilot" created
  ~ kubectl -n kube-system get pod | grep log-pilot
log-pilot-458nj                                              1/1       Running   0          23s
log-pilot-8ld4n                                              1/1       Running   0          23s
log-pilot-b4kqv                                              1/1       Running   0          23s
log-pilot-gd588                                              1/1       Running   0          23s
log-pilot-k2ttk                                              1/1       Running   0          23s

採集應用日誌

這裡以一個Tomcat為例來說明如何配置應用的日誌採集配置(配置方式同樣適用Deploment和StatefulSet):

apiVersion: v1
kind: Pod
metadata:
  name: tomcat
spec:
  containers:
  - name: tomcat
    image: "tomcat:7.0"
    env:
    # 1、stdout為約定關鍵字,表示採集標準輸出日誌
    # 2、配置標準輸出日誌採集到ES的catalina索引下
    - name: aliyun_logs_catalina
      value: "stdout"
    # 1、配置採集容器內檔案日誌,支援萬用字元
    # 2、配置該日誌採集到ES的access索引下
    - name: aliyun_logs_access
      value: "/usr/local/tomcat/logs/catalina.*.log"
    # 容器內檔案日誌路徑需要配置emptyDir
    volumeMounts:
      - name: tomcat-log
        mountPath: /usr/local/tomcat/logs
  volumes:
    - name: tomcat-log
      emptyDir: {}

部署成功後稍等幾秒鐘,我們可以看到tomcat的日誌被採集到了指定的ES叢集中:
image

注意:Log-Pilot預設採集日誌到ES叢集時會自動建立格式為 index-yyyy.MM.dd 的索引

因此,我們可以看到只需要通過上面簡單的配置就可以很方便地將Kubernetes叢集中Pod的標準輸出日誌和容器內檔案日誌採集到ElasticSearch叢集中。