Public:Docker-and-ELK
На машине vm3 существует виртуальная машина №148(kibana).
- OS Debian 9
- IP 172.16.199.254/17
- Поднята система контейнеризации приложений Docker.
Для работы с docker лучше всего добавить Вашего пользователя в группу docker, тогда не нужно будет при каждой команде docker делать sudo.
В репозиторий Docker загружены образы контейнеров приложений Elasticsearch, Kibana, Logstash, составляющие системы Elastic Stack.
Просмотреть загруженные образы можно командой docker images.
На данный момент вывод такой:
root@ELK:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.elastic.co/logstash/logstash 7.0.1 55b534744e48 2 weeks ago 820MB docker.elastic.co/kibana/kibana 7.0.1 2c25d2be5a7f 2 weeks ago 712MB docker.elastic.co/elasticsearch/elasticsearch 7.0.1 eb1e40835f76 2 weeks ago 862MB ubuntu latest d131e0fa2585 2 weeks ago 102MB
Командой docker ps можно увидеть работающие контейнеры:
root@ELK:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0e6b4a7f45a8 docker.elastic.co/logstash/logstash:7.0.1 "/usr/local/bin/dock…" About an hour ago Up About an hour Logstash 012e4382b50e docker.elastic.co/kibana/kibana:7.0.1 "/usr/local/bin/kiba…" 2 days ago Up 2 days 0.0.0.0:5601->5601/tcp Kibana c39008b30fde docker.elastic.co/elasticsearch/elasticsearch:7.0.1 "/usr/local/bin/dock…" 2 days ago Up 2 days 9200/tcp, 9300/tcp ES1
Виртуальная машина включена в несколько сетей:
- IP 172.16.199.254/17 - Vlan 1 - физическая сеть интерфейс ens18: mac:...6f:75;
- IP 172.17.0.1/16 - создается самим Docker при установке удалить/изменить нельзя.
Стандартная виртуальная сеть Docker включенная в бридж интерфейс docker0, который так же создается системой.
В нее попадают контейнеры для которых ip не заданы руками при старте, присваивать вручную ip адреса контейнерам в этой сети также нельзя.
Адреса выдаются по порядку начиная с 172.17.0.2 - кто-что словил из запускающихся контейнеров - то и будет.
Подключенные к сети контейнеры можно посмотреть командой docker network inspect bridge. - IP 172.27.0.1/24 - созданная вручную виртуальная сеть Docker для возможности создавать контейнеры с заданными ip адресами.
Сеть включена в созданный бридж интерфейс elk-bridge0, создаётся при создании сети.
Подключенные к сети контейнеры можно посмотреть командой docker network inspect elknet.
Создана сеть командой:
docker network create --driver=bridge --subnet=172.27.0.0/24 \ --gateway=172.27.0.1 --opt com.docker.network.bridge.name=elk-bridge0 \ --opt com.docker.network.bridge.enable_ip_masquerade=true \ --opt com.docker.network.driver.mtu=1500 \ --opt com.docker.network.bridge.enable_icc=true \ --opt com.docker.network.bridge.host_binding_ipv4=0.0.0.0 \ --ipam-opt null elknet
У виртуальной машины два виртуальных диска: scsi0 (15G) "система"; scsi1 (100G) "данные" смонтирован последний соответственно: "/dev/mapper/ELK--vg-data on /var/data".
Disk /dev/sda: 15 GiB, 16106127360 bytes, 31457280 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xeb4f87b3
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 499711 497664 243M 83 Linux /dev/sda2 501758 29296875 28795118 13,7G 5 Extended /dev/sda3 499712 501757 2046 1023K 83 Linux /dev/sda5 501760 29296875 28795116 13,7G 8e Linux LVM
Partition table entries are not in disk order.
Disk /dev/sdb: 100 GiB, 107374182400 bytes, 209715200 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/mapper/ELK--vg-root: 9,8 GiB, 10544480256 bytes, 20594688 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/mapper/ELK--vg-swap_1: 4 GiB, 4294967296 bytes, 8388608 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/mapper/ELK--vg-data: 99,9 GiB, 107269324800 bytes, 209510400 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes
В "/var/data" созданы две директории ELK и docker.
- Директория ELK предназначена для хранения данных и логов приложений Elastic Stack в соответствующих поддиректориях,
которые монтируются в контейнеры соответствующими командами при создании нового контейнера. - Директория docker предназначена для создания, хранения и монтирования в контейнеры конфигурационных файлов,
использующихся приложениями Elasticsearch, Logstash, Kibana.
Контейнер ES1 - представляет собой запущенную службу Elasticsearch, которой,
при создании контейнера из образа в локальном репозитории docker, подмонтировали конфигурационные файлы,
а также директории, куда служба будет писать данные и логи. Предназначена служба для хранения и поиска по собранной информации из Logstash. Контейнер создан командой:
docker run -t -d -h es1 -v /var/data/ELK/ES1/:/ES1 -v \ /var/data/docker/ELK-conf/ELK/es1/elastisearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \ --network=elknet --ip=172.27.0.2 --restart=always docker.elastic.co/elasticsearch/elasticsearch:7.0.1
Как можно увидеть, в контейнер монтируется директория для данных .../ES1(на хосте):/ES1(в контейнере) и файл конфигурации elastisearch.yml аналогично.
Содержание файла можно менять при надобности и сделать рестарт контейнера командой "docker restart ES1".
В этом случае подтянется новая версия файла. Контейнер создан с флагом "--restart=always", что означает контейнер всегда будет пытаться запуститься.
При ошибочной конфигурации контейнер может уходить в "петлю" на запуске, прервать процесс можно командой "docker stop ES1".
IP адрес в виртуальной сети 172.27.0.2, что также можно увидеть из команды.
В контейнер смонтированы:
- /var/data/ELK/ES1/:/ES1 - данные и логи
При надобности легко переносятся путем остановки контейнера и простым копированием из директории в директорию.
Применимо только в singe-node решениях.
- /var/data/docker/ELK-conf/ELK/es1/elastisearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml - конфигурационный файл
Контейнер Kibana - служба Kibana, представляет из себя удобный вэб интерфейс для визуализации, поиска и работы с данными службы Elasticsearch.
Конфигурация достаточно простая, монтируется во внутрь контейнера по примеру контейнера ES1. Создан контейнер командой:
docker run -t -d -h kibana -p 5601:5601 -v /var/data/ELK/Kibana/:/Kibana \ -v /var/data/docker/ELK-conf/ELK/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml \ --network=elknet --ip=172.27.0.4 --restart=always docker.elastic.co/kibana/kibana:7.0.1
Здесь на себя обращает внимание строка "-p 5601:5601". Этим docker создает на хостовой машине правило DNAT в iptables,
которое перенаправит tcp трафик непосредственно на контейнер.
При обновлении, либо при любых других важных изменениях,
полезно делать экспорт сохраненных объектов из самого интерфейса Kibana (Management->Saved Ojects->Export) в файл json.
В контейнер смонтированы:
- /var/data/ELK/Kibana/:/Kibana - логи
- /var/data/docker/ELK-conf/ELK/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml - конфигурационный файл.
Контейнер Logstash - служба Logstash, сервис непосредственно принимающий логи и snmp-трапы.
Работает как локальная служба хоста, так как с пробросом портов именно в виртуальную сеть возникла проблема вида:
"некоторые из приходящих логов Logstash классифицировал, как пришедшие от источника 172.27.0.1". Создан командой:
docker run -t -d -h logstash --user root -v /var/data/ELK/Logstash/:/Logstash \ -v /var/data/docker/ELK-conf/ELK/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml \ -v /var/data/docker/ELK-conf/ELK/logstash/pipeline:/usr/share/logstash/pipeline/ \ --network=host --restart=always docker.elastic.co/logstash/logstash:7.0.1
Права root требуются контейнеру для запуска службы на привилегированных портах 514 и 162. Порт 5044 (Filebeat) не используется, и порт 9600 (Logstash API) слушает запросы. В контейнер смонтрированы директории:
- /var/data/ELK/Logstash/:/Logstash - данные и логи
- /var/data/docker/ELK-conf/ELK/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml - общий конфигурационный файл.
- /var/data/docker/ELK-conf/ELK/logstash/pipeline:/usr/share/logstash/pipeline/ - директория с конфигурационными файлами т.н. pipeline, определяющими: input, filter и output.
Файлы в директории pipeline проверяются на изменения настроек автоматически каждые 5 минут.
Данная опция установлена в общей конфигурации logstash.yml.