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.
беглый функциональный анализ
-
Глядя на тип флюктуации, сказать нечего
apiVersion: apps/v1 kind: DaemonSet metadata: name: fluentd-es-v2.2.1 namespace: kube-system
-
Просмотр коллекции журналов 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/containers
Mount, это каталог, в котором мы находимсяАнализ журнала контейнера DockerКак показано в разделе , это путь хранения журнала контейнера докеров, поэтому fluentd завершает чтение журнала контейнера по умолчанию.Конфигурационный файл fluentd загружается в виде configmap, продолжайте смотреть вниз.
-
Сбор конфигурации журнала контейнера
Собирайте журналы контейнеров в основном в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 #
-
загрузка журнала в 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, упомянутым выше.
приложение
- Архитектура
-
Скачать файл скрипта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
-
Ссылка на ссылку: