ダウンタイムなしでDockerコンテナーを更新する


17

Webサーバー(Apache 2など)を備えたDockerコンテナーがあるとします。次に、その下のOSを更新します。このSFの答えは、最良の方法はベースイメージと私のApacheイメージを再構築することだと言います。ただし、新しいコンテナを作成する前に古いコンテナを削除する必要があるため、イメージをデプロイするとダウンタイムが発生します。したがって、ポート80/443にバインドするコンテナは1つだけです。

しかし、ダウンタイムなしでこの更新プログラムを展開するにはどうすればよいですか?ロードバランサーを使用し、コンテナー間通信を使用する必要がありますか?また、ロードバランサーを更新するにはどうすればよいですか?

回答:


18

理想的なターゲットシナリオ

はい、ロードバランサーを使用して、一度に1つのインスタンスを更新する必要があります。コンテナ間通信がどこから来るのかわかりません。

例として、サイトAにサービスを提供するロードバランサーがあるとします。ユーザーは「A」としてのみ接続し、「A」としてのみ接続します。ロードバランサーは、2つ以上のバックエンド(B、Cなど)があり、それらがVMであるかコンテナーであるかは重要ではないことを知っています。

次に、バックエンド(この場合はApacheインスタンス)をア​​ップグレードします。

  1. ロードバランサーの対象となるバックエンドからBを削除して、トラフィックを受け入れないようにします。
  2. 現在実行中のリクエストが処理され、既存の接続が閉じられるまで待ちます。
  3. Bを提供するコンテナまたは基盤となるVMを更新する
  4. Bを再起動し、ロードして作業を開始するのを待ちます
  5. テストBが新しいリクエストを適切に処理していることを確認します
  6. ロードバランサーバックエンドプールにBを追加して、トラフィックを再度有効にします

次に、C、Dなどに対して同じプロセスを実行します。

Dockerコンテナのインプレースアップグレードについては、2013年11月から未解決のリクエストがありますが、あまり進展が見られないため、上記の解決策は当面の間行うべきものです。

既存のライブサイトに対して行うこと

おそらく、このモデルでライブサイトを既に実行していて、ダウンタイムなしでアップグレードしたいので、これを求めているのでしょう。したがって、上記の理想的な目標状態に到達する必要がありますが、漸進的です。

それを仮定しましょう:

  • コンテナを指すDNS名があります
  • コンテナはいくつかのIPアドレスで実行されます
  • ユーザーはコンテナのIPアドレスを知らず、どこにもハードコードされていません

これらの仮定が間違っている場合、まずこれが正しいように修正する必要があります。

次に、次の手順を実行します。

  1. 新しいIPでロードバランサーを作成し、既存のコンテナーを唯一のバックエンドとしてポイントする
  2. コンテナIPではなくロードバランサーを直接指すようにDNSを変更する
  3. 同じVM +コンテナ設定で同一のApacheバックエンドを追加します
  4. これで、2つのバックエンドBとCを備えたロードバランサーがあるので、「理想的なターゲットシナリオ」セクションの指示に従って、一度に1つずつアップグレードしてください。

ロードバランサーを更新する方法

簡単な(ホストされた)方法

最も簡単なオプションは、独自のバランサーを実行しないことです。たとえば、サービスとして負荷分散を提供するクラウドプラットフォームを使用している場合は、それを使用することを検討してから、ロードバランサーのメンテナンスと更新は問題になりません。

手動の方法

独自のロードバランサーを実行している場合は、別の間接層(つまり、DNS)を追加すると役立ちます。以下を想定してみましょう:

  • ロードバランサーAのIPに解決するホスト名があり、更新したい
  • ロードバランサーには、P1、P2などのバックエンドプールがあります。

次のように進めます。

  • 新しいソフトウェアバージョンで新しいロードバランサーBを作成する
  • すべてのバックエンドプールインスタンスP1、P2などをバックエンドとして新しいロードバランサーBに追加します
  • AとともにBのIPアドレスをDNS解決に追加します

    • 現在、DNSをロードバランサーとして効果的に使用しています
    • AとBのエントリが重み付けされていない場合、それらは事実上50〜50です
    • Bのパフォーマンス、エラーの有無などを確認します。
    • Bに問題がある場合は、次のように元に戻します。

      1. DNS構成からBを削除します
      2. DNSのBエントリが消えるのを待ちます(つまり、TTLが期限切れになるのを待ちます)
      3. Bを断る
  • Bの「バーンイン」テストを完了し、すべてが正常であると仮定します
  • DNSのBの優先度と重みを徐々に更新します
  • DNSからAを完全に削除する
  • DNS TTLが期限切れになるのを待ちます。Aはもうリクエストを受け取ってはいけません
  • Aを断る

これで完了です。

詳細、図、およびツール

プロセスの自動化に役立つこれらの記事とツールを参照してください。ただし、一般的な考え方は同じです。

道徳

「コンピュータサイエンスの問題はすべて、別のレベルのインダイレクションで解決できます。もちろん、インダイレクションが多すぎる場合は例外です。」デヴィッド・ウィーラー


しかし、ロードバランサーがコンテナ内にある場合(CoreOSを使用している場合)、このコンテナを更新するにはどうすればよいですか?
das_j

@das_j回答を編集して、ロードバランサーを更新する方法も追加しました。ヒント:それはすべて間接レベルの別のレベルについてです。:-)
ミシャブルクマン

1
全体として、これは物理サーバーと物理ロードバランサーも同様に更新するように聞こえます。
ステファンLasiewski

@StefanLasiewskiあなたは絶対に正しいです、私は見出しの「コンテナ」メモを削除しました。外部ユーザーにとって、アプリまたはロードバランサーがベアメタル、コンテナー、またはVMのいずれで実行されているかは、ほとんど見えません。
ミシャブルクマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.