2017-12-02 8 views
0

3 개의 노드가있는 Docker Swarm을 설정했습니다. 그것들은 모두 클러스터의 일부로 구성됩니다. 마스터 노드는 컨테이너의 호스트이기도합니다.Traefik이 같은 네트워크에서 컨테이너를 찾을 수없는 이유는 무엇입니까?

각 노드에는 중앙 집중식 데이터를 저장하기 위해 NFS에 대한 NFS 마운트가 있습니다.

전 세계의 ElasticSearch 클러스터를 만들었으므로 모든 노드에서 실행됩니다. 이것은 DNS 라운드 로빈 (dnsrr)을 사용하여 Docker Swarm에서 실행되도록 구성됩니다. dnsrr으로 포트 내가 19200에 요청을 대기하는 Nginx에 프록시 서버가 다음 ElasticSearch 프록시 및 ElasticSearch 노드 모두에 연결되어 9200

Traefik, 포트에서 서비스 elasticsearch로 프록시 노출 될 수 없습니다 elastic_cluster과 같은 오버레이 네트워크. 네트워크는 10.0.10.0/24입니다.

Traefik을 명명 된 호스트로 지정하고 포트 443에서 elasticsearch.homenetwork.local (실제 도메인이 아님)에 대한 답변을 제공합니다. (암호화가 구성됩니다) Nginx 프록시로 전달해야합니다. 나는 시도하고 https://elasticsearch.homenetwork.local을 쳤을 때

그러나 나는 Traefik 로그에 오류가 :

time="2017-12-02T22:50:37Z" level=warning msg="Error forwarding to http://10.0.10.3:19200, err: dial tcp 10.0.10.3:19200: getsockopt: no route to host" 

는 Traefik 서비스가 난이 오류가 왜 이해하지 않는 10.0.10.0/24 네트워크에있는 점을 감안. 서비스를 추적하기 위해 Portainer를 사용 중이며 Traefik 서비스의 IP 주소는 10.0.10.4입니다.

IP 주소가 10.0.10.7 인 Nginx 프록시에 대화 형 세션을 실행하는 경우 문제없이 10.0.10.4을 ping 할 수 있습니다.

컨테이너에는 모두 우분투가 실행됩니다. 관련된 iptables은 없습니다.

이전에 이와 비슷한 것을 본 사람이 있습니까? 나는 여기에 무엇이 잘못 되었는가를 고민하고있다. 누군가가 제안을한다면 나는 그들에게 매우 감사 할 것이다. 정말 짜증나는 것은 이것이 작동하는데 사용된다는 것입니다. 나는 아무것도 바꾸지 않았지만 분명히 어떤 것이 있습니다.

ElasticSearch 서비스 명령을

docker service create --name elasticsearch \ 
         --network elastic_cluster \ 
         --constraint "node.labels.app_role == "elasticsearch" \ 
         --mode global \ 
         --endpoint-mode dnsrr \ 
         docker.elastic.co/elasticsearch/elasticsearch:5.4.2 \ 
         elasticsearch 

ElasticSearch 프록시 서비스 명령 :

docker service create --name elasticsearch_proxy \ 
         --network elastic_cluster \ 
         --label traefik.enable=true \ 
         --label traefik.backend=elasticsearch_proxy \ 
         --label traefik.port=19200 \ 
         --label traefik.frontend.rule=Host:elasticsearch.home.turtlesystems.co.uk \ 
         --label traefik.docker.network=elastic_cluster \ 
         nginx:1.13 

nginx.conf-https://pastebin.com/Q5sXw6aw

Traefik 서비스 명령

docker service create --name reverse_proxy \ 
         --network elastic_cluster \ 
         --network traefik-net \ 
         --constraint "node.role == manager" \ 
         --publish 80:80 \ 
         --publish 8080:8080 \ 
         --publish 443:443 \ 
         traefik 
,

traefik.toml - https://pastebin.com/GFPu8MYJ

답변

0

을 설정 라벨을 언급하는 것을 잊었다 고 생각 .

교체 후 모든 문제가 해결되었습니다.모든 제안을 해주셔서 감사합니다.

0

나는 당신이 내가 네트워크 문제가 된 이유 때문에 결함 네트워크 케이블의 것을 판명이 모든 후 당신의 서비스에

docker service create --name elasticsearch_proxy \ 
         --label traefik.docker.network=elastic_cluster 
         --label traefik.enable=true 
         --label traefik.port=19200 
         --network elastic_cluster \ 
         nginx:1.13 
+0

당신은 정확합니다, 나는 그들을 잊었습니다. 내가 설정 한 레이블로 내 질문을 업데이트했습니다. 고맙습니다. –

+0

nginx 서비스는 포트 19200을 노출시키지 않습니다.'docker service create --name elasticsearch_proxy \ --network elastic_cluster \ --label traefik.enable = true \ 에 '--expose 19200'을 추가해야합니다. 레이블 traefik.backend = elasticsearch_proxy \ - 레이블 traefik.port = 19200 \ - 레이블 traefik.frontend.rule = 호스트 : elasticsearch.home.turtlesystems.co.uk \ - 레이블 traefik.docker.network = elastic_cluster \ nginx : 1.13' –

+0

나는 이것에 대해 혼란스러워합니다. Traefik은 NGinx 서비스와 동일한 네트워크에 있으므로, 포트를 노출 할 필요는 없습니다. 사실 그것은 내가하고 싶었던 것들 중 하나였습니다. 그래서 스웜에 노출 된 항구가 없었습니다. 내가 놓친 게 있니? 포트 노출에 대한 나의 이해는 직접 서비스를 공격 할 수 있도록하기 위함입니다. Traefik을 사용하여 프록시를 사용하려고합니다. –