Централизованное логирование в Docker с применением ELK Stack

от автора

В рамках запуска практического интенсива по ELK подготовили для вас перевод полезного материала. Приглашаем также всех заинтересованных на онлайн-встречу с преподавателем интенсива, где преподаватель расскажет о программе, формате обучения и перспективах для выпускников.


По мере роста вашей инфраструктуры наличие роботов и надежная централизованная система логирования становится критически важными составляющими. Централизация логирования становится ключевым аспектом множества IT-задач и дает вам хороший обзор всей вашей системы.

Лучшее решение — агрегировать логи с метаданными из всех контейнеров. Это предоставит вам лучшие варианты отслеживания и возможность получить хорошую поддержку от сообщества. Здесь на сцену выходит ELK Stack. ELK, также известный как Elastic stack, представляет собой комбинацию современных инструментов с открытым исходным кодом, таких как ElasticSearch, Logstash и Kibana. Это полное решение для сквозного анализа журналов, которое вы можете использовать в своей системе.

Каждому компоненту отведена определенная роль: ElasticSearch лучше всего хранит необработанные логи, Logstash помогает собирать и преобразовывать логи в согласованный формат, а Kibana добавляет отличный уровень визуализации и помогает вам управлять вашей системой в удобной для пользователя манере.

В этом руководстве вы узнаете, как развернуть ELK и наладить агрегирование контейнерных логов. Мы собираемся объединить ELK с Filebeat, чтобы агрегировать контейнерные логи. Для этого мы собираемся создать собственный образ Docker.

Шаг 1 — Настройка Filebeat:

Начнем с настройки Filebeat. Во-первых, для создания образа вам нужно создать Dockerfile:

$ mkdir filebeat_docker && cd $_ $ touch Dockerfile && nano Dockerfile

Теперь откройте Dockerfile в удобном для вас текстовом редакторе и скопируйте/вставьте указанные ниже строки:

FROM docker.elastic.co/beats/filebeat:7.5.1   COPY filebeat.yml /usr/share/filebeat/filebeat.yml USER root RUN mkdir /usr/share/filebeat/dockerlogs RUN chown -R root /usr/share/filebeat/ RUN chmod -R go-w /usr/share/filebeat/

В каталоге filebeat_docker создайте файл filebeat.yml, содержащий конфигурацию для Filebeat. В этом руководстве мы будем детализировать файл filebeat.yml по минимуму.

filebeat.inputs:   - type: docker     containers:       path: "/usr/share/dockerlogs/data"       stream: "stdout"       ids:         - "*"       cri.parse_flags: true       combine_partial: true       exclude_files: ['\.gz$']   processors:   - add_docker_metadata:       host: "unix:///var/run/docker.sock"   filebeat.config.modules:   path: ${path.config}/modules.d/*.yml   reload.enabled: false   output.logstash:   hosts: ["127.0.0.1:5044"]   log files: logging.level: error logging.to_files: false logging.to_syslog: false loggins.metrice.enabled: false logging.files:   path: /var/log/filebeat   name: filebeat   keepfiles: 7   permissions: 0644 ssl.verification_mode: none

Теперь создадим образ Filebeat Docker:

$ docker build -t filebeatimage . Sending build context to Docker daemon  3.584kB Step 1/6 : FROM docker.elastic.co/beats/filebeat:7.5.1 7.5.1: Pulling from beats/filebeat c808caf183b6: Already exists  a07383b84bc8: Pull complete  a3c8dd4531b4: Pull complete  5547f4a87d0c: Pull complete  d68e041d92cd: Pull complete  7cfb3f76a272: Pull complete  748d7fe7bf07: Pull complete  Digest: sha256:68d87ae7e7bb99832187f8ed5931cd253d7a6fd816a4bf6a077519c8553074e4 Status: Downloaded newer image for docker.elastic.co/beats/filebeat:7.5.1  ---> 00c5b17745d1 Step 2/6 : COPY filebeat.yml /usr/share/filebeat/filebeat.yml  ---> f6b75829d8d6 Step 3/6 : USER root  ---> Running in 262c41d7ce58 Removing intermediate container 262c41d7ce58  ---> 1ffcda8f39cf Step 4/6 : RUN mkdir /usr/share/filebeat/dockerlogs  ---> Running in 8612b1895ac7 Removing intermediate container 8612b1895ac7  ---> 483d29e65dc7 Step 5/6 : RUN chown -R root /usr/share/filebeat/  ---> Running in 4a6ad8b22705 Removing intermediate container 4a6ad8b22705  ---> b779a9da7ac9 Step 6/6 : RUN chmod -R go-w /usr/share/filebeat/  ---> Running in bb9638d12090 Removing intermediate container bb9638d12090  ---> 85ec125594ee Successfully built 85ec125594ee Successfully tagged filebeatimage:latest

Чтобы проверить, был ли образ успешно построен:

$ docker images REPOSITORY      TAG           IMAGE ID            CREATED             SIZE filebeatimage   latest        85ec125594ee        7 seconds ago       514MB

Для контейнера filebeat_elk мы создали две точки монтирования с помощью параметра -v;

  • /var/lib/docker/containers:/usr/share/dockerlogs/data: мы проецируем логи хост-машины, которые находятся в /var/lib/docker/containers в /usr/share/dockerlogs/data внутри docker-контейнера. Обратите внимание, что вы использовали :ro, что означает, что у него есть разрешение только на чтение.

  • /var/run/docker.sock связан с docker-демоном контейнера Filebeat, который позволяет контейнеру Filebeat собирать метаданные Docker и записи логов контейнера.

Установка Filebeat через DEB:

Существует альтернативный способ установить Filebeat на вашу хост-машину. На момент написания статьи, версия Filebeat — 7.5.1, вы можете скачать последнюю версию filebeat отсюда.

Чтобы установить загруженный .deb файл:

$ wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.5.1-amd64.deb  $ sudo dpkg -i filebeat-7.5.1-amd64.deb

Вы можете найти файл конфигурации в каталоге /etc/filebeat/filebeat.yml.

Шаг 2 — Настройка ELK или Elastic Stack

Вы можете использовать удаленный сервер для размещения своего ELK stack или запускать контейнеры в существующей системе.

Прежде чем начать, убедитесь, что слушают следующие порты:

  • Elasticsearch — порт 9200 и порт 9300

  • Logstash — порт 5044

  • Kibana — порт 5601

ElasticSearch: 

Мы собираемся использовать самый последний официальный образ Elasticsearch. Итак, начнем с подтягивания образа из Docker Hub:

$ docker pull docker.elastic.co/elasticsearch/elasticsearch:7.5.1 7.5.1: Pulling from elasticsearch/elasticsearch c808caf183b6: Already exists  05ff3f896999: Pull complete  82fb7fb0a94e: Pull complete  c4d0024708f4: Pull complete  136650a16cfe: Pull complete  968db096c092: Pull complete  42547e91692f: Pull complete  Digest: sha256:b0960105e830085acbb1f9c8001f58626506ce118f33816ea5d38c772bfc7e6c Status: Downloaded newer image for docker.elastic.co/elasticsearch/elasticsearch:7.5.1 docker.elastic.co/elasticsearch/elasticsearch:7.5.1

Теперь создайте каталог с именем docker_elk, в котором будут находиться все ваши файлы конфигурации и Dockerfile:

$ mkdir docker_elk && cd $_

Внутри docker_elk, создайте еще один каталог для elasticsearch и создайте файлы Dockerfile и elasticsearch.yml:

$ mkdir elasticsearch && cd $_ $ touch Dockerfile && touch elasticsearch.yml

Откройте файл elasticsearch.yml в любом текстовом редакторе и скопируйте настройки конфигурации как есть:

--- cluster.name: "docker-cluster" network.host: 0.0.0.0   xpack.license.self_generated.type: basic xpack.security.enabled: true xpack.monitoring.collection.enabled: true

Обратите внимание, что вы можете поменять xpack.license.self_generated.type с basic на trial, если вы хотите попробовать коммерческую версию x-pack в течении 30 дней.

Откройте Dockerfile в любом текстовом редакторе, скопируйте указанные ниже строки и вставьте их как есть:

FROM docker.elastic.co/elasticsearch/elasticsearch:7.5.1 COPY --chown=elasticsearch:elasticsearch ./elasticsearch.yml /usr/share/elasticsearch/config/

Команда chown предназначена для изменения владельца файла на elasticsearch, как и для других файлов в контейнере.

Kibana:

Теперь мы собираемся настроить Dockerfile для Kibana, и снова вам нужно подтянуть последний образ из реестра Elastic Docker:

$ docker pull docker.elastic.co/kibana/kibana:7.5.1 7.5.1: Pulling from kibana/kibana c808caf183b6: Already exists  e12a414b7b04: Pull complete  20714d0b39d8: Pull complete  393e0a5bccf2: Pull complete  b142626e938b: Pull complete  b28e35a143ca: Pull complete  728725922476: Pull complete  96692e1a8406: Pull complete  e4c3cbe1dbbe: Pull complete  bb6fc46a19d1: Pull complete  Digest: sha256:12b5e37e0f960108750e84f6b2f8acce409e01399992636b2a47d88bbc7c2611 Status: Downloaded newer image for docker.elastic.co/kibana/kibana:7.5.1 docker.elastic.co/kibana/kibana:7.5.1

Создайте каталог внутри вашего docker_elk, и внутри него вы должны создать файлы Dockerfile и kibana.yml:

$ mkdir kibana && cd $_ $ touch Dockerfile && touch kibana.yml

kibana.yml будет состоять из следующих конфигураций. Обратите внимание, что вам необходимо изменить значения elasticsearch.user и elasticsearch.password:

--- server.name: kibana server.host: "0" elasticsearch.hosts: [ "http://elasticsearch:9200" ] xpack.monitoring.ui.container.elasticsearch.enabled: true   elasticsearch.username: elastic elasticsearch.password: yourstrongpasswordhere

В то время как в Dockerfile это будет выглядеть примерно так:

FROM docker.elastic.co/kibana/kibana:7.5.1 COPY ./kibana.yml /usr/share/kibana/config/

Logstash:

Образ контейнера для Logstash доступен в реестре Elastic Docker. Опять же, на момент написания текущая версия — 7.5.1, последнюю версию Logstash вы можете найти здесь.

$ docker pull docker.elastic.co/logstash/logstash:7.5.1 7.5.1: Pulling from logstash/logstash c808caf183b6: Already exists  7c07521065ed: Pull complete  d0d212a3b734: Pull complete  418bd04a229b: Pull complete  b22f374f97b1: Pull complete  b65908943591: Pull complete  2ee12bfc6e9c: Pull complete  309701bd1d88: Pull complete  b3555469618d: Pull complete  2834c4c48906: Pull complete  bae432e5da20: Pull complete  Digest: sha256:5bc89224f65459072931bc782943a931f13b92a1a060261741897e724996ac1a Status: Downloaded newer image for docker.elastic.co/logstash/logstash:7.5.1 docker.elastic.co/logstash/logstash:7.5.1

Теперь создайте каталог для Logstash внутри docker_elk и добавьте необходимые файлы, как показано ниже:

$ mkdir logstash && cd $_ $ touch Dockerfile && touch logstash.yml

Скопируйте строки ниже в logstash.yml. Убедитесь, что вы вводите правильное имя пользователя и пароль в xpack.monitoring.elasticsearch.username и xpack.monitoring.elasticsearch.password соответственно:

--- http.host: "0.0.0.0" xpack.monitoring.elasticsearch.hosts: [ "http://elasticsearch:9200" ]   xpack.monitoring.enabled: true xpack.monitoring.elasticsearch.username: elastic xpack.monitoring.elasticsearch.password: yourstrongpasswordhere

Теперь добавьте следующие строки в свой Dockerfile:

FROM docker.elastic.co/logstash/logstash:7.5.1 COPY ./logstash.yml /usr/share/logstash/config/ COPY ./logstash.conf /usr/share/logstash/pipeline/

Кроме этого, вам необходимо создать файл logstash.conf. Здесь, в справочнике elasticsearch, вы найдете host, user и password, убедитесь, что вы изменили значения в соответствии с вашей системой:

input {     tcp {     port => 5000     codec => json   } } output {   elasticsearch {     hosts => "elasticsearch:9200"     user => elastic     password => yourstrongpasswordhere   } }

Как только вы закончите установку компонентов вашего стека, структура каталогов вашего проекта должна выглядеть следующим образом:

. ├── elasticsearch │   ├── Dockerfile │   └── elasticsearch.yml ├── kibana │   ├── Dockerfile │   └── kibana.yml └── logstash     ├── Dockerfile     ├── logstash.conf     └── logstash.yml   3 directories, 7 files

Теперь пришло время создать файл Docker Compose, который позволит вам запустить стек.

Шаг 3 — Docker Compose

Создайте файл docker-compose.yml в каталоге docker_elk. Здесь вы будете определять и запускать свое многоконтейнерное приложение, состоящее из Elasticsearch, Kibana и Logstash.

Вы можете скопировать приведенный ниже контекст в файл docker-compose.yml. Убедитесь, что вы изменили значения ELASTIC_PASSWORD и ES_JAVA_OPTS. В этом руководстве для ES_JAVA_OPTS установлено значение в 256 МБ, но в реальных сценариях может потребоваться увеличить размер кучи в соответствии с вашими запросами.

version: '3.2'   services:  elasticsearch:    build:      context: elasticsearch/    volumes:      - type: volume        source: elasticsearch        target: /usr/share/elasticsearch/data    ports:      - "9200:9200"      - "9300:9300"    environment:      ES_JAVA_OPTS: "-Xmx256m -Xms256m"      ELASTIC_PASSWORD: yourstrongpasswordhere      discovery.type: single-node    networks:      - elk_stack    logstash:    build:      context: logstash/    ports:      - "5000:5000"      - "9600:9600"    environment:      LS_JAVA_OPTS: "-Xmx256m -Xms256m"    networks:      - elk_stack    depends_on:      - elasticsearch    kibana:    build:      context: kibana/    ports:      - "5601:5601"    networks:      - elk_stack    depends_on:      - elasticsearch   networks:  elk_stack:    driver: bridge   volumes:  elasticsearch:

Теперь, для того, чтобы собрать ELK stack, вам нужно запустить следующую команду в каталоге 

docker_elk :

$ docker-compose up -d Starting elastic_elk ... done Starting kibana_elk   ... done Starting logstash_elk ... done

Убедитесь, что конвейер работает нормально — запустите следующую команду, чтобы увидеть индексы Elasticsearch:

$ curl 'localhost:9200/_cat/indices?v' -u elastic:yourstrongpasswordhere  health status index                             uuid                   pri rep docs.count docs.deleted store.size pri.store.size green  open   .triggered_watches                m-l01yMmT7y2PYU4mZ6-RA   1   0          0            0      6.5kb          6.5kb green  open   .watcher-history-10-2020.01.10    SX3iYGedRKKCC6JLx_W8fA   1   0       1523            0        2mb            2mb green  open   .management-beats                 ThHV2q9iSfiYo__s2rouIw   1   0          6            1     40.5kb         40.5kb green  open   .ml-annotations-6                 PwK7Zuw7RjytoWFuCCulJg   1   0          0            0       283b           283b green  open   .monitoring-kibana-7-2020.01.10   8xVnx0ksTHShds7yDlHQvw   1   0       1006            0    385.4kb        385.4kb green  open   .monitoring-es-7-2020.01.10       CZd89LiNS7q-RepP5ZWhEQ   1   0      36412          340     16.4mb         16.4mb green  open   .apm-agent-configuration          e7PRBda_QdGrWtV6KECsMA   1   0          0            0       283b           283b green  open   .ml-anomalies-shared              MddTZQ7-QBaHNTSmOtUqiQ   1   0          1            0      5.5kb          5.5kb green  open   .kibana_1                         akgBeG32QcS7AhjBOed3LA   1   0       1105           28    687.1kb        687.1kb green  open   .ml-config                        CTLI-eNdTkyBmgLj3JVrEA   1   0         22            0     56.6kb         56.6kb green  open   .ml-state                         gKx28CMGQiuZyx82bNUoYg   1   0          0            0       283b           283b green  open   .security-7                       krH4NlJeThyQRA-hwhPXEA   1   0         36            0     83.6kb         83.6kb green  open   .logstash                         7wxswFtbR3eepuWZHEIR9w   1   0          0            0       281b           281b green  open   .kibana_task_manager_1            ft60q2R8R8-nviAyc0caoQ   1   0          2            1     16.2kb         16.2kb yellow open   filebeat-7.5.1-2020.01.10-000001  1-RGhyG9Tf-wGcepQ49mmg   1   1          0            0       283b           283b green  open   .monitoring-alerts-7              TLxewhFyTKycI9IsjX0iVg   1   0          6            0     40.9kb         40.9kb green  open   .monitoring-logstash-7-2020.01.10 dc_S5BhsRNuukwTxbrxvLw   1   0       4774            0      1.1mb          1.1mb green  open   .watches                          x7QAcAQZTrab-pQuvonXpg   1   0          6            6    120.2kb        120.2kb green  open   .ml-notifications-000001          vFYzmHorTVKZplMuW7VSmw   1   0         52            0     81.6kb         81.6kb

Теперь пора посетить нашу панель управления (dashboard) Kibana. Откройте браузер и введите URL-адрес http://your-ip-addr-here:5601. Теперь введите заранее заданные имя пользователя и пароль; в нашем случае это elastic и yourstrongpasswordhere соответственно.

В панели управления Kibana перейдите на вкладку «Management» (Управление) и в разделе «Kibana» нажмите «Index Patterns» (Шаблоны индекса). В первой строке вы найдете индекс filebeat-*, который уже был идентифицирован Kibana.

Теперь перейдите к тегу Discover на панели инструментов Kibana и просмотрите логи контейнеров вместе с метаданными в соответствии с выбранным шаблоном индекса, который может выглядеть примерно так:

Заключение:

Вот вы и установили и настроили стек ELK Stack на своей хост-машине, которая собирает необработанные логи из вашего Docker в стек, который позже можно будет проанализировать или использовать для отладки приложений.

Об авторе — Судип — основатель Javelynn и Solution Architect с более чем 15-летним опытом работы. Он любит делиться своими знаниями, регулярно пишет для Hackernoon, DZone, Appfleet и многих других ресурсов. А если он не занят этим в данный момент, он наверняка рыбачит или играет в шахматы.


Узнать подробнее об экспресс-курсе ELK.

Смотреть онлайн-встречу с преподавателем экспресс-курса ELK.

ссылка на оригинал статьи https://habr.com/ru/company/otus/blog/542144/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *