Public:Docker-and-ELK

Материал из Linkintel wiki
Перейти к: навигация, поиск

На машине 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.