В рамках запуска практического интенсива по 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.
