Kubernetes 日志搜集方案使用的是 ELK 方案,采集流程也很简单。方案介绍可以参考:基于ELK的日志平台介绍 - InfoQ 写作平台
一、Filebeat
为每一个 Node 节点部署一个 Filebeat,由于 Node 节点弹出、删除是随机的,所以需要以守护进程集 DaemonSet 的形式运行。这样可以保证每新增、删除 Node 的时候,Filebeat 的客户端会随着变化。
DaemonSet yml 参考
kind: DaemonSet
apiVersion: apps/v1
metadata:
name: filebeat
namespace: elk
labels:
k8s-app: filebeat
spec:
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: Deployment
apiVersion: apps/v1
metadata:
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 的要求特别高。实际上并发写的频率远大于读,所以也在看是否有新方案可以进行优化、替代。
评论