Fluent собирает анализ журнала кластера kubernetes

Kubernetes

EFK (Elasticsearch + Fluentd + Kibana) — это решение для сбора журналов, официально рекомендованное kubernetes.CNCFВыпускной. Прежде чем начать, я надеюсь, вы прочиталиАнализ журнала контейнера Docker, это второе его расширение.

УведомлениеЕго нужно отличать от ELK (Elasticsearch + Logstash + Kibana) и EFK (Elasticsearch + Filebeat + Kibana), последний EFKв целомявляется родным развертыванием.

CNCF, Полное название — Cloud Native Computing Foundation (Фонд облачных вычислений), и kubernetes также является его дочерним предприятием, или большинство контейнерных облачных проектов — его дочерним предприятием.

Развертывание EFK

Для развертывания efk в k8s используется файл yaml вGitHub.com/Это так особенно/…, вы можете скачать его с помощью скрипта, представленного в приложении к статье.

Выполнить после завершения загрузкиcd fluentd-elasticsearch && kubectl apply -f .команда для развертывания.

Проверьте сервисы elasticsearch и kibana:

$ kubectl get svc -n kube-system
NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
elasticsearch-logging   NodePort    10.97.248.209    <none>        9200:32126/TCP   23d
kibana-logging          ClusterIP   10.103.126.183   <none>        5601/TCP         23d

Проверьте Fluentd Daemonset:

$ kubectl get ds -n kube-system
NAME                    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                   AGE
fluentd-es-v2.4.0       2         2         2       2            2           <none>                          23d

Здесь мы знаем, что FluentD работает в daemonset, ES и KIBANA — это сервисные методы.

УведомлениеФайл развертывания по умолчанию для elasticsearch не является постоянным. Если требуется сохранение, вам необходимо настроить его параметры PVC.

беглый функциональный анализ

  1. Глядя на тип флюктуации, сказать нечего

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: fluentd-es-v2.2.1
      namespace: kube-system
    
  2. Просмотр коллекции журналов Fluented

    containers:
    - name: fluentd-es
    image: k8s.gcr.io/fluentd-elasticsearch:v2.2.0
    
    ...
    
    volumeMounts:
    - name: varlog
      mountPath: /var/log
    - name: varlibdockercontainers
      mountPath: /var/lib/docker/containers
      readOnly: true
    - name: config-volume
      mountPath: /etc/fluent/config.d
    
    ...
    
    volumes:
    - name: varlog
    hostPath:
      path: /var/log
    - name: varlibdockercontainers
    hostPath:
      path: /var/lib/docker/containers
    - name: config-volume
    configMap:
      name: fluentd-es-config-v0.1.6
    

    Здесь хорошо видно, что fluentd работает в режиме daemonset, а затем система/var/lib/docker/containersMount, это каталог, в котором мы находимсяАнализ журнала контейнера DockerКак показано в разделе , это путь хранения журнала контейнера докеров, поэтому fluentd завершает чтение журнала контейнера по умолчанию.

    Конфигурационный файл fluentd загружается в виде configmap, продолжайте смотреть вниз.

  3. Сбор конфигурации журнала контейнера

    Собирайте журналы контейнеров в основном вcontainers.input.conf,следующее:

    <source>
      @id fluentd-containers.log
      @type tail
      path /var/log/containers/*.log
      pos_file /var/log/es-containers.log.pos
      tag raw.kubernetes.*
      read_from_head true
      <parse>
        @type multi_format
        <pattern>
          format json
          time_key time
          time_format %Y-%m-%dT%H:%M:%S.%NZ
        </pattern>
        <pattern>
          format /^(?<time>.+) (?<stream>stdout|stderr) [^ ]* (?<log>.*)$/
          time_format %Y-%m-%dT%H:%M:%S.%N%:z
        </pattern>
      </parse>
    </source>
    

    Осторожно, вы обнаружите, что контейнер каталога смонтирован/var/lib/docker/containers, все журналы должны быть здесь, но настроенный каталог прослушивания/var/log/containers. Официальные заметки даны интимно, основное содержание таково:

     # Example
        # =======
        # ...
        #
        # The Kubernetes fluentd plugin is used to write the Kubernetes metadata to the log
        # record & add labels to the log record if properly configured. This enables users
        # to filter & search logs on any metadata.
        # For example a Docker container's logs might be in the directory:
        #
        #  /var/lib/docker/containers/997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b
        #
        # and in the file:
        #
        #  997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b-json.log
        #
        # where 997599971ee6... is the Docker ID of the running container.
        # The Kubernetes kubelet makes a symbolic link to this file on the host machine
        # in the /var/log/containers directory which includes the pod name and the Kubernetes
        # container name:
        #
        #    synthetic-logger-0.25lps-pod_default_synth-lgr-997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b.log
        #    ->
        #    /var/lib/docker/containers/997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b/997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b-json.log
        #
        # The /var/log directory on the host is mapped to the /var/log directory in the container
        # running this instance of Fluentd and we end up collecting the file:
        #
        #   /var/log/containers/synthetic-logger-0.25lps-pod_default_synth-lgr-997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b.log
        #
    
  4. загрузка журнала в elasticsearch

    output.conf: |-
        <match **>
          @id elasticsearch
          @type elasticsearch
          @log_level info
          type_name _doc
          include_tag_key true
          host elasticsearch-logging
          port 9200
          logstash_format true
          <buffer>
            @type file
            path /var/log/fluentd-buffers/kubernetes.system.buffer
            flush_mode interval
            retry_type exponential_backoff
            flush_thread_count 2
            flush_interval 5s
            retry_forever
            retry_max_interval 30
            chunk_limit_size 2M
            queue_limit_length 8
            overflow_action block
          </buffer>
        </match>
    

    Обратите внимание, чтоhostиport, которые определены в службе elasticsearch и должны быть согласованы при изменении. Fluentd также поддерживает загрузку данных журнала во внешний эластичный поиск, который является родным elk/efk, упомянутым выше.

приложение

  1. Архитектура

logging-with-node-agent

  1. Скачать файл скриптаdownload.sh

    for file in es-service es-statefulset fluentd-es-configmap fluentd-es-ds kibana-deployment kibana-service; do curl -o $file.yaml https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/fluentd-elasticsearch/$file.yaml; done
    
  2. Ссылка на ссылку: