Kubernetes 日志采集 EFK

Kubernetes 日志采集 EFK

文章目录

  !版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。


系统环境:

  • Kubernetes 版本:1.14.0
  • Fluentd 版本:1.4.2
  • ElasticSearch 版本:6.7.0
  • Kibana 版本:6.7.0

资源地址:

一、简单介绍

1、日志采集的必要性

Kubernetes 集群中会编排非常多的服务,各个服务不可能保证服务一定能稳定的运行,于是每个服务都会打印出各自的日志信息方便调试。由于服务的众多,每个服务挨个查看日志显然是一件非常复杂的事情,故而日志的统一收集、整理显得尤为重要。这里用流行方案 EFK 进行日志收集整理工作。

基于云原生十二原则规范,一般要求所有日志信息最好都打印输出到控制台,且打印出的日志都会以 *-json 的命名方式保存在 /var/lib/docker/containers/ 目录下,所以只要指定 Fluentd 收集地址为该目录即可方便进行日志收集工作。

2、Fluentd 简介

Fluentd是一个用于统一日志层的开源数据收集器。使用起来简单而灵活,且能统一记录层,经过全球多家公司实际考验其能力。

3、ElasticSearch 简介

Elasticsearch 是一个分布式的搜索和分析引擎,可以用于全文检索、结构化检索和分析,并能将这三者结合起来。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便,轻松扩展服务节点,更能用于日志收集快速检索等等一些列功能。

4、Kibana 简介

Kibana是一个为Elasticsearch平台分析和可视化的开源平台,使用Kibana能够搜索、展示存储在Elasticsearch中的索引数据。使用它可以很方便用图表、表格、地图展示和分析数据。

二、安装 ElasticSearch、Kibana

请查看 “安装 ElasticSearch & Kibana”

三、日志采集过程

1、具体过程描述

采集过程简单说就是利用 Fluentd 采集 Kubernetes 节点服务器的 "/var/log" 和 "/var/lib/docker/container" 两个目录下的日志信息,然后汇总到 ElasticSearch 集群中,再经过 Kibana 展示的一个过程。

具体日志收集过程如下所述:

  • (1)、创建 Fluentd 并且将 Kubernetes 节点服务器 log 目录挂载进容器;
  • (2)、Fluentd 启动采集 log 目录下的 containers 里面的日志文件;
  • (3)、Fluentd 将收集的日志转换成 JSON 格式;
  • (4)、Fluentd 利用 Exception Plugin 检测日志是否为容器抛出的异常日志,是就将异常栈的多行日志合并;
  • (5)、Fluentd 将换行多行日志 JSON 合并;
  • (6)、Fluentd 使用 Kubernetes Metadata Plugin 检测出 Kubernetes 的 Metadata 数据进行过滤,如 Namespace、Pod Name等;
  • (7)、Fluentd 使用 ElasticSearch 插件将整理完的 JSON 日志输出到 ElasticSearch 中;
  • (8)、ElasticSearch 建立对应索引,持久化日志信息。
  • (9)、Kibana 检索 ElasticSearch 中 Kubernetes 日志相关信息进行展示。

2、简单日志收集过程图

四、准备 Fluentd 配置文件

详情请访问 Kubernetes Fluentd Github地址:https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/fluentd-elasticsearch

1、下载配置文件

下载 Kubernetes ConfigMap 的配置 yaml 文件,里面包含了 Fluentd 采集 Kubernetes 集群日志的相关配置,需要提前将其下载修改一些配置让其更适合我们 Kubernetes 集群日志采集。

1$ https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/fluentd-elasticsearch/fluentd-es-configmap.yaml

2、配置文件分析

下载完后查看配置文件,这里将描述个别重要的配置段。

  1kind: ConfigMap
  2apiVersion: v1
  3metadata:
  4  name: fluentd-es-config-v0.2.0
  5  namespace: kube-system
  6  labels:
  7    addonmanager.kubernetes.io/mode: Reconcile
  8data:
  9  ###### 系统配置,默认即可 #######
 10  system.conf: |-
 11    <system>
 12      root_dir /tmp/fluentd-buffers/
 13    </system>
 14        
 15  ###### 容器日志—收集配置 #######    
 16  containers.input.conf: |-
 17    # ------采集 Kubernetes 容器日志-------
 18    <source>                                  
 19      @id fluentd-containers.log
 20      @type tail                              #---Fluentd 内置的输入方式,其原理是不停地从源文件中获取新的日志。
 21      path /var/log/containers/*.log          #---挂载的服务器Docker容器日志地址
 22      pos_file /var/log/es-containers.log.pos
 23      tag raw.kubernetes.*                    #---设置日志标签
 24      read_from_head true
 25      <parse>                                 #---多行格式化成JSON
 26        @type multi_format                    #---使用multi-format-parser解析器插件
 27        <pattern>
 28          format json                         #---JSON解析器
 29          time_key time                       #---指定事件时间的时间字段
 30          time_format %Y-%m-%dT%H:%M:%S.%NZ   #---时间格式
 31        </pattern>
 32        <pattern>
 33          format /^(?<time>.+) (?<stream>stdout|stderr) [^ ]* (?<log>.*)$/
 34          time_format %Y-%m-%dT%H:%M:%S.%N%:z
 35        </pattern>
 36      </parse>
 37    </source>
 38    
 39    # -----检测Exception异常日志连接到一条日志中------
 40    # 关于插件请查看地址:https://github.com/GoogleCloudPlatform/fluent-plugin-detect-exceptions
 41    <match raw.kubernetes.**>     #---匹配tag为raw.kubernetes.**日志信息
 42      @id raw.kubernetes
 43      @type detect_exceptions     #---使用detect-exceptions插件处理异常栈信息,放置异常只要一行而不完整
 44      remove_tag_prefix raw       #---移出raw前缀
 45      message log                 #---JSON记录中包含应扫描异常的单行日志消息的字段的名称。
 46                                  #   如果将其设置为'',则插件将按此顺序尝试'message'和'log'。
 47                                  #   此参数仅适用于结构化(JSON)日志流。默认值:''。
 48      stream stream               #---JSON记录中包含“真实”日志流中逻辑日志流名称的字段的名称。
 49                                  #   针对每个逻辑日志流单独处理异常检测,即,即使逻辑日志流 的
 50                                  #   消息在“真实”日志流中交织,也将检测到异常。因此,仅组合相
 51                                  #   同逻辑流中的记录。如果设置为'',则忽略此参数。此参数仅适用于
 52                                  #   结构化(JSON)日志流。默认值:''。
 53      multiline_flush_interval 5  #---以秒为单位的间隔,在此之后将转发(可能尚未完成)缓冲的异常堆栈。
 54                                  #   如果未设置,则不刷新不完整的异常堆栈。
 55      max_bytes 500000
 56      max_lines 1000
 57    </match>    
 58  
 59    # -------日志拼接-------
 60    <filter **>
 61      @id filter_concat
 62      @type concat                #---Fluentd Filter插件,用于连接多个事件中分隔的多行日志。
 63      key message
 64      multiline_end_regexp /\n$/  #---以换行符“\n”拼接
 65      separator ""
 66    </filter> 
 67  
 68    # ------过滤Kubernetes metadata数据使用pod和namespace metadata丰富容器日志记录-------
 69    # 关于插件请查看地址:https://github.com/fabric8io/fluent-plugin-kubernetes_metadata_filter
 70    <filter kubernetes.**>
 71      @id filter_kubernetes_metadata
 72      @type kubernetes_metadata
 73    </filter>
 74    
 75    # ------修复ElasticSearch中的JSON字段------
 76    # 关于插件请查看地址:https://github.com/repeatedly/fluent-plugin-multi-format-parser
 77    <filter kubernetes.**>
 78      @id filter_parser
 79      @type parser                #---multi-format-parser多格式解析器插件
 80      key_name log                #---在要解析的记录中指定字段名称。
 81      reserve_data true           #---在解析结果中保留原始键值对。
 82      remove_key_name_field true  #---key_name解析成功后删除字段。
 83      <parse>
 84        @type multi_format
 85        <pattern>
 86          format json
 87        </pattern>
 88        <pattern>
 89          format none
 90        </pattern>
 91      </parse>
 92    </filter>
 93    
 94  ###### Kubernetes集群节点机器上的日志收集 ######    
 95  system.input.conf: |-
 96    # ------Kubernetes minion节点日志信息,可以去掉------
 97    #<source>
 98    #  @id minion
 99    #  @type tail
100    #  format /^(?<time>[^ ]* [^ ,]*)[^\[]*\[[^\]]*\]\[(?<severity>[^ \]]*) *\] (?<message>.*)$/
101    #  time_format %Y-%m-%d %H:%M:%S
102    #  path /var/log/salt/minion
103    #  pos_file /var/log/salt.pos
104    #  tag salt
105    #</source>
106    
107    # ------启动脚本日志,可以去掉------
108    # <source>
109    #   @id startupscript.log
110    #   @type tail
111    #   format syslog
112    #   path /var/log/startupscript.log
113    #   pos_file /var/log/es-startupscript.log.pos
114    #   tag startupscript
115    # </source>
116    
117    # ------Docker 程序日志,可以去掉------
118    # <source>
119    #   @id docker.log
120    #   @type tail
121    #   format /^time="(?<time>[^)]*)" level=(?<severity>[^ ]*) msg="(?<message>[^"]*)"( err="(?<error>[^"]*)")?( statusCode=($<status_code>\d+))?/
122    #   path /var/log/docker.log
123    #   pos_file /var/log/es-docker.log.pos
124    #   tag docker
125    # </source>
126    
127    #------ETCD 日志,因为ETCD现在默认启动到容器中,采集容器日志顺便就采集了,可以去掉------
128    # <source>
129    #   @id etcd.log
130    #   @type tail
131    #   # Not parsing this, because it doesn't have anything particularly useful to
132    #   # parse out of it (like severities).
133    #   format none
134    #   path /var/log/etcd.log
135    #   pos_file /var/log/es-etcd.log.pos
136    #   tag etcd
137    # </source>
138    
139    #------Kubelet 日志------
140    # <source>
141    #   @id kubelet.log
142    #   @type tail
143    #   format multiline
144    #   multiline_flush_interval 5s
145    #   format_firstline /^\w\d{4}/
146    #   format1 /^(?<severity>\w)(?<time>\d{4} [^\s]*)\s+(?<pid>\d+)\s+(?<source>[^ \]]+)\] (?<message>.*)/
147    #   time_format %m%d %H:%M:%S.%N
148    #   path /var/log/kubelet.log
149    #   pos_file /var/log/es-kubelet.log.pos
150    #   tag kubelet
151    # </source>
152    
153    #------Kube-proxy 日志------
154    # <source>
155    #   @id kube-proxy.log
156    #   @type tail
157    #   format multiline
158    #   multiline_flush_interval 5s
159    #   format_firstline /^\w\d{4}/
160    #   format1 /^(?<severity>\w)(?<time>\d{4} [^\s]*)\s+(?<pid>\d+)\s+(?<source>[^ \]]+)\] (?<message>.*)/
161    #   time_format %m%d %H:%M:%S.%N
162    #   path /var/log/kube-proxy.log
163    #   pos_file /var/log/es-kube-proxy.log.pos
164    #   tag kube-proxy
165    # </source>
166    
167    #------kube-apiserver日志------
168    # <source>
169    #   @id kube-apiserver.log
170    #   @type tail
171    #   format multiline
172    #   multiline_flush_interval 5s
173    #   format_firstline /^\w\d{4}/
174    #   format1 /^(?<severity>\w)(?<time>\d{4} [^\s]*)\s+(?<pid>\d+)\s+(?<source>[^ \]]+)\] (?<message>.*)/
175    #   time_format %m%d %H:%M:%S.%N
176    #   path /var/log/kube-apiserver.log
177    #   pos_file /var/log/es-kube-apiserver.log.pos
178    #   tag kube-apiserver
179    # </source>
180
181    #------Kube-controller日志------
182    # <source>
183    #   @id kube-controller-manager.log
184    #   @type tail
185    #   format multiline
186    #   multiline_flush_interval 5s
187    #   format_firstline /^\w\d{4}/
188    #   format1 /^(?<severity>\w)(?<time>\d{4} [^\s]*)\s+(?<pid>\d+)\s+(?<source>[^ \]]+)\] (?<message>.*)/
189    #   time_format %m%d %H:%M:%S.%N
190    #   path /var/log/kube-controller-manager.log
191    #   pos_file /var/log/es-kube-controller-manager.log.pos
192    #   tag kube-controller-manager
193    # </source>
194    
195    #------Kube-scheduler日志------
196    # <source>
197    #   @id kube-scheduler.log
198    #   @type tail
199    #   format multiline
200    #   multiline_flush_interval 5s
201    #   format_firstline /^\w\d{4}/
202    #   format1 /^(?<severity>\w)(?<time>\d{4} [^\s]*)\s+(?<pid>\d+)\s+(?<source>[^ \]]+)\] (?<message>.*)/
203    #   time_format %m%d %H:%M:%S.%N
204    #   path /var/log/kube-scheduler.log
205    #   pos_file /var/log/es-kube-scheduler.log.pos
206    #   tag kube-scheduler
207    # </source>
208    
209    #------glbc日志------
210    # <source>
211    #   @id glbc.log
212    #   @type tail
213    #   format multiline
214    #   multiline_flush_interval 5s
215    #   format_firstline /^\w\d{4}/
216    #   format1 /^(?<severity>\w)(?<time>\d{4} [^\s]*)\s+(?<pid>\d+)\s+(?<source>[^ \]]+)\] (?<message>.*)/
217    #   time_format %m%d %H:%M:%S.%N
218    #   path /var/log/glbc.log
219    #   pos_file /var/log/es-glbc.log.pos
220    #   tag glbc
221    # </source>
222    
223    #------Kubernetes 伸缩日志------
224    # <source>
225    #   @id cluster-autoscaler.log
226    #   @type tail
227    #   format multiline
228    #   multiline_flush_interval 5s
229    #   format_firstline /^\w\d{4}/
230    #   format1 /^(?<severity>\w)(?<time>\d{4} [^\s]*)\s+(?<pid>\d+)\s+(?<source>[^ \]]+)\] (?<message>.*)/
231    #   time_format %m%d %H:%M:%S.%N
232    #   path /var/log/cluster-autoscaler.log
233    #   pos_file /var/log/es-cluster-autoscaler.log.pos
234    #   tag cluster-autoscaler
235    # </source>
236
237    # -------来自system-journal的日志------
238    <source>
239      @id journald-docker
240      @type systemd
241      matches [{ "_SYSTEMD_UNIT": "docker.service" }]
242      <storage>
243        @type local
244        persistent true
245        path /var/log/journald-docker.pos
246      </storage>
247      read_from_head true
248      tag docker
249    </source>
250
251    # -------Journald-container-runtime日志信息------
252    <source>
253      @id journald-container-runtime
254      @type systemd
255      matches [{ "_SYSTEMD_UNIT": "{{ fluentd_container_runtime_service }}.service" }]
256      <storage>
257        @type local
258        persistent true
259        path /var/log/journald-container-runtime.pos
260      </storage>
261      read_from_head true
262      tag container-runtime
263    </source>
264    
265    # -------Journald-kubelet日志信息------
266    <source>
267      @id journald-kubelet
268      @type systemd
269      matches [{ "_SYSTEMD_UNIT": "kubelet.service" }]
270      <storage>
271        @type local
272        persistent true
273        path /var/log/journald-kubelet.pos
274      </storage>
275      read_from_head true
276      tag kubelet
277    </source>
278    
279    # -------journald节点问题检测器------
280    #关于插件请查看地址:https://github.com/reevoo/fluent-plugin-systemd
281    #systemd输入插件,用于从systemd日志中读取日志
282    <source>
283      @id journald-node-problem-detector
284      @type systemd
285      matches [{ "_SYSTEMD_UNIT": "node-problem-detector.service" }]
286      <storage>
287        @type local
288        persistent true
289        path /var/log/journald-node-problem-detector.pos
290      </storage>
291      read_from_head true
292      tag node-problem-detector
293    </source>
294    
295    # -------kernel日志------ 
296    <source>
297      @id kernel
298      @type systemd
299      matches [{ "_TRANSPORT": "kernel" }]
300      <storage>
301        @type local
302        persistent true
303        path /var/log/kernel.pos
304      </storage>
305      <entry>
306        fields_strip_underscores true
307        fields_lowercase true
308      </entry>
309      read_from_head true
310      tag kernel
311    </source>
312        
313  ###### 监听配置,一般用于日志聚合用 ######
314  forward.input.conf: |-
315    #监听通过TCP发送的消息
316    <source>
317      @id forward
318      @type forward
319    </source>    
320
321  ###### Prometheus metrics 数据收集 ######
322  monitoring.conf: |-
323    # input plugin that exports metrics
324    # 输出 metrics 数据的 input 插件
325    <source>
326      @id prometheus
327      @type prometheus
328    </source>
329    <source>
330      @id monitor_agent
331      @type monitor_agent
332    </source>
333    # 从 MonitorAgent 收集 metrics 数据的 input 插件 
334    <source>
335      @id prometheus_monitor
336      @type prometheus_monitor
337      <labels>
338        host ${hostname}
339      </labels>
340    </source>
341    # ------为 output 插件收集指标的 input 插件------
342    <source>
343      @id prometheus_output_monitor
344      @type prometheus_output_monitor
345      <labels>
346        host ${hostname}
347      </labels>
348    </source>
349    # ------为in_tail 插件收集指标的input 插件------
350    <source>
351      @id prometheus_tail_monitor
352      @type prometheus_tail_monitor
353      <labels>
354        host ${hostname}
355      </labels>
356    </source>    
357
358  ###### 输出配置,在此配置输出到ES的配置信息 ######
359  # ElasticSearch fluentd插件地址:https://docs.fluentd.org/v1.0/articles/out_elasticsearch
360  output.conf: |-
361    <match **>
362      @id elasticsearch
363      @type elasticsearch
364      @log_level info     #---指定日志记录级别。可设置为fatal,error,warn,info,debug,和trace,默认日志级别为info。
365      type_name _doc
366      include_tag_key true              #---将 tag 标签的 key 到日志中。
367      host elasticsearch-logging        #---指定 ElasticSearch 服务器地址。
368      port 9200                         #---指定 ElasticSearch 端口号。
369      #index_name fluentd.${tag}.%Y%m%d #---要将事件写入的索引名称(默认值:) fluentd。
370      logstash_format true              #---使用传统的索引名称格式logstash-%Y.%m.%d,此选项取代该index_name选项。
371      #logstash_prefix logstash         #---用于logstash_format指定为true时写入logstash前缀索引名称,默认值:logstash。
372      <buffer>
373        @type file                      #---Buffer 插件类型,可选file、memory
374        path /var/log/fluentd-buffers/kubernetes.system.buffer
375        flush_mode interval
376        retry_type exponential_backoff  #---重试模式,可选为exponential_backoff、periodic。
377                                        #   exponential_backoff 模式为等待秒数,将在每次失败时成倍增长
378        flush_thread_count 2
379        flush_interval 10s
380        retry_forever
381        retry_max_interval 30           #---丢弃缓冲数据之前的尝试的最大间隔。
382        chunk_limit_size 5M             #---每个块的最大大小:事件将被写入块,直到块的大小变为此大小。
383        queue_limit_length 8            #---块队列的长度。
384        overflow_action block           #---输出插件在缓冲区队列已满时的行为方式,有throw_exception、block、
385                                        #   drop_oldest_chunk,block方式为阻止输入事件发送到缓冲区。
386      </buffer>
387    </match>    

3、定制配置并调整参数

创建 fluentd-es-config.yaml 文件

1$ vi fluentd-es-config.yaml

添加如下内容:

  1kind: ConfigMap
  2apiVersion: v1
  3metadata:
  4  name: fluentd-es-config
  5  namespace: logging
  6  labels:
  7    addonmanager.kubernetes.io/mode: Reconcile
  8data:
  9  #------系统配置参数-----
 10  system.conf: |-
 11    <system>
 12      root_dir /tmp/fluentd-buffers/
 13    </system>    
 14  #------Kubernetes 容器日志收集配置------
 15  containers.input.conf: |-
 16    <source>
 17      @id fluentd-containers.log
 18      @type tail
 19      path /var/log/containers/*.log
 20      pos_file /var/log/es-containers.log.pos
 21      tag raw.kubernetes.*
 22      read_from_head true
 23      <parse>
 24        @type multi_format
 25        <pattern>
 26          format json
 27          time_key time
 28          time_format %Y-%m-%dT%H:%M:%S.%NZ
 29        </pattern>
 30        <pattern>
 31          format /^(?<time>.+) (?<stream>stdout|stderr) [^ ]* (?<log>.*)$/
 32          time_format %Y-%m-%dT%H:%M:%S.%N%:z
 33        </pattern>
 34      </parse>
 35    </source>
 36    <match raw.kubernetes.**>
 37      @id raw.kubernetes
 38      @type detect_exceptions
 39      remove_tag_prefix raw
 40      message log
 41      stream stream
 42      multiline_flush_interval 5
 43      max_bytes 500000
 44      max_lines 1000
 45    </match>
 46    <filter **>
 47      @id filter_concat
 48      @type concat
 49      key message
 50      multiline_end_regexp /\n$/
 51      separator ""
 52    </filter>
 53    <filter kubernetes.**>
 54      @id filter_kubernetes_metadata
 55      @type kubernetes_metadata
 56    </filter>
 57    <filter kubernetes.**>
 58      @id filter_parser
 59      @type parser
 60      key_name log
 61      reserve_data true
 62      remove_key_name_field true
 63      <parse>
 64        @type multi_format
 65        <pattern>
 66          format json
 67        </pattern>
 68        <pattern>
 69          format none
 70        </pattern>
 71      </parse>
 72    </filter>    
 73  #------系统日志收集-------
 74  system.input.conf: |-  
 75    <source>
 76      @id journald-docker
 77      @type systemd
 78      matches [{ "_SYSTEMD_UNIT": "docker.service" }]
 79      <storage>
 80        @type local
 81        persistent true
 82        path /var/log/journald-docker.pos
 83      </storage>
 84      read_from_head true
 85      tag docker
 86    </source>
 87    <source>
 88      @id journald-container-runtime
 89      @type systemd
 90      matches [{ "_SYSTEMD_UNIT": "{{ fluentd_container_runtime_service }}.service" }]
 91      <storage>
 92        @type local
 93        persistent true
 94        path /var/log/journald-container-runtime.pos
 95      </storage>
 96      read_from_head true
 97      tag container-runtime
 98    </source>
 99    <source>
100      @id journald-kubelet
101      @type systemd
102      matches [{ "_SYSTEMD_UNIT": "kubelet.service" }]
103      <storage>
104        @type local
105        persistent true
106        path /var/log/journald-kubelet.pos
107      </storage>
108      read_from_head true
109      tag kubelet
110    </source>
111    <source>
112      @id journald-node-problem-detector
113      @type systemd
114      matches [{ "_SYSTEMD_UNIT": "node-problem-detector.service" }]
115      <storage>
116        @type local
117        persistent true
118        path /var/log/journald-node-problem-detector.pos
119      </storage>
120      read_from_head true
121      tag node-problem-detector
122    </source>
123    <source>
124      @id kernel
125      @type systemd
126      matches [{ "_TRANSPORT": "kernel" }]
127      <storage>
128        @type local
129        persistent true
130        path /var/log/kernel.pos
131      </storage>
132      <entry>
133        fields_strip_underscores true
134        fields_lowercase true
135      </entry>
136      read_from_head true
137      tag kernel
138    </source>
139  #------输出到 ElasticSearch 配置------
140  output.conf: |-
141    <match **>
142      @id elasticsearch
143      @type elasticsearch
144      @log_level info
145      type_name _doc
146      include_tag_key true
147      host elasticsearch-client     #改成自己的 ElasticSearch 地址
148      port 9200
149      logstash_format true
150      logstash_prefix kubernetes
151      logst
152      <buffer>
153        @type file
154        path /var/log/fluentd-buffers/kubernetes.system.buffer
155        flush_mode interval
156        retry_type exponential_backoff
157        flush_thread_count 5
158        flush_interval 8s
159        retry_forever
160        retry_max_interval 30
161        chunk_limit_size 5M
162        queue_limit_length 10
163        overflow_action block
164        compress gzip               #开启gzip提高日志采集性能
165      </buffer>
166    </match>    

五、安装 Fluentd

1、创建 Fluentd ConfigMap

1$ kubectl apply -f fluentd-es-config.yaml

2、创建 Flunetd ServiceAccount

创建 fluentd-rbac.yaml 文件

1$ vi fluentd-rbac.yaml

添加如下内容:

 1apiVersion: v1
 2kind: ServiceAccount
 3metadata:
 4  name: fluentd-es
 5  namespace: logging
 6  labels:
 7    k8s-app: fluentd-es
 8    addonmanager.kubernetes.io/mode: Reconcile
 9---
10kind: ClusterRole
11apiVersion: rbac.authorization.k8s.io/v1
12metadata:
13  name: fluentd-es
14  labels:
15    k8s-app: fluentd-es
16    addonmanager.kubernetes.io/mode: Reconcile
17rules:
18- apiGroups:
19  - ""
20  resources:
21  - "namespaces"
22  - "pods"
23  verbs:
24  - "get"
25  - "watch"
26  - "list"
27---
28kind: ClusterRoleBinding
29apiVersion: rbac.authorization.k8s.io/v1
30metadata:
31  name: fluentd-es
32  labels:
33    k8s-app: fluentd-es
34    addonmanager.kubernetes.io/mode: Reconcile
35subjects:
36- kind: ServiceAccount
37  name: fluentd-es
38  namespace: logging
39  apiGroup: ""
40roleRef:
41  kind: ClusterRole
42  name: fluentd-es
43  apiGroup: ""

创建 Fluentd ServiceAccount

1$ kubectl apply -f fluentd-rbac.yaml

3、创建 Fluentd PriorityClass

当节点出现问题时,优先级低的 Pod 在资源不足时,容易首先被驱逐,因而对于重要的 daemonset 或者重要的应用组件,用户可以设置较高的优先级防止被抢占。这里创建一个优先级资源,方便后面应用到 fluentd。

创建 fluentd-rbac.yaml 文件

1$ vi fluentd-priorityclass.yaml

创建 fluenntd-priorityclass.yaml

1apiVersion: scheduling.k8s.io/v1beta1
2kind: PriorityClass
3metadata:
4  name: fluentd-priority
5value: 1000000
6globalDefault: false
7description: ""

创建 Fluentd PriorityClass

1$ kubectl apply -f fluentd-priorityclass.yaml

4、创建 Fluentd DaemonSet

创建 fluentd-rbac.yaml 文件

1$ vi fluentd.yaml

添加如下内容:

 1apiVersion: apps/v1
 2kind: DaemonSet
 3metadata:
 4  name: fluentd-es
 5  namespace: logging
 6  labels:
 7    k8s-app: fluentd-es
 8    version: v2.5.2
 9    addonmanager.kubernetes.io/mode: Reconcile
10spec:
11  selector:
12    matchLabels:
13      k8s-app: fluentd-es
14      version: v2.5.2
15  template:
16    metadata:
17      labels:
18        k8s-app: fluentd-es
19        version: v2.5.2
20      #此注释确保如果节点被驱逐,fluentd不会被驱逐
21      #支持关键的基于pod注释的优先级方案。
22      annotations:
23        scheduler.alpha.kubernetes.io/critical-pod: ''
24        seccomp.security.alpha.kubernetes.io/pod: 'docker/default'
25    spec:
26      priorityClassName: fluentd-priority     #给 Fluentd 设置优先级资源
27      serviceAccountName: fluentd-es          #给 Fluentd 分配权限账户
28      #设置容忍所有污点,这样可以收集所有节点日志如 Master 节点一般都被设污,不设置无法在其节点启动 fluentd。
29      tolerations:                            
30      - operator: "Exists"
31      containers:
32      - name: fluentd-es
33        image: mydlqclub/fluentd-elasticsearch:v2.5.2
34        env:
35        - name: FLUENTD_ARGS
36          value: --no-supervisor -q     #不启用管理,-q 命令用平静时期于减少warn级别日志(-qq:减少error日志)
37        resources:
38          limits:
39            memory: 500Mi
40          requests:
41            cpu: 100m
42            memory: 200Mi
43        volumeMounts:
44        - name: varlog
45          mountPath: /var/log
46        - name: varlibdockercontainers
47          mountPath: /var/lib/docker/containers
48          readOnly: true
49        - name: config-volume
50          mountPath: /etc/fluent/config.d
51      terminationGracePeriodSeconds: 30      #Kubernetes 将会给应用发送SIGTERM信号,用来优雅地关闭应用
52      volumes:
53      - name: varlog                         #将 Kubernetes 节点服务器日志目录挂入
54        hostPath:
55          path: /var/log
56      - name: varlibdockercontainers         #挂入 Docker 容器日志目录
57        hostPath:
58          path: /var/lib/docker/containers
59      - name: config-volume                  #挂入 Fluentd 的配置参数
60        configMap:
61          name: fluentd-es-config
  • PS:由于谷歌镜像不可访问,所以上面镜像为本人自己发布到 docker 官方镜像仓库中的镜像。
  • 镜像地址: mydlqclub/fluentd-elasticsearch:v2.5.2
  • 镜像 Github 地址: https://github.com/my-dlq/fluentd-elasticsearch

创建 Fluentd

1$ kubectl apply -f fluentd.yaml

5、查看 Fluentd 相关资源

  • -n:指定namespace,如果namespace是跟我不一致,请换到对应的 namespace
1$ kubectl get pod,daemonset -n logging | grep fluent
2
3pod/fluentd-es-cw6tj                        1/1     Running   0          2m45s
4pod/fluentd-es-lt4cz                        1/1     Running   0          2m45s
5pod/fluentd-es-x6hfg                        1/1     Running   0          2m45s
6pod/fluentd-es-zpxql                        1/1     Running   0          2m45s
7
8daemonset.extensions/fluentd-es     4     4     4     4    4   <none>    2m46s

六、Kibana 查看采集的日志信息

1、Kibana 设置索引

(1)、Kibana 中设置检索的索引

由于在 Fluentd 输出配置中配置了 “logstash_prefix kubernetes” 这个参数,所以索引是以 kubernetes 为前缀显示,如果未设置则默认为 “logstash” 为前缀。

2、Kibana 查看 Kubernetes 日志信息


  !版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。