2017-04-11 12 views
2

swarm docs内のLoad Balancingセクションでは、内部ロードバランサもヘルスチェックを行い、サービスを実行していないノードを削除した場合には、そのノードが削除されたかどうかを確認しません。ロードバランスを実行してノード上でヘルスチェックを実行する必要がありますか?

次のケースでは、レプリカ3,1つのインスタンスが3つのノードのそれぞれで実行されているサービスがあります。

マネージャー:

[[email protected] ~]# docker ps 
CONTAINER ID  IMAGE         COMMAND     CREATED    STATUS    PORTS    NAMES 
a593d485050a  ddewaele/springboot.crud.sample:latest "sh -c 'java $JAVA_OP" 7 minutes ago  Up 7 minutes       springbootcrudsample.1.5syc6j4c8i3bnerdqq4e1yelm 

ノード1:

[[email protected] ~]# docker ps 
CONTAINER ID  IMAGE         COMMAND     CREATED    STATUS    PORTS    NAMES 
d3b3fbc0f2c5  ddewaele/springboot.crud.sample:latest "sh -c 'java $JAVA_OP" 4 minutes ago  Up 4 minutes       springbootcrudsample.3.7y1oyjyrifgkmxlr20oai5ppl 

ノード2:今すぐ

[[email protected] ~]# docker ps 
CONTAINER ID  IMAGE         COMMAND     CREATED    STATUS    PORTS    NAMES 
ebca8f24ec3a  ddewaele/springboot.crud.sample:latest "sh -c 'java $JAVA_OP" 7 minutes ago  Up 7 minutes       springbootcrudsample.2.4tqjad7od8ep047s55485na1t 

は、node1で、我々は、ドッキングウィンドウコンテナを殺します。このノードは、コンテナがなくなって

[[email protected] ~]# docker kill d3b3fbc0f2c5 
d3b3fbc0f2c5 

(群れは、サービスのレプリケーション= 3を維持するために数秒後にここでそれを再作成します)サービスなしとなります

[[email protected] ~]# docker ps 
CONTAINER ID  IMAGE         COMMAND     CREATED    STATUS    PORTS    NAMES 

新コンテナアップ

ただし、以下の出力、コンテナ d3b3fbc0f2c5が殺された時に、進入ロードバランサーがこれを検出しなかった、そしてそれはまだノードにトラフィックを送信していたで
[[email protected] ~]# docker ps 
CONTAINER ID  IMAGE         COMMAND     CREATED    STATUS    PORTS    NAMES 
b8c9a7a5cf97  ddewaele/springboot.crud.sample:latest "sh -c 'java $JAVA_OP" 11 seconds ago  Up 9 seconds       springbootcrudsample.3.9v4cnhi8dvq7n8afb2kvp28sk 

(resulti接続が拒否されましたか?)

このようなシナリオはどのように処理する必要がありますか?このシナリオでは外部ロードバランサが必要ですが、どのように設定する必要がありますか?

場所に適切なヘルスチェックで、 François Maturelによって示されるように
[[email protected] ~]# while :; do curl http://localhost:8080/env/hostname ; echo "" ; sleep 1; done 
{"hostname":"d3b3fbc0f2c5"} 
{"hostname":"a593d485050a"} 
{"hostname":"ebca8f24ec3a"} 
{"hostname":"d3b3fbc0f2c5"} 
{"hostname":"a593d485050a"} 
{"hostname":"ebca8f24ec3a"} 
{"hostname":"d3b3fbc0f2c5"} 
{"hostname":"a593d485050a"} 
{"hostname":"ebca8f24ec3a"} 
{"hostname":"a593d485050a"} 
{"hostname":"ebca8f24ec3a"} 
{"hostname":"a593d485050a"} 
curl: (7) Failed connect to localhost:8080; Connection refused 

{"hostname":"ebca8f24ec3a"} 
{"hostname":"a593d485050a"} 
curl: (7) Failed connect to localhost:8080; Connection refused 

{"hostname":"ebca8f24ec3a"} 
{"hostname":"a593d485050a"} 
curl: (7) Failed connect to localhost:8080; Connection refused 

{"hostname":"ebca8f24ec3a"} 
{"hostname":"a593d485050a"} 
curl: (7) Failed connect to localhost:8080; Connection refused 

{"hostname":"ebca8f24ec3a"} 
{"hostname":"a593d485050a"} 
curl: (7) Failed connect to localhost:8080; Connection refused 

{"hostname":"ebca8f24ec3a"} 
{"hostname":"a593d485050a"} 
curl: (7) Failed connect to localhost:8080; Connection refused 

{"hostname":"ebca8f24ec3a"} 
{"hostname":"a593d485050a"} 
{"hostname":"b8c9a7a5cf97"} 
{"hostname":"ebca8f24ec3a"} 
{"hostname":"a593d485050a"} 
{"hostname":"b8c9a7a5cf97"} 
+1

あなたは[ヘルス](https://docs.docker.com/engine/reference/builder/#healthcheck)を使用して 'Dockerfile'でこのシナリオを試してみましたか?スウォームモードでは、このヘルスチェックを使用してトラフィックをサービスレプリカと均衡させることができます。 –

+0

確かに... HEALTHCHECKを実装してうまく動作します。 – ddewaele

答えて

2

、ドッカー群れが、それはそれへのルート要求をするかどうかを決定するために考慮に入れた容器の健康状態がかかります。

デフォルトのアクチュエータを有効にしたスプリングブートアプリケーションでは、これをDockerfileに追加するだけで基本的なヘルスチェックが可能です。 Springブートアプリケーションが初期化され、そのhealth actuatorが有効になっている場合、次のhttp要求は有効なhttp 200応答を返し、ヘルスチェックが成功します。

HEALTHCHECK CMD wget -q http://localhost:8080/health -O /dev/null 

これはあなたのドッキングウィンドウのコンテナが健康な状態に到達するanbleことになります。ドッカーコンテナが起動されると、その内部で実行されているサービスがまだ初期化されている可能性があります。適切なロード・バランシングとサービス・ヘルスの検出を行うためには、特定のサービス・インスタンス(ノード上のコンテナ)にreqeustをルーティングできることをSwarmが認識する必要があります。

サービスのレプリカを起動すると、コンテナが起動し、サービスの正常性ステータスが「正常」になるまで待機します。あなたのコンテナが開始されると、それは「開始」から移行します:

CONTAINER ID  IMAGE                          COMMAND     CREATED    STATUS          PORTS    NAMES 
5001e1c46953  ddewaele/[email protected]:4ce69c3f50c69640c8240f9df68c8816605c6214b74e6581be44ce153c0f3b7a "/docker-entrypoin..." 5 seconds ago  Up Less than a second (health: starting)      springbootcrudsample.2.yt6d38zhhq2wxt1d6qfjz5974 

「健康」に。その後、Swarmロードバランサのルート要求がこのエンドポイントに送られます。

[[email protected] ~]# docker ps 
CONTAINER ID  IMAGE                          COMMAND     CREATED    STATUS      PORTS    NAMES 
5001e1c46953  ddewaele/[email protected]:4ce69c3f50c69640c8240f9df68c8816605c6214b74e6581be44ce153c0f3b7a "/docker-entrypoin..." About a minute ago Up About a minute (healthy)      springbootcrudsample.2.yt6d38zhhq2wxt1d6qfjz5974 
0

@ddewaeleはので、ここでいくつかのより多くの一口です、正しいです:

  • はLBが直接ポート接続のチェックを行いませんいいえ、それは可能性がヘルスチェックを、キックオフドッカーエンジンの仕事ですシンプルなカールかそれ以上のもの。
  • ダウンタイムゼロの展開には、ヘルスチェックが不可欠です。特に、コンテナがスタートアップまたはシャットダウンに1秒未満かかる場合。健康チェックがなければ、ドッカーは「Linuxはプロセスが実行されていると言いますか?
  • あなたはそれが彼らの群れサービスの設定ヘルスと各コンテナにexecコマンドをキックオフ見ることdocker eventsを使用することができます。また、タスク/コンテナが健康/不健康であるとマークする方法も表示されます。
  • あり、タスクの更新/シャットダウン時にパケットを送信するイングレスロードバランサの問題/バグでしたが、私の知る限り17.12(ちょうど発売)のようものはほとんど/すべての固定されています。古い問題の1つは、コンテナのシャットダウンが始まる前にLBがそのルートテーブルからタスクを削除しないかもしれないが、人々は最後のいくつかのリリースからより良い結果を報告しているということです。 https://github.com/moby/moby/issues/30321
関連する問題