Вопрос или проблема
Я пытался настроить Metricbeat с моей конфигурацией Elastic Stack, используя Docker, но постоянно получаю ошибку, из-за которой Metricbeat не может подключиться к Kibana. Вот журнал ошибок:
{"log.level":"error","@timestamp":"2024-10-24T22:41:29.959Z","log.origin":{"file.name":"instance/beat.go","file.line":1142},"message":"Выход: ошибка подключения к Kibana: не удалось получить версию Kibana: HTTP GET запрос к http://localhost:5601/api/status не удался: не удалось выполнить HTTP GET запрос: Получить \"http://localhost:5601/api/status\": соединение tcp 127.0.0.1:5601: подключение отклонено (статус=0). Ответ: ","service.name":"metricbeat","ecs.version":"1.6.0"}
Похоже, что Metricbeat пытается подключиться к Kibana, используя localhost:5601, но соединение отклоняется. Я использую Docker Compose для настройки, и вот мой файл docker-compose.yml:
version: "3.8"
networks:
default:
name: elastic
external: false
services:
metricbeat:
depends_on:
- kibana
image: docker.elastic.co/beats/metricbeat:8.7.1
user: root
environment:
- KIBANA_HOSTS=http://kibana:5601
volumes:
- ./metricbeatdata01:/usr/share/metricbeat/data
- "./metricbeat.yml:/usr/share/metricbeat/metricbeat.yml:ro"
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- "/sys/fs/cgroup:/hostfs/sys/fs/cgroup:ro"
- "/proc:/hostfs/proc:ro"
- "/:/hostfs:ro"
restart: on-failure
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.7.1
container_name: elasticsearch
volumes:
- es_data:/usr/share/elasticsearch/data
environment:
- discovery.type=single-node
- xpack.security.enabled=false
- network.host=0.0.0.0
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ports:
- 9200:9200
kibana:
depends_on:
- elasticsearch
image: docker.elastic.co/kibana/kibana:8.7.1
volumes:
- kibanadata:/usr/share/kibana/data
ports:
- 5601:5601
environment:
- SERVERNAME=kibana
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
healthcheck:
test:
[
"CMD-SHELL",
"curl -s -I http://localhost:5601 | grep -q 'HTTP/1.1 302 Found'",
]
interval: 10s
timeout: 10s
retries: 120
volumes:
es_data:
driver: local
kibanadata:
driver: local
А вот мой metricbeat.yml:
metricbeat.modules:
- module: docker
metricsets: ["container", "cpu", "diskio", "info", "memory", "network"]
hosts: ["unix:///var/run/docker.sock"]
period: 5s
output.elasticsearch:
hosts: ["elasticsearch:9200"]
setup.kibana:
hosts: kibana:5601
setup.dashboards.enabled: true
- Убедился, что setup.kibana.hosts указывает на kibana:5601 в metricbeat.yml.
- Проверил, что сервис Kibana работает.
- Увеличил количество повторов и интервалы в проверке работоспособности Kibana.
- Дважды проверил, что Kibana доступна из других сервисов по адресу http://kibana:5601 внутри сети Docker.
- Однако Metricbeat все еще пытается подключиться к localhost:5601 вместо kibana:5601. – Я не уверен, почему это происходит, и застрял на этом этапе.
Есть идеи, что может быть причиной того, что Metricbeat не может подключиться к Kibana?
Ответ или решение
Решение проблемы подключения Metricbeat к Kibana: «Соединение отвергнуто» на http://localhost:5601
Если вы столкнулись с ошибкой подключения Metricbeat к Kibana в Docker, где выводится сообщение "Connection refused" при попытке доступа к http://localhost:5601
, возможно, несколько факторов мешают корректной работе. Важным аспектом этого процесса является правильная конфигурация сетевых адресов и переменных окружения.
Причины проблемы
-
Неверный Host для Kibana: В вашем конфигурационном файле
metricbeat.yml
указано:setup.kibana: hosts: kibana:5601
Но, несмотря на это, Metricbeat пытается подключиться к
http://localhost:5601
, что наводит на мысль о возможной конфигурационной ошибке или конфликтах при запуске контейнеров. -
Некорректная конфигурация окружения в Docker: Параметр
KIBANA_HOSTS
в вашемdocker-compose.yml
задает адрес для подключения к Kibana следующим образом:environment: - KIBANA_HOSTS=http://kibana:5601
Тем не менее, Metricbeat может не принимать это значение.
Шаги для диагностики и решения
-
Проверьте сетевое соединение:
Убедитесь, что соединение между контейнерами функционирует должным образом. Заведите команду внутри контейнера Metricbeat:docker exec -it <metricbeat_container_name> curl http://kibana:5601/api/status
Это подтвердит, что контейнер Metricbeat способен достучаться до Kibana.
-
Обновление параметров конфигурации:
Убедитесь, что в вашемmetricbeat.yml
указаны правильные значения:setup.kibana: hosts: ["http://kibana:5601"]
Убедитесь, что синтаксис соответствует требованиям YAML и правильно отформатирован.
-
Перезапуск Docker Compose:
После внесения изменений, выполните команду для перезапуска Docker Compose:docker-compose down docker-compose up -d
Этот шаг гарантирует, что все контейнеры перезапустятся с новыми конфигурациями.
-
Проверка здоровья Kibana:
Следите за статусом контейнера Kibana. Он должен быть в состоянииHealthy
после развертывания. Используйте команду:docker ps
чтобы увидеть статус контейнеров.
-
Логи Metricbeat:
Проверьте логи Metricbeat для получения дополнительной информации о возможных ошибках:docker logs <metricbeat_container_name>
-
Версия контейнеров: Убедитесь, что вы используете совместимые версии образов
elastic
, так как различия в версиях могут вызывать проблемы совместимости. -
Проверка Docker Network:
Убедитесь, что все сервисы находятся в одной сети Docker и могут обмениваться данными. Используйте команду:docker network inspect elastic
для проверки созданной сети.
Заключение
Если после выполнения всех вышеперечисленных шагов проблема не исчезнет, рекомендуется проверить настройки Docker специфичных для вашей ОС или обратиться к официальной документации Elastic для дальнейшего устранения неполадок. Работая с контейнерами, важно помнить о конфигурации сетей и переменных окружения, так как они являются частью ключевых аспектов успешного развертывания Elastic Stack.
Поддерживайте вашу инфраструктуру актуальной и следите за совместимостью компонентов для поддержания стабильной и эффективной работы системы.