Kubernetes 日志搜集方案使用的是 ELK 方案,采集流程也很简单。方案介绍可以参考:基于ELK的日志平台介绍 - InfoQ 写作平台
一、Filebeat
	为每一个 Node 节点部署一个 Filebeat,由于 Node 节点弹出、删除是随机的,所以需要以守护进程集 DaemonSet 的形式运行。这样可以保证每新增、删除 Node 的时候,Filebeat 的客户端会随着变化。
DaemonSet yml 参考
 kind: DaemonSetapiVersion: apps/v1metadata:  name: filebeat  namespace: elk  labels:    k8s-app: filebeatspec:  selector:    matchLabels:      k8s-app: filebeat    spec:      volumes:        - name: config          configMap:            name: filebeat-config            defaultMode: 384      containers:        - name: filebeat          image: 'docker.elastic.co/beats/filebeat:7.8.1'          args:            - '-c'            - /etc/filebeat.yml            - '-e'          env:            - name: NODE_NAME              valueFrom:                fieldRef:                  apiVersion: v1                  fieldPath: spec.nodeName          volumeMounts:            - name: config              readOnly: true              mountPath: /etc/filebeat.yml              subPath: filebeat.yml            - name: data              mountPath: /usr/share/filebeat/data            - name: varlibdockercontainers              readOnly: true              mountPath: /var/lib/docker/containers            - name: varlog              readOnly: true              mountPath: /var/log
   复制代码
 
filebeat-config
 filebeat.inputs:- type: container  paths:    - /var/log/containers/*.log  processors:    - add_kubernetes_metadata:        host: ${NODE_NAME}        matchers:        - logs_path:            logs_path: "/var/log/containers/"
output.kafka:  hosts: ["kafka1:9092", "kafka2:9092", "kafka3:9092"]  topic: k8slogs  required_acks: 1  compression: gzip  max_message_bytes: 1000000
   复制代码
 二、Logstash
	Filebeat 采集的日志进入 Kafka 指定的 Topic 后,使用 Logstash 进行消费。具体日志的清洗规则在 logstash.conf 定义。
logstash.yaml
 kind: DeploymentapiVersion: apps/v1metadata:  name: logstashnhk8s  namespace: elk  labels:    app: logstashnhk8s  annotations:    deployment.kubernetes.io/revision: '1'spec:  replicas: 2  selector:    matchLabels:      app: logstashnhk8s    spec:      volumes:        - name: logstashnhk8s          configMap:            name: logstashnhk8s            defaultMode: 420      containers:        - name: logstash          image: 'hubstore.com.cn/elastic/logstash:7.8.1'          resources: {}          volumeMounts:            - name: logstashnhk8s              mountPath: /usr/share/logstash/pipeline/logstash.conf              subPath: logstash.conf
   复制代码
 三、Kibana
	Logstash 清洗的日志写入 ES 之后,通过 Kibana 展示,这个和之前介绍的 ELK 平台用法完全一样。
四、结论语
	云原生下的日志搜集方法还有 Loki 的方案,但是我这里为了和老的日志平台保持一致,就继续采用了 ELK。当然 ELK 的 helm chart 也是有的,如果觉得手动一个个组件部署比较麻烦,可以直接使用 helm。
	ELK 日志搜集是从几年前使用到现在比较完善的日志方案,运行了这么长时间,也发现整个方案对 ElasticSearch 的要求特别高。实际上并发写的频率远大于读,所以也在看是否有新方案可以进行优化、替代。
评论