如何通過Log-Pilot來採集Kubernetes Pod日誌
在前面 容器日誌採集利器Log-Pilot 中主要跟大家介紹了一個智慧的容器日誌採集利器,它採用宣告式的日誌採集配置方式,能自動地發現和採集應用容器的日誌;它不僅能夠採集容器的標準輸出日誌,同時還能夠採集容器內部的檔案日誌。
本文主要跟大家分享下如何通過Log-Pilot來配置採集Kubernetes叢集中Pod的日誌到ElasticSearch叢集中;當然Log-Pilot不僅侷限於此,它還可以採集Swarm叢集乃至直接通過docker run
執行的容器的日誌,具體可參考Log-Pilot QuickStart。
準備工作
- 您已經成功部署了一個Kubernetes叢集,也可直接通過
- 配置本地通過kubectl連線Kubernetes叢集,當然也可直接在Master節點上操作。
部署ElasticSearch叢集
鑑於ES叢集的穩定性考慮以及未來的系統維護成本,這裡我們可直接通過阿里雲ElasticSearch控制檯建立一個ElasticSearch叢集:
說明:您可依據自身實際業務的日誌資料情況來選擇合適的版本、叢集節點數以及規格等。
開啟自動建立索引
預設情況下阿里雲ElasticSearch叢集當新增的文件發現沒有索引時,不允許自動建立索引,而Log-Pilot在自動採集容器日誌時需要依據日誌採集配置來自動建立文件索引,因此我們這裡需要開啟自動建立索引功能:
部署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
引數說明:
- {es_endpoint}:ES叢集的訪問地址,若跟Kubernetes叢集在同一個VPC下,則可直接使用私網地址;
請務必確保到ES叢集網路可達
。 - {es_port}:ES叢集的訪問埠,一般是9200。
- {es_username}:訪問ES叢集的使用者名稱。
- {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叢集中:
注意:Log-Pilot預設採集日誌到ES叢集時會自動建立格式為 index-yyyy.MM.dd 的索引
因此,我們可以看到只需要通過上面簡單的配置就可以很方便地將Kubernetes叢集中Pod的標準輸出日誌和容器內檔案日誌採集到ElasticSearch叢集中。