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 的要求特别高。实际上并发写的频率远大于读,所以也在看是否有新方案可以进行优化、替代。
评论