Loggie Sidecar方式采集日志

虽然默认不推荐使用Sidecar方式采集容器日志,但是在某些受限场景下只能选择使用Sidecar的方式采集容器日志,这里我们给出一个参考的示例。

总体思路

如下图所示: Sidecar方式采集日志 - 图1

Loggie和业务container部署在同一个Pod里,同时需要挂载相同的日志文件volume,另外Loggie的配置可通过configMap的方式挂载到容器中,Loggie根据提供的configMap配置文件,采集容器的日志,并发送到后端。

注入Loggie sidecar

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. labels:
  5. app: tomcat
  6. name: tomcat
  7. namespace: default
  8. spec:
  9. replicas: 1
  10. selector:
  11. matchLabels:
  12. app: tomcat
  13. template:
  14. metadata:
  15. labels:
  16. app: tomcat
  17. spec:
  18. containers:
  19. - name: tomcat
  20. image: tomcat
  21. volumeMounts:
  22. - mountPath: /usr/local/tomcat/logs
  23. name: log
  24. - name: loggie
  25. args:
  26. - -config.system=/opt/loggie/loggie.yml
  27. - -config.pipeline=/opt/loggie/pipeline.yml
  28. image: loggieio/loggie:main
  29. volumeMounts:
  30. # loggie和业务container挂载相同的log volume
  31. - mountPath: /usr/local/tomcat/logs
  32. name: log
  33. # 挂载日志配置configMap
  34. - mountPath: /opt/loggie
  35. name: loggie-config
  36. # 挂载loggie自身持久化的数据
  37. - mountPath: /data
  38. name: registry
  39. volumes:
  40. - emptyDir: {}
  41. name: log
  42. - emptyDir: {}
  43. name: registry
  44. - name: loggie-config
  45. configMap:
  46. name: tomcat-loggie-config
  47. ---
  48. apiVersion: v1
  49. kind: ConfigMap
  50. metadata:
  51. name: tomcat-loggie-config
  52. namespace: default
  53. data:
  54. loggie.yml: |
  55. loggie:
  56. reload:
  57. enabled: true
  58. period: 10s
  59. monitor:
  60. logger:
  61. period: 30s
  62. enabled: true
  63. listeners:
  64. filesource: ~
  65. filewatcher: ~
  66. reload: ~
  67. sink: ~
  68. http:
  69. enabled: true
  70. port: 9196
  71. pipeline.yml: |
  72. pipelines:
  73. - name: "tomcat"
  74. sources:
  75. - type: "file"
  76. name: "tomcatlog"
  77. paths:
  78. - "/usr/local/tomcat/logs/*.log"
  79. fields:
  80. namespace: default
  81. deployment: tomcat
  82. fieldsFromEnv:
  83. podname: HOSTNAME
  84. sink:
  85. type: "dev"
  86. printEvents: true
  87. codec:
  88. pretty: true

可以参考以上的部署方式通过loggie sidecar采集容器日志。
需要注意的是:

  • 目前不建议在配置文件中enable kubernetes discovery,由于打开后会请求Kubernetes,在Pods比较多的时候,会对Kubernetes造成一定压力,所以无法使用LogConfig CRD,需要使用configMap挂载配置文件。
  • 由于不使用Kubernetes discovery,这里的fields并不会被自动加上Pod的元信息,需要使用fieldsFromEnv的方式从Pod的环境变量里获取。

Tips

  • namespace等固定信息可以配置到fields里,也可以通过使用downward API的方式引用到env里
  • fieldsFromEnv获取到的Env环境变量不仅仅局限在Pod yaml里配置的env字段,Loggie容器里任意的环境变量均可,我们可以在容器里执行env命令查看。

  • 修改configMap中的参数,需要经过一段时间后才会被刷新到Pod里,如果希望立即生效,需要重建Pod,请注意是否影响业务

Info

Loggie后续会支持自动Sidecar注入和通过LogConfig自动生成ConfigMap挂载的方式,从而达到和使用DaemonSet一致的体验。