3つのノードを持つDocker Swarmをセットアップしました。それらはすべてクラスタの一部として構成されています。マスターノードはコンテナのホストでもあります。Traefikが同じネットワーク上のコンテナを見つけることができないのはなぜですか?
各ノードには、集中化されたデータを格納するNFSへのNFSマウントがあります。
グローバルなElasticSearchクラスタを作成しているので、すべてのノードで実行されます。これは、DNSラウンドロビン(dnsrr
)を使用してDocker Swarmで実行されるように構成されています。 dnsrr
は、ポートを露出することはできませんので、私は19200の要求をリッスンし、その後9200
Traefik、ElasticSearch ProxyとElasticSearchノードが全てに接続されているポート上のサービスelasticsearch
にそれらをプロキシnginxのプロキシサーバーを使用しています同じオーバレイネットワークelastic_cluster
と呼ばれます。ネットワークは10.0.10.0/24
です。
Traefikが名前付きホストを持ち、ポート443でelasticsearch.homenetwork.local
(実ドメインではない)に応答するように設定しました。(暗号化が設定されました)、Nginxプロキシに転送する必要があります。 Traefikサービスは、私はこのエラーを取得する理由を私は理解していない10.0.10.0/24
ネットワーク上にあることを考えると
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"
:私がしようとするとhttps://elasticsearch.homenetwork.local
を打ったとき
は、しかし、私はTraefikログにエラーが発生します。私はPortainerを使ってサービスを追跡しています.TraefikサービスのIPアドレスは10.0.10.4
です。
IPアドレスが10.0.10.7
のNginxプロキシとの対話セッションを実行すると、問題なく10.0.10.4
にpingすることができます。
コンテナはすべてUbuntuを実行しています。関係する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 serviceコマンド
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
あなたは正しいです、私はそれらを忘れました。私は設定したラベルで質問を更新しました。ありがとうございました。 –
あなたは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' –
私はこれについて混乱しています。 TraefikはNGinxサービスと同じネットワーク上にあるので、ポートを公開する必要はありません。実際、それは私がスワームに暴露された港がないためにやりたいことの一つでした。何か不足していますか?ポートを公開することについての私の理解は、サービスを直接打つことができるようにすることです - 私はTraefikをここで代理することを試みています。 –