アップストリーム コンテナの 1 つがダウンしたときに、dockerized nginx をすばやくフェイルオーバーするにはどうすればよいですか? Docker 以外の環境ではフェイルオーバーは瞬時に行われるように見えますが、Docker 化するといくつかのリクエストがタイムアウトします。
同じノード アプリの 2 つのインスタンスの前にある単一のノード/VM で、nginx をロード バランサー/プロキシとして使用しています。私は次のように新しいバージョンのデプロイを想像しました (ブルー グリーン デプロイと呼ばれることがよくあります)。
- github にプッシュされた新しいバージョンのノード アプリ
- Docker ハブが新しいイメージをビルドします
- アップストリーム コンテナの 1 つが削除され、アップグレードされ、再デプロイされます
- コンテナの 1 つがダウンすると、nginx は自動的に他のライブ コンテナにフェイルオーバーします
- アップグレードされたコンテナがデプロイされると、他のコンテナもアップグレード/再デプロイのためにオフラインになります
ただし、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;
}
}
}