利用 Log-Pilot + Kafka + Elasticsearch + Kibana 搭建 kubernetes日志解決方案


利用 Log-Pilot + Kafka+Elasticsearch + Kibana 搭建 kubernetes日志解決方案

1、前提條件

已有kafka、elk、k8s集群,這3套集群搭建網上資料很多,這里不寫,IP規划如下所示:

kafka集群
10.6.11.22:9092  10.6.11.23:9092  10.6.11.24:9092

ELK集群
10.6.11.25:9200 10.6.11.26:9200 10.6.11.27:9200

k8s集群
10.6.11.28(master01) 10.6.11.29(master02) 10.6.11.30(master03) 10.6.11.31(node01) 10.6.11.32(node02)

2、log-pilot介紹

log-Pilot 是一個智能容器日志采集工具,它不僅能夠高效便捷地將容器日志采集輸出到多種存儲日志后端,同時還能夠動態地發現和采集容器內部的日志文件。

針對前面提出的日志采集難題,Log-Pilot 通過聲明式配置實現強大的容器事件管理,可同時獲取容器標准輸出和內部文件日志,解決了動態伸縮問題,此外,Log-Pilot 具有自動發現機制,CheckPoint 及句柄保持的機制,自動日志數據打標,有效應對動態配置、日志重復和丟失以及日志源標記等問題。

目前 log-pilot 在 Github 完全開源,項目地址是 https://github.com/AliyunContainerService/log-pilot 。您可以深入了解更多實現原理。

3、日志收集系統架構
img

4、log-pilot部署

阿里提供的例子是把日志輸出給es,這里因為使用了kafka,所以部署的yaml較官方的來說,有一點點的變化,如下所示:

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: log-pilot
  labels:
    k8s-app: log-pilot
  namespace: kube-system
spec:
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        k8s-app: log-pilot
    spec:
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - name: log-pilot
        image: registry.cn-hangzhou.aliyuncs.com/acs/log-pilot:0.9.5-filebeat #沒用最新鏡像,是因為為了收集多行日志,需要修改log-pilot的源碼,最新的鏡像測試修改完后,pod無法啟動,所以就放棄了,這個版本測試沒有問題,修改配置會在下面介紹
        env:
          - name: "LOGGING_OUTPUT"
            value: "kafka"        #輸出到kafka,官方的例子是輸出到es
          - name: "KAFKA_BROKERS" #和官方不一致的地方
            value: "10.6.11.22:9092,10.6.11.23:9092,10.6.11.24:9092" #kafka地址
          - name: "NODE_NAME"
            valueFrom:
              fieldRef:
                fieldPath: spec.nodeName
        volumeMounts:
        - name: sock
          mountPath: /var/run/docker.sock
        - name: logs
          mountPath: /var/log/filebeat
        - name: state
          mountPath: /var/lib/filebeat
        - name: root
          mountPath: /host
          readOnly: true
        - name: localtime
          mountPath: /etc/localtime
        securityContext:
          capabilities:
            add:
            - SYS_ADMIN
      terminationGracePeriodSeconds: 30
      volumes:
      - name: sock
        hostPath:
          path: /var/run/docker.sock
      - name: logs
        hostPath:
          path: /var/log/filebeat
      - name: state
        hostPath:
          path: /var/lib/filebeat
      - name: root
        hostPath:
          path: /
      - name: localtime
        hostPath:
          path: /etc/localtime

5、配置服務的yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: accounting
  namespace: kube-ops
  labels:
    app: accounting
spec:
  minReadySeconds: 30
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  revisionHistoryLimit: 9
  selector:
    matchLabels:
      app: accounting
  replicas: 1
  template:
    metadata:
      labels:
        app: accounting
    spec:
      containers:
      - name: accounting
        image: test-accounting:v2
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
        env:
        - name: aliyun_logs_info  #當然如果你不想使用aliyun這個關鍵字,Log-Pilot 也提供了環境變量 PILOT_LOG_PREFIX可以指定自己的聲明式日志配置前綴,比如 PILOT_LOG_PREFIX: "aliyun,custom",最好是和官方一致,省去多余的配置
          value: /data/home/logs/accounting/accounting.log   #需要收集的日志路徑
        - name: aliyun_logs_info_tags                        #定義一個tag
          value: "topic=k8s-accounting-info"                 #kafka topic的名字,這個定義是關鍵,不定義這個,日志是無法輸出到kafka內的
        volumeMounts:
        - name: accounting-log
          mountPath: /data/home/logs/accounting
      volumes:
      - name: accounting-log
        emptyDir: {}

6、利用logstash消費kafka內的數據

filter {
       if [topic] =~ "k8s-accounting-info" {
   
		  mutate {
                remove_field => ["input","beat","prospector","logmsg","log","thread","class"]
            }
      } 
}

output {
       if [topic] =~ "k8s-accounting-info" {
          elasticsearch {
                 hosts => ["10.6.11.25:9200","10.6.11.26:9200","10.6.11.27:9200"]
                 user => "elastic"
                 password => "密碼"
                 index => "k8s-accounting-info-%{+YYYY.MM.dd}"  #按日期生成索引
          }
        }   
}

7、修改log-pilot源碼使其可以收集多行日志(以日期開頭,刑如2020-02-29)

7.1 拉取v0.9.5這個tag的代碼

git clone https://github.com/AliyunContainerService/log-pilot.git
cd log-pilot
git tag
git checkout v0.9.5  #指定v0.9.5這個版本

7.2 修改filebeat模板

vim log-pilot/assets/filebeat/filebeat.tpl

{{range .configList}}
- type: log
  enabled: true
  paths:
      - {{ .HostDir }}/{{ .File }}
  multiline.pattern: '^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]' #新增正則條件,以日期開頭
  multiline.negate: true                                           #新增
  multiline.match: after                                           #新增
  multiline.max_lines: 10000                                       #新增
  scan_frequency: 10s
  fields_under_root: true
  {{if .Stdout}}
  docker-json: true
  {{end}}
  {{if eq .Format "json"}}
  json.keys_under_root: true
  {{end}}
  fields:
      {{range $key, $value := .Tags}}
      {{ $key }}: {{ $value }}
      {{end}}
      {{range $key, $value := $.container}}
      {{ $key }}: {{ $value }}
      {{end}}
  tail_files: false
  close_inactive: 2h
  close_eof: false
  close_removed: true
  clean_removed: true
  close_renamed: false

{{end}}

7.3 重新打包鏡像

cd log-pilot/ && ./build-image.sh

打包成功后,鏡像打tag ,並push到私有倉庫 
docker tag 原鏡像名稱  新鏡像名稱
docker push 新鏡像名稱

8 、最后展示一張kibana收集日志的圖例

9、參考博客

https://help.aliyun.com/document_detail/86552.html
https://github.com/AliyunContainerService/log-pilot/issues/101
https://www.iyunw.cn/archives/k8s-tong-guo-log-pilot-cai-ji-ying-yong-ri-zhi-ding-zhi-hua-tomcat-duo-xing/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM