k8s 容器控制台日志收集
1、收集方案。
通过DaemonSet方式部署filebeat 收集各节点日志。写入logstash中处理,最后写入es。
2、优势及缺点
优点: 如果业务里面把日志全部往控制台输出,对于日志管理是非常的方便的。当删除容器了,日志文件也就没有了,所有不需要额外再写脚本全定时管理日志,
缺点; 如果业务中有多种日志需要收集,当然也就可以通过logstash来做,只不过比较麻烦。还需要业务协调
3.filebeat 配置
创建configmap用于管理filbeat配置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | apiVersion: v1 kind: ConfigMap metadata: name: filebeat-config namespace: test data: filebeat.yml: | filebeat.inputs: - type : log enabled: true paths: - /var/log/pods/ */*/*.log json.overwrite_keys: true symlinks: true json.message_key: log json.keys_under_root: true multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}' multiline.negate: true multiline.match: after json.add_error_key: true output.logstash: hosts: [ "your_logstash" ]<br><br> #paths中的正则会匹配k8s中所有的pod控制台日志。<br>#symlinks: true 文件是软件连接形式到docker目录中去的 所以这个开关需要开启Ture<br><br> |
4、filebeat DaemonSet yaml文件
apiVersion: extensions/v1beta1 kind: DaemonSet metadata: name: filebeat namespace: test labels: app: filebeat k8s-app: filebeat kubernetes.io/cluster-service: "true" spec: template: metadata: labels: k8s-app: filebeat kubernetes.io/cluster-service: "true" spec: tolerations: - key: "node-role.kubernetes.io/master" operator: "Exists" effect: "NoSchedule" containers: - args: - '--path.config' - /etc/filebeat name: filebeat image: your images imagePullPolicy: Always resources: limits: memory: 200Mi requests: cpu: 100m memory: 200Mi volumeMounts: - name: varlog mountPath: /var/ - name: filebeat-config mountPath: /etc/filebeat/ terminationGracePeriodSeconds: 30 volumes: - name: varlog hostPath: path: /var/ - name: varlibdockercontainers - name: filebeat-config configMap: name: filebeat-config
filebeat Dockerfile
1 2 | from store /elastic/filebeat :7.3.0 USER root<br><br> #运行用户改成root不然会有权限问题 |
logstash 配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | input { beats { port => "5044" } } filter { ruby { code => "<br> ####处理收集的文件的目录 根据目录名字输出到不同的索引 project = event.get( 'source' ). split ( '/' ) project.each do |temp2| if temp2.nil? then next end key = 'project' value = project[-2] if key.nil? then next end event. set (key, value) end " } } output { elasticsearch { hosts => [ "es:9200" ] index => "%{project}-%{+YYYY.MM}" } } |
logstash Dockerfile
1 2 3 4 | from docker.elastic.co /logstash/logstash :6.1.1 USER root RUN yum -y install vim RUN echo "xpack.monitoring.enabled: false" >> /usr/share/logstash/config/logstash .yml<br><br> #docker run -it -v your_config:/home/logstash.yml your_image -f /home/logstash.yml |
总结
当创建一个pod时候,会自动收集这个pod的日志,并以项目名为索引写入es,无需在添加其他配。当然如果业务栈比较广,有java也有go等等语言的,日志格式就不是一个标准了,处理比较麻烦,对于logstash来说那都不是事,
1 | ruby 插件支持ruby语法,处理起来很方便,多写几个 if 判断就行了哈哈。可以参考上面 |
Welcome to visit
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?