私有部署ELK,搭建自己的日志中心(五)-- 使用filebeat采集K8S pod的jvm日志
一、背景
前文采集的日志是来源于虚拟机,在云原生下的容器化部署时,需要采集Pod里的jvm日志。
二、术语
1、临时存储emptyDir
emptyDir在Pod被分配到Node时创建的,它的初始内容为空,并且无须指定宿主机上对应的目录文件,因为kubernetes会自动分配一个目录,当Pod销毁时,EmptyDir中的数据也会被永久删除,所以也被称为临时存储。
2、ConfigMap
filebeat.yml保存在配置存储ConfigMap里,filebeat进程加载该文件。
filebeat -c /etc/filebeat.yml
三、整体设计
在同一个pod里,使用sidecar模式再部署一个filebeat容器,由它读取jvm容器输出的日志文件。
filebeat本身启动的时候,配置文件filebeat.yml挂载到configMap,供我们方便修改。
filebeat要读取jvm容器的日志文件,通过emptyDir共享日志文件;前者负责读取,后者负责写入。
四、deployment.yaml
1、增加filebeat容器
containers:
- name: filebeat-container
env:
- name: APPNAME
value: {{ .Values.appName }}
image: docker.elastic.co/beats/filebeat:8.0.1
args:
- -c
- /etc/filebeat.yml
volumeMounts:
- name: storage-logs
mountPath: /opt/{{ .Values.appName }}/logs
- name: filebeat-volume
mountPath: /etc/filebeat.yml
readOnly: true
subPath: filebeat.yml
- 创建一个名称为storage-logs的临时存储emptyDir
volumes:
- name: storage-logs
emptyDir: {}
- jvm容器把日志文件挂载到storage-logs
volumeMounts:
- mountPath: /opt/{{ .Values.appName }}/logs
name: storage-logs
2、ConfigMap配置存储
新增一个名称为filebeat-volume的ConfigMap
volumes:
- name: storage-logs
emptyDir: {}
#################
- configMap:
name: filebeat-config
name: filebeat-volume
配置存储新增一个名称为filebeat-config的配置:
下面的截图,可以看出,key值对应上文的“subPath: filebeat.yml”
- yaml详情
kind: ConfigMap
apiVersion: v1
metadata:
name: filebeat-config
namespace: java-service
data:
#对应上文 subPath: filebeat.yml
filebeat.yml: |
filebeat.inputs:
- type: log
enabled: true
backoff: "1s"
tail_files: false
paths:
- /opt/*/logs/*.log
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
multiline.negate: false
multiline.match: after
document_type: jvm
fields:
app: ${APPNAME}
output.logstash:
enabled: true
hosts: ["192.168.8.29:5044"]
3、jvm容器修改日志的存储
由nfs调整为emptyDir:
- 修改前:
- name: {{ .Values.appName }}
volumeMounts:
- mountPath: /opt/{{ .Values.appName }}/logs
name: volume-resources
subPath: logs
volumes:
- name: volume-resources
persistentVolumeClaim:
claimName: application-resources
- 修改后:
- name: {{ .Values.appName }}
volumeMounts:
- mountPath: /opt/{{ .Values.appName }}/logs
name: storage-logs
volumes:
- name: storage-logs
emptyDir: {}
五、总结
1、一定要让filebeat能够读取到被采集的日志,比如本文就是采用emptydir临时文件的方式共享。
2、filebeat容器本身启动的时候,注意需加载filebeat,yml配置。这里使用了args的方式指定配置文件所在路径。
args:
- -c
- /etc/filebeat.yml
而/etc/filebeat.yml是挂载到configMap。
这一块踩过的坑就是,没有启动filebeat进程。所以这个必不可少,再次提醒。
3、由于整个deployment.yaml比较大,我就不详细贴出来其内容。而且不同的公司不一,需要你基于原本的配置修改。
下面仅以截图示意:
这就是k8s的边车模式,除了适用于本文的日志采集方案,还可以被用来做监控、证书管理等。