Используйте Docker для создания среды ELK

Elasticsearch
Используйте Docker для создания среды ELK

В этой статье используется лицензионное соглашение «Signature 4.0 International (CC BY 4.0)», добро пожаловать на перепечатку или изменение для использования, но вам необходимо указать источник.Атрибуция 4.0 Международная (CC BY 4.0)

Автор этой статьи: Су Ян

Создано: 4 мая 2020 г. Статистические слова: 12679 слов Время чтения: 26 минут на чтение Ссылка на эту статью:Поиск teay.com/2020/05/04/…


Используйте Docker для создания среды ELK

В этой статье речь пойдет о том, как использовать Docker для сборки ELK (Elasticsearch, Logstash, Kibana).

В этой статье будет представлена ​​конструкция, состоящая из двух частей: среды для разработки, тестирования и общих требований к анализу, а также среды, которую можно использовать для общего производства после эластичного расширения.

Поскольку при удобстве Docker полное время работы не превышает 15 минут, если вы не знакомы с Docker, то можете просмотреть предыдущие статьи.

написать впереди

Для удобства построения используемGitHub.com/Деви Энтони/…Этот проект с открытым исходным кодом поддерживает три последние версии технологического стека ELK, а именно 7.x, 6.x и 5.x. В этой статье будет использоваться последняя версия.

В качестве базовой среды для разработки и тестирования можно использовать виртуальную машину 1c2g.Конечно, чем больше машинных ресурсов, тем выше будет эффективность работы наших сервисов, и тем больше будет мощность обработки данных при этом . Для общей производственной среды рекомендуется выделять больше ресурсов в соответствии с вашей конкретной ситуацией.

Давайте сначала поговорим о создании тестовой среды.

тестовая среда разработки

Загрузите проект в нужное место с помощью команды Git Clone.

git clone https://github.com/deviantony/docker-elk.git /app/docker-elk

Cloning into '/app/docker-elk'...
remote: Enumerating objects: 1729, done.
remote: Total 1729 (delta 0), reused 0 (delta 0), pack-reused 1729
Receiving objects: 100% (1729/1729), 410.25 KiB | 11.00 KiB/s, done.
Resolving deltas: 100% (705/705), done.

Прежде чем приступить к проекту, давайте сначала разберемся с базовой структурой каталогов.

├── docker-compose.yml
├── docker-stack.yml
├── elasticsearch
│   ├── config
│   │   └── elasticsearch.yml
│   └── Dockerfile
├── extensions
│   ├── apm-server
│   ├── app-search
│   ├── curator
│   ├── logspout
├── kibana
│   ├── config
│   │   └── kibana.yml
│   └── Dockerfile
├── LICENSE
├── logstash
│   ├── config
│   │   └── logstash.yml
│   ├── Dockerfile
│   └── pipeline
│       └── logstash.conf
└── README.md

Хорошо видно, что проект в основном использует корневую директориюdocker-compose.ymlВ качестве начальной конфигурации и при первом запуске создайте образы контейнеров связанных служб.

Как только вы поймете, как работает проект, вы можете использоватьdocker-compose upчтобы начать проект.

docker-compose up

Creating network "docker-elk_elk" with driver "bridge"
Creating volume "docker-elk_elasticsearch" with default driver
Building elasticsearch
Step 1/2 : ARG ELK_VERSION
Step 2/2 : FROM docker.elastic.co/elasticsearch/elasticsearch:${ELK_VERSION}
7.6.2: Pulling from elasticsearch/elasticsearch
c808caf183b6: Downloading [==>                                                ]  3.736MB/85.21MB
d6caf8e15a64: Downloading [===================>                               ]  13.69MB/34.71MB
b0ba5f324e82: Download complete
d7e8c1e99b9a: Downloading [=>                                                 ]  11.71MB/321.6MB
85c4d6c81438: Waiting
3119218fac98: Waiting
914accf214bb: Waiting
...

Creating docker-elk_elasticsearch_1 ... done
Creating docker-elk_logstash_1      ... done
Creating docker-elk_kibana_1        ... done
Attaching to docker-elk_elasticsearch_1, docker-elk_logstash_1, docker-elk_kibana_1
logstash_1       | OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
elasticsearch_1  | Created elasticsearch keystore in /usr/share/elasticsearch/config
logstash_1       | WARNING: An illegal reflective access operation has occurred
logstash_1       | WARNING: Illegal reflective access by com.headius.backport9.modules.Modules (file:/usr/share/logstash/logstash-core/lib/jars/jruby-complete-9.2.9.0.jar) to method sun.nio.ch.NativeThread.signal(long)
logstash_1       | WARNING: Please consider reporting this to the maintainers of com.headius.backport9.modules.Modules
logstash_1       | WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
logstash_1       | WARNING: All illegal access operations will be denied in a future release
elasticsearch_1  | OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
elasticsearch_1  | {"type": "server", "timestamp": "2020-05-03T03:47:40,483Z", "level": "INFO", "component": "o.e.e.NodeEnvironment", "cluster.name": "docker-cluster", "node.name": "0d05db8360df", "message": "using [1] data paths, mounts [[/usr/share/elasticsearch/data (/dev/sda2)]], net usable_space [83.6gb], net total_space [97.9gb], types [ext4]" }
elasticsearch_1  | {"type": "server", "timestamp": "2020-05-03T03:47:40,493Z", "level": "INFO", "component": "o.e.e.NodeEnvironment", "cluster.name": "docker-cluster", "node.name": "0d05db8360df", "message": "heap size [247.5mb], compressed ordinary object pointers [true]" }
kibana_1         | {"type":"log","@timestamp":"2020-05-03T03:47:40Z","tags":["info","plugins-service"],"pid":6,"message":"Plugin \"case\" is disabled."}

Журнал во время процесса запуска будет аналогичен приведенному выше, потому что при первом запуске необходимо загрузить соответствующее зеркало с официального склада зеркал веб-сайта, поэтому это будет медленнее. Когда вы видите журнал вывода терминала, аналогичный приведенному выше, это означает, что служба запущена.

Для проверки мы можем использовать браузер или инструменты, такие как curl, для доступа к адресу машины плюс номер порта 9200 и использовать имя пользователя по умолчанию.elasticи пароль по умолчаниюchangemeдля доступа к HTTP-порту Elasticsearch, если все в порядке, вы увидите результаты, подобные приведенным ниже.

{
  "name" : "0d05db8360df",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "Mq2EZX59TqW7ysGx7Y-jIw",
  "version" : {
    "number" : "7.6.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
    "build_date" : "2020-03-26T06:34:37.794943Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

Не спешите сейчас заходить в Kibana, давайте перейдем к настройкам конфигурации.

Сбросить встроенный пароль пользователя

использоватьdocker-compose exec -T elasticsearch bin/elasticsearch-setup-passwords auto --batchКоманда сбрасывает пароль по умолчанию для учетной записи службы по умолчанию.

docker-compose exec -T elasticsearch bin/elasticsearch-setup-passwords auto --batch

Changed password for user apm_system
PASSWORD apm_system = YkELBJGOT6AxqsPqsi7I

Changed password for user kibana
PASSWORD kibana = FxRwjm5KRYvHhGEnYTM9

Changed password for user logstash_system
PASSWORD logstash_system = A4f5VOfjVWSdi0KAZWGu

Changed password for user beats_system
PASSWORD beats_system = QnW8xxhnn7LMlA7vuI7B

Changed password for user remote_monitoring_user
PASSWORD remote_monitoring_user = OvjEGR13wjkOkIbWqaEM

Changed password for user elastic
PASSWORD elastic = PGevNMuv7PhVnaYg7vJw

После сохранения пароля нам нужноdocker-compose.ymlСлужба elasticsearch в конфигурационном файлеELASTIC_PASSWORDУдалите это, чтобы гарантировать, что служба начнет использовать только пароль (хранилище ключей), который мы только что сбросили. И информацию в конфигурационных файлах kibana и logstash нужно заменить, иelasticПароль пользователя обновлен. В начале мы упомянули связанные файлы в структуре каталогов. На данный момент вы можете изменить следующие три файла:

  • kibana/config/kibana.yml
  • logstash/config/logstash.yml
  • logstash/pipeline/logstash.conf

Следует отметить, что для конвейера logstash требуется учетная запись с высокими привилегиями.Во время текущего процесса тестирования и разработки можно использовать эластичную учетную запись и пароль для сброса.Для использования в рабочей среде см. официальную документацию.Configuring Security in LogstashПримите меры и назначьте новую выделенную учетную запись.

После изменения конфигурации выполняемdocker-compose restartПерезапустите соответствующие службы.

docker-compose restart

Restarting docker-elk_kibana_1        ... done
Restarting docker-elk_logstash_1      ... done
Restarting docker-elk_elasticsearch_1 ... done

Если в журнале нет 401 или отказа в доступе, с сервисом все в порядке.

Использование консоли Кибана

После запуска мы используем браузер для доступа к серверу IP + порт 5601 и открываем консоль kibana.

Kibana  默认登陆界面

После входа в систему с эластичной учетной записью и паролем вы можете увидеть интерфейс Kibana.Если вы используете его впервые, вы увидите интерфейс приветствия.

Kibana  登陆后欢迎界面

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

Kibana  导入示例数据

Далее идет процесс свободного исследования, :)

Kibana  默认示例面板

Отключить платные компоненты

Откройте интерфейс настроек, выберите «Управление лицензиями» в модуле Elasticsearch, и вы увидите, что программное обеспечение по умолчанию запустит месячную пробную версию расширенных функций.

ELK  新安装后默认授权

существуетОфициальная подпискаНа странице мы можем увидеть официально поддерживаемые типы подписки.В общем, если нет особых требований, просто используйте базовую версию.

ELK 官方付费方案

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

ELK  单节点版本健康状态

Выберите «Вернуться к базовой лицензии» и выберите вернуться к базовой версии. Вы можете видеть, что весь интерфейс намного проще. Если вы не платите, вы можете использовать программное обеспечение на законных основаниях и со спокойной душой.

ELK  基础版本授权界面

Конечно, вы также можете указать в файле конфигурации elasticsearch.ymlxpack.license.self_generated.typeпревратиться вbasicдля отключения функций, связанных с X-Pack.

xpack.license.self_generated.type: basic

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

Изменено из производственной среды официального примера

Основным требованием производственной среды является высокая доступность.В обычных реализациях развертывается «множество копий/экземпляров», несколько машин, несколько стоек и даже несколько регионов.

В этой статье сначала поговорим о самом простом мультиинстансе.

предварительная подготовка

Если вы хотите запустить ELK с Docker в рабочей среде, есть некоторые необходимые системные настройки.

Сначала отрегулируйтеvm.max_map_count, настройте его как минимум на 262144 или больше. существует/etc/sysctl.confПросто добавьте следующее.

vm.max_map_count = 262144

sysctl -w vm.max_map_count=262144

затем отрегулируйтеulimitsа такжеnprocedit, поскольку мы используем контейнеры для запуска приложений, связанных с ELK, мы можем напрямую изменить конфигурацию ES в файле конфигурации compose:

ulimits:
  memlock:
    soft: -1
    hard: -1

Продолжаем настраивать, закрываем обмен памятью, а также модифицируем конфигурацию ES в файле конфигурации compose:

environment:
  bootstrap.memory_lock: "true"

Размер кучи Java также необходимо настроить. Значение по умолчанию выглядит следующим образом, что слишком мало для производственной среды. Для получения дополнительной информации см.здесь.

environment:
  ES_JAVA_OPTS: "-Xmx1g -Xms1g"

Если вы его реально используете в продакшене, то обязательно включите TLS и аутентификацию по паролю.Чтобы не расширять пространство (и чтобы было лень обращаться за wildcard сертификатом/настраивать самоподпись) сначала используйте метод закрытия конфигурация безопасности, чтобы игнорировать этот параметр :)

Изменить конфигурацию для поддержки нескольких экземпляров

Официальное решение с несколькими экземплярами (Это официальное руководство), определяем три разные службы в compose, а затем используем первую службу в качестве мастера, чтобы выставить службу внешнему миру. Сначала мы основываемся на этой схеме и вносим некоторые коррективы.

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

mkdir -p data/{es01,es02,es03}
chmod g+rwx data/*
chgrp 0 data/*

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

volumes:
  - ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro
  - ./data:/usr/share/elasticsearch/data:rw

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

environment:
  cluster.name: "docker-cluster"
  network.host: "0.0.0.0"
  bootstrap.memory_lock: "true"
  xpack.license.self_generated.type: "basic"
  xpack.security.enabled: "false"
  xpack.monitoring.collection.enabled: "true"
  ES_JAVA_OPTS: "-Xmx1g -Xms1g"

Кроме того, поскольку задействована сеть с несколькими узлами, необходимо дополнительно указать имена узлов и другую информацию об этих экземплярах:

version: "3.2"

services:
  elasticsearch01:
    environment:
      node.name: "es01"
      discovery.seed_hosts: "es02,es03"
      cluster.initial_master_nodes: "es01,es02,es03"

  elasticsearch02:
    environment:
      node.name: "es02"
      discovery.seed_hosts: "es01,es03"
      cluster.initial_master_nodes: "es01,es02,es03"

  elasticsearch03:
    environment:
      node.name: "es03"
      discovery.seed_hosts: "es01,es02"
      cluster.initial_master_nodes: "es01,es02,es03"

Наконец, в соответствии с рекомендуемым режимом на официальном сайте, пусть одна из машин поддерживает открытые извне порты и обменивается данными с внешним миром.

ports:
  - 9200:9200
  - 9300:9300

На этом настройка нескольких экземпляров завершена.

Обновить конфигурацию Logstash

Есть две вещи, которые необходимо обновить logstash. Во-первых, запустить службу после запуска только что определенного экземпляра elasticsearch. Кроме того, конфигурацию можно переписать таким же образом, чтобы облегчить последующее обслуживание.

logstash:
  volumes:
    - ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro
    - ./logstash/pipeline:/usr/share/logstash/pipeline:ro
  depends_on:
    - elasticsearch01
    - elasticsearch02
    - elasticsearch03

Тогда нужно обновитьlogstash/config/logstash.ymlв конфигурацииxpack.monitoring.elasticsearch.hostинформацию, чтобы убедиться, что не будет проблем с запуском.

xpack.monitoring.elasticsearch.hosts: [ "http://es01:9200" ]

а такжеlogstash/pipeline/logstash.confв конфигурацииoutput. elasticsearchИнформацияhosts => "es01:9200".

Обновить конфигурацию Кибаны

Есть три места, которые нужно обновить, два из которых такие же, как Logstash, и еще одно нужно указатьELASTICSEARCH_URLАдрес — это адрес экземпляра elasticsearch, где мы предоставляем сервис.

kibana:
  volumes:
    - ./kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml:ro
  ports:
    - "5601:5601"
  depends_on:
    - elasticsearch01
    - elasticsearch02
    - elasticsearch03
  environment:
    - ELASTICSEARCH_URL=http://es01:9200
    - xpack.security.enabled=false

и требует дополнительных обновленийkibana/config/kibana.ymlв конфигурацииelasticsearch.hostsПолевая информация:

elasticsearch.hosts: [ "http://es01:9200" ]

полный профиль

Вышеупомянутая конфигурация завершается следующим образом:

version: "3.2"

services:
  elasticsearch01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.6.2
    container_name: es01
    volumes:
      - ./data/es01:/usr/share/elasticsearch/data:rw
    ports:
      - 9200:9200
      - 9300:9300
    environment:
      node.name: "es01"
      cluster.name: "docker-cluster"
      network.host: "0.0.0.0"
      discovery.seed_hosts: "es02,es03"
      cluster.initial_master_nodes: "es01,es02,es03"
      bootstrap.memory_lock: "true"
      xpack.license.self_generated.type: "basic"
      xpack.security.enabled: "false"
      xpack.monitoring.collection.enabled: "true"
      ES_JAVA_OPTS: "-Xmx1g -Xms1g"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    networks:
      - elk

  elasticsearch02:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.6.2
    container_name: es02
    volumes:
      - ./data/es02:/usr/share/elasticsearch/data:rw
    environment:
      node.name: "es02"
      cluster.name: "docker-cluster"
      network.host: "0.0.0.0"
      discovery.seed_hosts: "es01,es03"
      cluster.initial_master_nodes: "es01,es02,es03"
      bootstrap.memory_lock: "true"
      xpack.license.self_generated.type: "basic"
      xpack.security.enabled: "false"
      xpack.monitoring.collection.enabled: "true"
      ES_JAVA_OPTS: "-Xmx1g -Xms1g"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    networks:
      - elk

  elasticsearch03:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.6.2
    container_name: es03
    volumes:
      - ./data/es03:/usr/share/elasticsearch/data:rw
    environment:
      node.name: "es03"
      cluster.name: "docker-cluster"
      network.host: "0.0.0.0"
      discovery.seed_hosts: "es01,es02"
      cluster.initial_master_nodes: "es01,es02,es03"
      bootstrap.memory_lock: "true"
      xpack.license.self_generated.type: "basic"
      xpack.security.enabled: "false"
      xpack.monitoring.collection.enabled: "true"
      ES_JAVA_OPTS: "-Xmx1g -Xms1g"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    networks:
      - elk

  logstash:
    build:
      context: logstash/
      args:
        ELK_VERSION: $ELK_VERSION
    volumes:
      - ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro
      - ./logstash/pipeline:/usr/share/logstash/pipeline:ro
    ports:
      - "5000:5000/tcp"
      - "5000:5000/udp"
      - "9600:9600"
    environment:
      LS_JAVA_OPTS: "-Xmx1g -Xms1g"
    networks:
      - elk
    depends_on:
      - elasticsearch01
      - elasticsearch02
      - elasticsearch03

  kibana:
    build:
      context: kibana/
      args:
        ELK_VERSION: $ELK_VERSION
    volumes:
      - ./kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml:ro
    ports:
      - "5601:5601"
    networks:
      - elk
    depends_on:
      - elasticsearch01
      - elasticsearch02
      - elasticsearch03
    environment:
      - ELASTICSEARCH_URL=http://es01:9200
      - xpack.security.enabled=false

networks:
  elk:
    driver: bridge

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

После запуска службы откройте kibana, и вы увидите, что среда ELK с несколькими экземплярами настроена.

ELK  多实例配置完成

разное

Официальный документ веб-сайта содержит множество описаний содержимого конфигурации, и заинтересованные студенты могут узнать о нем больше, например, это Important System Configuration , тот же принцип применим и к некоторым другим приложениям.

Чтобы узнать, как использовать различные сервисы битов для отчетов о журналах, вы можете обратиться к официальномуобразец файла.

Наконец

Далее я напишу интересный и простой в использовании контент вокруг лога, это первый.

--EOF


Теперь у меня есть небольшая группа по метанию, в которую входят друзья, которые любят метать.

Без рекламы мы будем вместе болтать о софте, HomeLab и вопросах программирования, а также время от времени будем делиться технической информацией о салоне в группе.

Друзья, которые любят бросать, могут отсканировать код, чтобы добавить друзей. (Пожалуйста, укажите источник и цель, иначе не пройдет проверку)

Эти вещи о том, чтобы бросить группу в группу