利用 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:9092ELK集群10.6.11.25:9200 10.6.11.26:9200 10.6.11.27:9200k8s集群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、日志收集系统架构

4、log-pilot部署

阿里提供的例子是把日志输出给es,这里因为使用了kafka,所以部署的yaml较官方的来说,有一点点的变化,如下所示:

apiVersion: extensions/v1beta1kind: DaemonSetmetadata: name: log-pilot labels: k8s-app: log-pilot namespace: kube-systemspec: 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/v1kind: Deploymentmetadata: name: accounting namespace: kube-ops labels: app: accountingspec: 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.gitcd log-pilotgit taggit 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.htmlhttps://github.com/AliyunContainerService/log-pilot/issues/101https://www.iyunw.cn/archives/k8s-tong-guo-log-pilot-cai-ji-ying-yong-ri-zhi-ding-zhi-hua-tomcat-duo-xing/

相关文章