Перенос нод кластера в docker

Добрый день.

Есть кластер из 4х нод - 3 дата и 1 координатор. Пытаюсь запустить координатора в docker. Прочитал официальную инструкцию, но не понял как правильно переносить инстансы, если они на разных нодах.

Права на директории выдал, контейнер запускаю командой

docker run
-v /etc/elasticsearch/:/usr/share/elasticsearch/config/
-v /var/log/elasticsearch/:/var/log/elasticsearch/
-v /var/lib/elasticsearch/:/var/lib/elasticsearch/
-p 9200:9200
-p 9300:9300
docker.elastic.co/elasticsearch/elasticsearch:7.9.1

elasticsearch.yml:

node.master: false
node.data: false
node.ingest: false

cluster.name: elk-cluster.mgt.com

node.name: Kibana-Balancer

path.data: /var/lib/elasticsearch

path.logs: /var/log/elasticsearch

network.host: "0.0.0.0"

http.port: 9200

discovery.seed_hosts: ["10.199.5.104","10.199.5.105","10.199.5.106"]

Контейнер запускается, но не может подключиться к кластеру

[2021-01-14T13:42:44,385][INFO ][o.e.n.Node               ] [Kibana-Balancer] started
[2021-01-14T13:42:44,509][INFO ][o.e.c.c.JoinHelper       ] [Kibana-Balancer] failed to join {elk-es-node-03}{fKA8Je-YTV-RuQ3D5OyasQ}{vR5_dstqTMW2OczAqy9uew}{10.199.5.105}{10.199.5.105:9300}{dilmrt}{ml.machine_memory=12564250624, ml.max_open_jobs=20, xpack.installed=true, transform.node=true} with JoinRequest{sourceNode={Kibana-Balancer}{5IaB4a6yTAaCHcBYdMLJpA}{QBWF9WFjR-e6KIivGtc5og}{172.17.0.3}{172.17.0.3:9300}{lr}{ml.machine_memory=12563730432, xpack.installed=true, transform.node=false, ml.max_open_jobs=20}, minimumTerm=316, optionalJoin=Optional[Join{term=316, lastAcceptedTerm=0, lastAcceptedVersion=0, sourceNode={Kibana-Balancer}{5IaB4a6yTAaCHcBYdMLJpA}{QBWF9WFjR-e6KIivGtc5og}{172.17.0.3}{172.17.0.3:9300}{lr}{ml.machine_memory=12563730432, xpack.installed=true, transform.node=false, ml.max_open_jobs=20}, targetNode={elk-es-node-03}{fKA8Je-YTV-RuQ3D5OyasQ}{vR5_dstqTMW2OczAqy9uew}{10.199.5.105}{10.199.5.105:9300}{dilmrt}{ml.machine_memory=12564250624, ml.max_open_jobs=20, xpack.installed=true, transform.node=true}}]}
org.elasticsearch.transport.RemoteTransportException: [elk-es-node-03][10.199.5.105:9300][internal:cluster/coordination/join]
Caused by: org.elasticsearch.transport.ConnectTransportException: [Kibana-Balancer][172.17.0.3:9300] connect_timeout[30s]
	at org.elasticsearch.transport.TcpTransport$ChannelsConnectedListener.onTimeout(TcpTransport.java:972) ~[elasticsearch-7.9.1.jar:7.9.1]
	at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingRunnable.run(ThreadContext.java:651) ~[elasticsearch-7.9.1.jar:7.9.1]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[?:?]
	at java.lang.Thread.run(Thread.java:748) [?:?]
[2021-01-14T13:42:44,515][INFO ][o.e.c.c.JoinHelper       ] [Kibana-Balancer] failed to join {elk-es-node-03}{fKA8Je-YTV-RuQ3D5OyasQ}{vR5_dstqTMW2OczAqy9uew}{10.199.5.105}{10.199.5.105:9300}{dilmrt}{ml.machine_memory=12564250624, ml.max_open_jobs=20, xpack.installed=true, transform.node=true} with JoinRequest{sourceNode={Kibana-Balancer}{5IaB4a6yTAaCHcBYdMLJpA}{QBWF9WFjR-e6KIivGtc5og}{172.17.0.3}{172.17.0.3:9300}{lr}{ml.machine_memory=12563730432, xpack.installed=true, transform.node=false, ml.max_open_jobs=20}, minimumTerm=316, optionalJoin=Optional[Join{term=316, lastAcceptedTerm=0, lastAcceptedVersion=0, sourceNode={Kibana-Balancer}{5IaB4a6yTAaCHcBYdMLJpA}{QBWF9WFjR-e6KIivGtc5og}{172.17.0.3}{172.17.0.3:9300}{lr}{ml.machine_memory=12563730432, xpack.installed=true, transform.node=false, ml.max_open_jobs=20}, targetNode={elk-es-node-03}{fKA8Je-YTV-RuQ3D5OyasQ}{vR5_dstqTMW2OczAqy9uew}{10.199.5.105}{10.199.5.105:9300}{dilmrt}{ml.machine_memory=12564250624, ml.max_open_jobs=20, xpack.installed=true, transform.node=true}}]}
org.elasticsearch.transport.RemoteTransportException: [elk-es-node-03][10.199.5.105:9300][internal:cluster/coordination/join]
Caused by: org.elasticsearch.transport.ConnectTransportException: [Kibana-Balancer][172.17.0.3:9300] connect_timeout[30s]
	at org.elasticsearch.transport.TcpTransport$ChannelsConnectedListener.onTimeout(TcpTransport.java:972) ~[elasticsearch-7.9.1.jar:7.9.1]
	at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingRunnable.run(ThreadContext.java:651) ~[elasticsearch-7.9.1.jar:7.9.1]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[?:?]
	at java.lang.Thread.run(Thread.java:748) [?:?]
[2021-01-14T13:42:44,758][WARN ][r.suppressed             ] [Kibana-Balancer] path: /.kibana/_search, params: {rest_total_hits_as_int=true, size=1000, index=.kibana, from=0}
org.elasticsearch.cluster.block.ClusterBlockException: blocked by: [SERVICE_UNAVAILABLE/1/state not recovered / initialized];

Kibana показывает ошибку
{"statusCode":503,"error":"Service Unavailable","message":"blocked by: [SERVICE_UNAVAILABLE/1/state not recovered / initialized];: [cluster_block_exception] blocked by: [SERVICE_UNAVAILABLE/1/state not recovered / initialized];"}

Подскажите пожалуйста, в чем может быть проблема?

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

Координатор в docker проблематичен, так как он изолирует внутреннюю сеть. Поэтому нода координации думает что у нее IP 172.17.0.3 и так представляется другим узлам, а другие узлы вне docker-а понятия не имеют где эта сетка. Внешний адрес можно указать реальный IP машины на которой запущен в установке network.publish_host.

1 Like

Всё оказалось очень просто ) Причём я пробовал добавлять эту настройку, но указывал либо для network.host и publish_host адрес хоста и ничего не работало, либо 0.0.0.0 и тоже ничего не работало.
Сейчас сделал вот так

network.host: "0.0.0.0"
network.publish_host: "10.199.5.107"

И всё запустилось. Большое спасибо за помощь!

Да, network.host задает и network.publish_host и network.bind_host. Последний (bind_host) задает IP на котором elasticsearch должен принимать входящие соединения. Если задать адрес хоста, то внутри докера это адрес не существует, поэтом elasticsearch не может его использовать. 0.0.0.0, eth0 или _site_ для network.bind_host или network.host должно работать.

1 Like