理想的なターゲットシナリオ
はい、ロードバランサーを使用して、一度に1つのインスタンスを更新する必要があります。コンテナ間通信がどこから来るのかわかりません。
例として、サイトAにサービスを提供するロードバランサーがあるとします。ユーザーは「A」としてのみ接続し、「A」としてのみ接続します。ロードバランサーは、2つ以上のバックエンド(B、Cなど)があり、それらがVMであるかコンテナーであるかは重要ではないことを知っています。
次に、バックエンド(この場合はApacheインスタンス)をアップグレードします。
- ロードバランサーの対象となるバックエンドからBを削除して、トラフィックを受け入れないようにします。
- 現在実行中のリクエストが処理され、既存の接続が閉じられるまで待ちます。
- Bを提供するコンテナまたは基盤となるVMを更新する
- Bを再起動し、ロードして作業を開始するのを待ちます
- テストBが新しいリクエストを適切に処理していることを確認します
- ロードバランサーバックエンドプールにBを追加して、トラフィックを再度有効にします
次に、C、Dなどに対して同じプロセスを実行します。
Dockerコンテナのインプレースアップグレードについては、2013年11月から未解決のリクエストがありますが、あまり進展が見られないため、上記の解決策は当面の間行うべきものです。
既存のライブサイトに対して行うこと
おそらく、このモデルでライブサイトを既に実行していて、ダウンタイムなしでアップグレードしたいので、これを求めているのでしょう。したがって、上記の理想的な目標状態に到達する必要がありますが、漸進的です。
それを仮定しましょう:
- コンテナを指すDNS名があります
- コンテナはいくつかのIPアドレスで実行されます
- ユーザーはコンテナのIPアドレスを知らず、どこにもハードコードされていません
これらの仮定が間違っている場合、まずこれが正しいように修正する必要があります。
次に、次の手順を実行します。
- 新しいIPでロードバランサーを作成し、既存のコンテナーを唯一のバックエンドとしてポイントする
- コンテナIPではなくロードバランサーを直接指すようにDNSを変更する
- 同じVM +コンテナ設定で同一のApacheバックエンドを追加します
- これで、2つのバックエンドBとCを備えたロードバランサーがあるので、「理想的なターゲットシナリオ」セクションの指示に従って、一度に1つずつアップグレードしてください。
ロードバランサーを更新する方法
簡単な(ホストされた)方法
最も簡単なオプションは、独自のバランサーを実行しないことです。たとえば、サービスとして負荷分散を提供するクラウドプラットフォームを使用している場合は、それを使用することを検討してから、ロードバランサーのメンテナンスと更新は問題になりません。
手動の方法
独自のロードバランサーを実行している場合は、別の間接層(つまり、DNS)を追加すると役立ちます。以下を想定してみましょう:
- ロードバランサーAのIPに解決するホスト名があり、更新したい
- ロードバランサーには、P1、P2などのバックエンドプールがあります。
次のように進めます。
これで完了です。
詳細、図、およびツール
プロセスの自動化に役立つこれらの記事とツールを参照してください。ただし、一般的な考え方は同じです。
道徳
「コンピュータサイエンスの問題はすべて、別のレベルのインダイレクションで解決できます。もちろん、インダイレクションが多すぎる場合は例外です。」— デヴィッド・ウィーラー