web-dev-qa-db-ja.com

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

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

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

17
das_j

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

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

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

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

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

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

2013年11月から Dockerコンテナーのインプレースアップグレードのオープンリクエスト が存在することに注意してください。

既存のライブサイトに何をすべきか

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

それを仮定しましょう:

  • コンテナーを指す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に追加します。
  • bのIPアドレスをAとともに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を下げる

これで完了です。

詳細、図、およびツール

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

道徳

「コンピューターサイエンスのすべての問題は、もちろん、間接参照が多すぎる問題を除いて、別のレベルの間接参照で解決できます。」デビッド・ウィーラー

18
Misha Brukman