Как установить стек логирования Elasticsearch, Fluentd и Kibana (EFK) на Ubuntu 22.04
Установка EFK
· 15 min read · Dec 18, 2025
Как установить стек логирования Elasticsearch, Fluentd и Kibana (EFK) на Ubuntu 22.04
Мониторинг и анализ логов являются важной частью серверной или контейнерной инфраструктуры и полезны при работе с комплексными приложениями. Одним из популярных решений для логирования является стек Elasticsearch, Fluentd и Kibana (EFK). Прежде чем углубиться в руководство, давайте узнаем о компонентах стека.
Elasticsearch — это распределенная и масштабируемая поисковая система в реальном времени, которая позволяет выполнять полнотекстовый поиск и аналитику. Она используется для индексации и поиска больших объемов данных. Обычно она развертывается вместе с Kibana, мощной панелью визуализации данных для Elasticsearch. Kibana позволяет вам исследовать данные логов Elasticsearch и создавать панели и запросы для получения информации о вашем приложении. Fluentd собирает, преобразует и отправляет данные логов на сервер Elasticsearch.
В этом руководстве мы установим стек EFK с использованием Docker на машине с Ubuntu 22.04 и отправим логи контейнеров в Kibana после их фильтрации и преобразования с помощью Fluentd.
Предварительные требования
Сервер с установленной Ubuntu 22.04 и минимум 6 ГБ ОЗУ.
Пользователь без прав root с привилегиями sudo.
Упрощенный брандмауэр (UFW) включен и работает.
Полностью квалифицированное доменное имя (FQDN), указывающее на сервер, например, kibana.example.com.
Все обновлено. $ sudo apt update && sudo apt upgrade
Шаг 1 - Настройка брандмауэра
Перед установкой любых пакетов первым шагом является настройка брандмауэра для разрешения HTTP и HTTPS соединений.
Проверьте статус брандмауэра.
$ sudo ufw status
Вы должны увидеть что-то вроде следующего.
Статус: активен
Кому Действие Откуда
-- ------ ----
OpenSSH ALLOW Везде
OpenSSH (v6) ALLOW Везде (v6)
В этом руководстве будет использоваться плагин Docker Compose v2 вместо старого бинарного файла. Поэтому команда для его запуска изменилась с docker-compose на docker compose, и это отражено здесь.
Docker работает с повышенными привилегиями, поэтому вам нужно будет часто использовать sudo для выполнения команд. Лучший вариант — добавить свою учетную запись Linux в группу пользователей docker.
$ sudo usermod -aG docker ${USER}
Переменная ${USER} подбирает текущую учетную запись системы. Если вы не вошли в систему с пользователем, которому хотите предоставить привилегии, замените ${USER} на имя пользователя.
Чтобы применить новое членство в группе, выйдите из сервера и войдите снова или используйте следующую команду. Вам будет предложено ввести пароль пользователя.
$ su - ${USER}
Шаг 3 - Создание файла Docker Compose
Сначала создайте директорию для проекта EFK.
$ mkdir ~/efk
Перейдите в директорию.
$ cd ~/efk
Создайте и откройте файл docker-compose.yml для редактирования.
$ nano docker-compose.yml
Вставьте следующий код в него.
services:
# Развертывание с использованием пользовательского образа, который будет автоматически создан в процессе сборки.
fluentd:
build: ./fluentd
volumes:
- ./fluentd/conf:/fluentd/etc
links: # Отправляет входящие логи в контейнер elasticsearch.
- elasticsearch
depends_on:
- elasticsearch
ports: # Открывает порт 24224 как для TCP, так и для UDP протокола для агрегации логов
- 24224:24224
- 24224:24224/udp
elasticsearch:
image: elasticsearch:8.7.1
expose:
- 9200
environment:
- discovery.type=single-node # Работает как одноузловой кластер
- xpack.security.enabled=false
volumes: # Хранит данные elasticsearch локально на Docker-объеме esdata
- esdata:/usr/share/elasticsearch/data
kibana:
image: kibana:8.7.1
links: # Связывает сервис kibana с контейнером elasticsearch
- elasticsearch
depends_on:
- elasticsearch
ports:
- 5601:5601
environment: # Определенная конфигурация хоста
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
# Определите Docker-объем с именем esdata для контейнера Elasticsearch.
volumes:
esdata:
Сохраните файл, нажав Ctrl + X и введя Y, когда будет предложено. Мы настроили запуск трех сервисов, по одному для каждого: Fluentd, Elasticsearch и Kibana.
Для Fluentd мы будем строить контейнер вместо готового образа. Файлы сборки для Fluentd будут настроены на следующем шаге. Мы смонтировали директорию для его файлов сборки и объем для конфигурационных файлов, а также открыли порт 24224 как для TCP, так и для UDP протокола для агрегации логов.
Следующий сервис — Elasticsearch, и мы используем последнюю доступную версию на момент написания этого руководства. Мы открыли его через порт 9200 и настроили несколько переменных окружения, чтобы мы могли запустить его как одноузловой кластер и отключили функции безопасности. Обычно это не рекомендуется, но включение безопасности выходит за рамки этого руководства. Мы также смонтировали локальный объем для данных Elasticsearch.
Наконец, мы настраиваем Kibana и открываем его через порт 5601, который будет использоваться для доступа к панели управления. Мы также настроили переменную для конфигурации хоста Elasticsearch, чтобы он мог получить доступ к нему.
Шаг 4 - Настройка файлов сборки Fluentd
Создайте директорию Fluentd и конфигурационную директорию.
$ mkdir fluentd/conf -p
Запустите команду tree, чтобы проверить структуру директорий.
$ tree
Она должна выглядеть следующим образом.
Перейдите в директорию Fluentd.
$ cd fluentd
Создайте и откройте файл Dockerfile для редактирования.
$ nano Dockerfile
Вставьте следующий код в него. Этот код загружает образ Fluentd Debian Docker и устанавливает плагин Fluentd для Elasticsearch.
# fluentd/Dockerfile
FROM fluent/fluentd:v1.16-debian-1
USER root
RUN ["gem", "install", "fluent-plugin-elasticsearch", "--no-document", "--version", "5.3.0"]
USER fluent
Сохраните файл, нажав Ctrl + X и введя Y, когда будет предложено.
Перейдите в конфигурационную директорию.
$ cd conf
Создайте и откройте файл fluentd.conf для редактирования.
$ nano fluentd.conf
Вставьте следующий код в него.
# привязать fluentd к IP 0.0.0.0
# порт 24224
@type forward
port 24224
bind 0.0.0.0
# отправка логов в elasticsearch
# хост должен соответствовать контейнеру elasticsearch
# сервис
@type copy
@type elasticsearch_dynamic
hosts elasticsearch:9200
logstash_format true
logstash_prefix fluentd
logstash_dateformat %Y%m%d
include_tag_key true
tag_key @log_name
include_timestamp true
flush_interval 30s
@type stdout
Сохраните файл, нажав Ctrl + X и введя Y, когда будет предложено.
Директива source выше использует плагин forward, который превращает Fluentd в TCP-эндпоинт для приема TCP-пакетов.
Директива match ищет события с совпадающими тегами, что в данном случае означает, что она совпадает со всеми событиями. Мы будем использовать плагин elasticsearch_dynamic для хранения, который позволяет динамически задавать значения конфигурации. Поле hosts указывает имя хоста для приложения Elasticsearch, которое является именем сервиса в файле Docker compose. Поле logstash_format установлено в true, что означает, что Fluentd использует обычный формат имени logstash-%Y.%m.%dlogstash-%Y.%m.%d. Префикс имени для записи событий установлен в fluend. Поле include_tag_key установлено в true, что добавляет тег Fluentd в формате JSON. Поле tag_key — это имя поля для извлечения тега. Установка переменной include_timestamp в true добавляет поле временной метки в лог. Поле flush_interval указывает интервал между сбросами данных. Мы также используем плагин stdout, чтобы выводить события/логи на стандартный вывод.
Шаг 5 - Запуск контейнеров Docker
Вернитесь в директорию EFK.
$ cd ~/efk
Запустите контейнеры с помощью следующей команды.
$ docker compose up -d
Проверьте статус запущенных контейнеров.
$ docker ps
b3780c311154 efk-fluentd "tini -- /bin/entryp…" 9 seconds ago Up 8 seconds 5140/tcp, 0.0.0.0:24224->24224/tcp, 0.0.0.0:24224->24224/udp, :::24224->24224/tcp, :::24224->24224/udp efk-fluentd-1
5a48f0a9ade1 kibana:8.7.1 "/bin/tini -- /usr/l…" 9 seconds ago Up 7 seconds 0.0.0.0:5601->5601/tcp, :::5601->5601/tcp efk-kibana-1
dab3a0ab0312 elasticsearch:8.7.1 "/bin/tini -- /usr/l…" 9 seconds ago Up 8 seconds 9200/tcp, 9300/tcp efk-elasticsearch-1
Вы также можете использовать следующую команду для этого.
$ docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
efk-elasticsearch-1 elasticsearch:8.7.1 "/bin/tini -- /usr/l…" elasticsearch 37 seconds ago Up 36 seconds 9200/tcp, 9300/tcp
efk-fluentd-1 efk-fluentd "tini -- /bin/entryp…" fluentd 37 seconds ago Up 36 seconds 5140/tcp, 0.0.0.0:24224->24224/tcp, 0.0.0.0:24224->24224/udp, :::24224->24224/tcp, :::24224->24224/udp
efk-kibana-1 kibana:8.7.1 "/bin/tini -- /usr/l…" kibana 37 seconds ago Up 36 seconds 0.0.0.0:5601->5601/tcp, :::5601->5601/tcp
Запустите следующие команды, чтобы проверить логи процесса сборки EFK.
Теперь, когда стек EFK развернут, пришло время настроить Kibana. Откройте URL http://:5601 в браузере.
Нажмите кнопку Исследовать самостоятельно, чтобы перейти к панели управления Kibana.
Нажмите на ссылку Управление стеком, чтобы настроить представление данных Kibana. Выберите опцию Kibana >> Представления данных из левой боковой панели, чтобы открыть страницу представления данных.
Нажмите кнопку Создать представление данных, чтобы продолжить.
Введите имя представления данных и шаблон индекса как fluentd-*. Убедитесь, что поле временной метки установлено на @timestamp. Поле источника будет автоматически обновлено. Нажмите кнопку Сохранить представление данных в Kibana, чтобы завершить создание представления данных.
Далее нажмите на верхнее меню (троеточие) и выберите опцию Обнаружить, чтобы показать мониторинг логов.
Вы получите следующую страницу, подтверждающую, что ваша настройка работает идеально. Логи берутся из Elasticsearch и отправляются через агрегацию логов Fluentd.
Шаг 7 - Установка Nginx
Ubuntu 22.04 поставляется со старой версией Nginx. Вам нужно загрузить официальный репозиторий Nginx, чтобы установить последнюю версию.
Первый шаг — установить SSL-сертификат Let’s Encrypt. Нам нужно установить Certbot для генерации SSL-сертификата. Вы можете установить Certbot, используя репозиторий Ubuntu, или загрузить последнюю версию с помощью инструмента Snapd. Мы будем использовать версию Snapd.
Ubuntu 22.04 поставляется с установленным Snapd по умолчанию. Запустите следующие команды, чтобы убедиться, что ваша версия Snapd обновлена.
Вы найдете snap.certbot.renew.service как одну из запланированных служб.
NEXT LEFT LAST PASSED UNIT ACTIVATES
------------------------------------------------------------------------------------------------------------------------------------
Mon 2023-05-06 13:37:57 UTC 3h 45min left Mon 2023-05-01 07:20:42 UTC 2h 31min ago ua-timer.timer ua-timer.service
Mon 2023-05-06 14:39:29 UTC 4h 47min left Sat 2023-02-04 16:04:18 UTC 2 months ago motd-news.timer motd-news.service
Mon 2023-05-06 15:53:00 UTC 6h left n/a n/a snap.certbot.renew.timer snap.certbot.renew.service
Сделайте пробный запуск процесса, чтобы проверить, работает ли обновление SSL.
$ sudo certbot renew --dry-run
Если вы не видите ошибок, вы готовы. Ваш сертификат будет автоматически обновляться.
Шаг 9 - Настройка Nginx
Создайте и откройте файл конфигурации Nginx для Kibana.
$ sudo nano /etc/nginx/conf.d/kibana.conf
Вставьте следующий код в него. Замените IP-адрес на частный IP-адрес вашего сервера Elasticsearch.
Сохраните файл, нажав Ctrl + X и введя Y, когда будет предложено, как только вы закончите.
Остановите и удалите контейнеры.
$ docker compose down --remove-orphans
Запустите контейнеры снова с обновленной конфигурацией.
$ docker compose up -d
Ваша панель управления Kibana должна быть доступна по URL https://kibana.example.com из любого места, где вы хотите.
Шаг 10 - Запуск контейнера Docker с драйвером логов Fluentd
Теперь мы запустим контейнер Docker с драйвером логов Fluentd, автоматически отправляя логи в стек. Мы протестируем с использованием контейнера Nginx.
Загрузите образ Nginx из реестра Docker Hub. Мы используем версию alpine, потому что это самая маленькая версия образа.
$ docker pull nginx:alpine
Запустите следующую команду, чтобы создать и запустить контейнер Nginx. Мы установили драйвер логов на Fluentd, а порт — на 8080, потому что порт по умолчанию 80 уже используется сервером Nginx в режиме прокси.
$ docker run --name nginx-fluentd-test -d --log-driver=fluentd -p 8080:80 nginx:alpine
Проверьте статус контейнера.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
038c43e4e1a3 nginx:alpine "/docker-entrypoint.…" 12 seconds ago Up 11 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp nginx-fluentd-test
a94ca706bd0c efk-fluentd "tini -- /bin/entryp…" 8 hours ago Up 8 hours 5140/tcp, 0.0.0.0:24224->24224/tcp, 0.0.0.0:24224->24224/udp, :::24224->24224/tcp, :::24224->24224/udp efk-fluentd-1
0cf04a446425 kibana:8.7.1 "/bin/tini -- /usr/l…" 8 hours ago Up 8 hours 0.0.0.0:5601->5601/tcp, :::5601->5601/tcp efk-kibana-1
7c7ad8f9b123 elasticsearch:8.7.1 "/bin/tini -- /usr/l…" 8 hours ago Up 8 hours 9200/tcp, 9300/tcp efk-elasticsearch-1
Запустите следующую команду, чтобы получить доступ к контейнеру Nginx и сгенерировать логи доступа.
$ curl localhost:8080
Добро пожаловать в nginx!
Добро пожаловать в nginx!
Если вы видите эту страницу, веб-сервер nginx успешно установлен и
работает. Требуется дальнейшая настройка.
Для онлайн-документации и поддержки, пожалуйста, обратитесь к
nginx.org.
Коммерческая поддержка доступна на
nginx.com.
Спасибо за использование nginx.
В качестве альтернативы вы можете открыть URL http://:8080 в своем браузере, и вы получите следующую страницу.
Откройте панель управления Kibana и нажмите на ссылку Обнаружить в меню левой боковой панели. Нажмите знак + в верхнем меню, чтобы открыть всплывающее окно Добавить фильтр.
Выберите поле container_name из выпадающего списка, is как оператор и заполните имя контейнера (nginx-fluentd-test) как значение поля.
Нажмите кнопку Добавить фильтр, чтобы визуализировать данные из контейнера Nginx.
Заключение
Это завершает наше руководство по установке стека логирования Elasticsearch, Fluentd и Kibana (EFK) на машине с Ubuntu 22.04. Если у вас есть какие-либо вопросы, оставляйте их в комментариях ниже.