1

アップストリーム コンテナの 1 つがダウンしたときに、dockerized nginx をすばやくフェイルオーバーするにはどうすればよいですか? Docker 以外の環境ではフェイルオーバーは瞬時に行われるように見えますが、Docker 化するといくつかのリクエストがタイムアウトします。

同じノード アプリの 2 つのインスタンスの前にある単一のノード/VM で、nginx をロード バランサー/プロキシとして使用しています。私は次のように新しいバージョンのデプロイを想像しました (ブルー グリーン デプロイと呼ばれることがよくあります)。

  1. github にプッシュされた新しいバージョンのノード アプリ
  2. Docker ハブが新しい​​イメージをビルドします
  3. アップストリーム コンテナの 1 つが削除され、アップグレードされ、再デプロイされます
  4. コンテナの 1 つがダウンすると、nginx は自動的に他のライブ コンテナにフェイルオーバーします
  5. アップグレードされたコンテナがデプロイされると、他のコンテナもアップグレード/再デプロイのためにオフラインになります

ただし、nginx では #4 をシームレスに行うことはできません。バージョン バンプのためにアップストリーム コンテナーの 1 つを停止すると、コンテナーの 1 つがダウンしていると判断されるため、nginx はいくつかの要求を (ラウンド ロビン方式で) タイムアウトします。非ドッカー環境でこれが発生したことはありません。

これが私の docker クラウド スタック ファイルです。

load-balancer:
  image: 'foo/load-balancer:latest'
  links:
    - node-blue
    - node-green
  ports:
    - '80:80'
node-blue:
  image: 'foo/node-app:latest'
node-green:
  image: 'foo/node-app:latest'

nginx.conf は次のようになります。

events {
  worker_connections  1024;
}

http {
  gzip on;

  upstream app {
    server node-green;
    server node-blue;
  }

  server {
    listen 80;
    server_name app.local;
    location / {
        proxy_pass http://app;
    }
  }
}
4

1 に答える 1

1

たくさんのレスリングの後、合理的な解決策にたどり着いたと思います。dockercloud/haproxyのカスタム nginx コンテナーを交換しました。どうやら、ロード バランサーはdocker cloud eventsをリッスンし、それに応じて調整できる必要があるようです。

スタック ファイルは次のようになります。

load-balancer:
  image: 'dockercloud/haproxy:1.5.3'
  restart: always
  roles:
    - global
  links:
    - node-blue
  ports:
    - '80:80'
node-blue:
  image: 'foo/node-app:latest'
  environment:
    - VIRTUAL_HOST=app.local
node-green:
  image: 'foo/node-app:latest'
  environment:
    - VIRTUAL_HOST=app.local

新しいバージョンをデプロイする場合は、次のスクリプトを実行するだけです。

docker-cloud service set --link node-green:node-green load-balancer
docker-cloud service redeploy node-blue --sync
docker-cloud service set --link node-blue:node-blue load-balancer
docker-cloud service redeploy node-green --sync
于 2016-09-01T20:32:30.670 に答える