Разрешение имени хоста не работает из клиента Elasticsearch под Docker - PullRequest
0 голосов
/ 13 мая 2019

Возникли проблемы с запуском ElasticSearch в приложении Laravel на Docker. У меня было такое же приложение, работающее без проблем в локальной среде, и в настоящее время я нахожусь в процессе настройки UAT и производственных экземпляров приложения, этот вопрос относится к экземпляру UAT.

Я использую Docker в режиме роя и имею несколько контейнеров, два из которых - PHP и Elasticsearch. В docker-compose.yml я установил имя контейнера Elasticsearch на portal_elasticsearch.

Вот проблема

Если я exec войду в контейнер PHP и пингую portal_elasticsearch, я вижу, что система сама может разрешить IP из имени хоста;

$ ping portal_elasticsearch
PING portal_elasticsearch (10.0.1.65) 56(84) bytes of data.
64 bytes from 10.0.1.65 (10.0.1.65): icmp_seq=1 ttl=64 time=0.124 ms

Более того, я могу отправлять запросы на Flexiblesearch через curl и получать ответ;

$ curl portal_elasticsearch:9200/_cat/indices?v
health status index            uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   remortgage_index VPvFRhhaQ5257zvmQuUkIQ   5   1         17            0    182.7kb        182.7kb

PHP даже разрешает это правильно;

$ php -r 'echo gethostbyname("portal_elasticsearch") . "\n";'
10.0.1.65

Однако, если я достигаю конечной точки в приложении Laravel, я получаю следующую ошибку (я отредактировал некоторые вещи вниз по стеку, что не имеет значения), достаточно сказать, что я прошел через все приложение, и оно выдает ошибка при проверке кода ответа HTTP, возвращаемого из Elasticsearch;

{
    "message": "No alive nodes found in your cluster",
    "status_code": 500,
    "debug": {
        "line": 52,
        "file": "/var/www/api/vendor/elasticsearch/elasticsearch/src/Elasticsearch/ConnectionPool/StaticNoPingConnectionPool.php",
        "class": "Elasticsearch\\Common\\Exceptions\\NoNodesAvailableException",
        "trace": [
            "#0 /var/www/api/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Transport.php(76): Elasticsearch\\ConnectionPool\\StaticNoPingConnectionPool->nextConnection()",
            "#1 /var/www/api/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Transport.php(94): Elasticsearch\\Transport->getConnection()",
            "#2 /var/www/api/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Connections/Connection.php(245): Elasticsearch\\Transport->performRequest('PUT', '//portal_elasti...', Array, '{\"id\":\"2b6bcc41...', Array)",
            "#3 /var/www/api/vendor/react/promise/src/FulfilledPromise.php(25): Elasticsearch\\Connections\\Connection->Elasticsearch\\Connections\\{closure}(Array)",
            "#4 /var/www/api/vendor/guzzlehttp/ringphp/src/Future/CompletedFutureValue.php(55): React\\Promise\\FulfilledPromise->then(Object(Closure), NULL, NULL)",
            "#5 /var/www/api/vendor/guzzlehttp/ringphp/src/Core.php(341): GuzzleHttp\\Ring\\Future\\CompletedFutureValue->then(Object(Closure), NULL, NULL)",
            "#6 /var/www/api/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Connections/Connection.php(298): GuzzleHttp\\Ring\\Core::proxy(Object(GuzzleHttp\\Ring\\Future\\CompletedFutureArray), Object(Closure))",
            "#7 /var/www/api/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Connections/Connection.php(176): Elasticsearch\\Connections\\Connection->Elasticsearch\\Connections\\{closure}(Array, Object(Elasticsearch\\Connections\\Connection), Object(Elasticsearch\\Transport), Array)",
            "#8 /var/www/api/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Transport.php(110): Elasticsearch\\Connections\\Connection->performRequest('PUT', '/remortgage_ind...', Array, '{\"id\":\"2b6bcc41...', Array, Object(Elasticsearch\\Transport))",
            "#9 /var/www/api/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Client.php(1553): Elasticsearch\\Transport->performRequest('PUT', '/remortgage_ind...', Array, Array, Array)",
            "#10 /var/www/api/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Client.php(791): Elasticsearch\\Client->performRequest(Object(Elasticsearch\\Endpoints\\Index))",
            "#11 /var/www/api/app/DomainImplementation/Infrastructure/ElasticSearchClient.php(41): Elasticsearch\\Client->index(Array)",
            "#12 /var/www/api/app/DomainImplementation/ReadModel/RemortgageElasticSearchRepository.php(45): App\\DomainImplementation\\Infrastructure\\ElasticSearchClient->index('2b6bcc41-f0de-4...', 'remortgage_inde...', 'remortgage', Array)",
            << SNIP >>
        ]
    }
}

Однако

Если я изменю свой файл .env на внутренний IP-адрес (10.0.1.65, как указано выше) контейнера Elasticsearch Docker, тогда он будет работать нормально.

TL; DR: Клиент PHP Elasticsearch не будет работать с именем хоста, но будет работать с IP-адресом, даже если PHP и ОС могут разрешить имя хоста.

1 Ответ

0 голосов
/ 13 мая 2019

TL; DR: Мне удалось это исправить, убедитесь, что имена хостов не имеют подчеркивания.

После нескольких часов возни я наткнулся на следующее в документации к официальному PHP-клиентуasticsearch:

К сожалению, эти встроенные методы сталкиваются с проблемами с некоторыми краевые случаи. Например, filter_var() не будет принимать URL, которые имеют подчеркивает (что сомнительно законно, в зависимости от того, как вы интерпретировать RFC).

В моем вопросе вы можете видеть, что имя хоста для Docker-контейнераasticsearch равно portal_elasticsearch. Мне удалось исправить мою проблему, изменив имя хоста на portal-elasticsearch. В качестве альтернативы я мог бы использовать Расширенная конфигурация хоста для настройки Elasticsearch на использование имени хоста с подчеркиванием, хотя, как указывает документация эластичного поиска, законность этого сомнительна в зависимости от того, как интерпретируются RFC.

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