2016-05-05 16 views
9

新しいバージョンのアプリケーションをKubernetesクラスタに導入する前に実行したいデータベース移行があります。これらの移行をContinuous Deliveryパイプラインの一部として自動的に実行するようにします。移行はコンテナイメージとしてカプセル化されます。これを達成するための最良のメカニズムは何ですか?解決のためのkubernetesクラスタで一度限りの移行タスクを実行するにはどうすればよいですか

要件:

  • 私たちは、その後クラスタにアプリの新しいバージョンを展開しようとしないように、移行が失敗したかどうかを判断することができます。
  • 移行が失敗した場合は諦めてください。再試行しないでください。
  • ログにアクセスして失敗した移行を診断できます。

私はKubernetes内のジョブ機能は、これは簡単になるだろうと仮定しますが、いくつかの課題があるように見えるしていた:

手巻きのスクリプトを必要とするように思わながら使用して、「裸のポッドは、」より良い方法でしょうか?もしそうなら、どのように機能するのでしょうか?

+2

どのようにこれをやったのですか?私自身も同じジレンマを持っています... –

答えて

5

次の手順で、マイグレーションジョブと互いのアプリの独立の両方を作ってみることができます:

  • 移行ジョブが正常に移行が失敗した場合でも返してもらいます。マシンの消耗品の記録は、移行の成果のどこかに保存してください。これは、明示的に(例えば、最新のスキーマバージョンをあるデータベーステーブルフィールドに書き込むことによって)、または暗黙的に(たとえば、移行ジョブの成功に応じて特定のフィールドを作成しなければならないと仮定して)行うことができる。マイグレーションジョブは、技術的な理由で失敗した場合にのみエラーコードを返します(マイグレーションが適用されるべきデータベースの利用不可能性のため)。このようにして、Kubernetes Jobs経由で移行を実行し、最終的に完了まで実行する能力に頼ることができます。
  • 移行前と移行後の両方のフェーズでデータベースと連携できるように、新しいアプリケーションバージョンを構築しました。これは、ビジネス要件によって異なります。移行が正常に完了するまでアイドル状態になるか、現在のフェーズに応じてクライアントに異なる結果を返す可能性があります。ここで重要なのは、アプリケーションが以前に生成した移行ジョブが移行結果を処理し、それに応じて誤って終了することなく動作することです。

これら2つの設計アプローチを組み合わせることで、相互に独立した移行ジョブとアプリケーションを開発して実行でき、時間的結合を導入する必要がなくなります。

このアイデアが実装するのが実際に妥当かどうかは、データベース移行作業の複雑さなど、より具体的なケースの詳細によって決まります。前述のように、移行を行うクラスタに非管理ポッドを単純に展開する方法もあります。これは、定期的に結果を確認し、成果の成否を区別する必要があるため、配線がさらに必要になります。

関連する問題