Kubernetesプロビジョニングコンテナとは何ですか?いつ使用する必要がありますか?
プロビジョニングコンテナは、新しいポッドをプロビジョニングするためのKubernetesメカニズムです。Initコンテナーは、ポッドのメインアプリコンテナーの前に開始およびクローズされるため、ブートストラップスクリプトを順番に実行できます。
この記事では、initコンテナをポッドに追加する方法と、いくつかの一般的なユースケースを紹介します。initコンテナーは通常のコンテナーと同様に構成されますが、特別な目的のためにいくつかの違いがあります。
Initコンテナの役割
プロビジョニングコンテナは、最初の実行時にアプリケーションを初期化することに関連する問題を解決します。通常、サービスは、完全に開始する前に、インストールスクリプトが正常に完了したかどうかに依存します。
小規模なシステムでは、既存のアプリケーションコンテナイメージにスクリプトを追加できます。ただし、これは画像に別の責任を追加するため、理想的ではありません。それぞれが独自の依存関係と関係を持つ複数の個別のステージを持つこともできます。これらすべての1回限りの操作をメインコンテナイメージに追加すると、維持が困難な肥大化した複雑さがすぐに発生する可能性があります。
Initコンテナーは、ポッドのアプリコンテナーが開始する前にカスタムコンテナーを実行できるようにすることで、この問題を解決します。各モジュールは複数の初期化コンテナを持つことができます。それらは、前のものが正常に完了した後にのみ、順次実行されることが保証されています。
Kubernetesは、すべての初期化コンテナが完了した後、通常のポッドを開始します。initコンテナに障害が発生した場合、完了する前に再起動されます。ポッドrestartPolicy
がに設定されている Never
場合、ポッドは代わりに失敗としてマークされます。
ポッドへの初期化コンテナの追加
初期化コンテナはspec.initContainers
、ポッドマニフェストフィールドで定義されます。spec.containers
これは通常の定義と非常によく似ています。
これは、2つのinitコンテナが接続されたポッドの例です。
Kubectlを使用して、ポッドをクラスターに追加します。
$ kubectl apply -f pod.yaml
pod/init-containers-pod created
次に、各initコンテナに関連付けられているログを抽出して、それらが開始されたことを確認します。
$ kubectl logs init-containers-pod -c first-init-container
これは最初の初期化コンテナです
$ kubectl logs init-containers-pod -c second-init-container
This is the second init container
フィールドでKubernetesコンテナマニフェストに使用できるほとんどのプロパティを使用できますinitContainers
。これらには、ボリューム、ポート、環境変数、およびセキュリティコンテキストが含まれます。
Initコンテナーもリソース制限をサポートしますが、通常のコンテナーとは異なる方法で処理されます。モジュールのアプリケーションコンテナの制限の合計よりも小さい場合を除き、すべてのプロビジョニングコンテナによって宣言されたリソース制限の最大値が、モジュールの有効な制限として選択されます。この計算値は、計画の目的で使用されます。
コンテナのプロビジョニングの制限の1つは、プローブのサポートがないことです。livenessProbe
フィールド内の、、、readinessProbe
またはstartupProbe
コンテナオブジェクトにフィールドを割り当てることはできませんinitContainers
。Initコンテナーは、メインアプリケーションのコンテナーに接続されたプローブの代わりに、またはプローブと組み合わせて使用できる別個のメカニズムです。
よくある間違い
initコンテナを使用する場合、いくつかのよくある間違いがあります。覚えておくべき詳細は次のとおりです。
- Initコンテナは、ポッドが再起動されるたびに実行されます。つまり、同じポッドで2回実行できるように、initコンテナ操作はべき等である必要があります。ポッドが再起動されると、そのすべての初期化コンテナが再度実行されます。
initContainers
ポッドフィールドへの変更は、1つの例外を除いてサポートされていません。フィールドを変更できimage
ます。これにより、モジュールが再起動し、新しいinitコンテナが開始されます。- Initコンテナ名は、ポッド内のすべてのコンテナで一意である必要があります。これには、他のinitコンテナーとアプリケーションのコンテナーが含まれます。このルールに違反するマニフェストを適用しようとすると、コンソールにYAML検証エラーが表示されます。
- ポッドには、
Initialized: False
initコンテナが実行されているときに状態があります。これはConditions
、起動時の見出しの下に表示されkubectl describe my-pod
ます。
kubectl get
次のコマンドを使用して、ポッド初期化コンテナが完了したかどうかを確認することもできます。
$ kubectl get init-containers-pod
NAME READY STATUS RESTARTS AGE
init-containers-pod 0/1 Init:1/2 0 1m
この場合、STATUS
列は、モジュールに2つの初期化コンテナーがあり、そのうちの1つが正常に完了したことを示しています。すべての初期化コンテナが完了すると、Kubernetesはアプリケーションコンテナを起動し、ポッドのステータスがに変わりRunning
ます。
Initコンテナを使用する場合
プロビジョニングコンテナは、アプリケーションの新しい展開を何らかの方法で初期化する必要がある場合に理想的です。これらは、メインコンテナイメージ外のツールに依存する特別な前提条件タスクに対応します。
initコンテナを使用する可能性のあるいくつかの状況を次に示します。
- 環境変数から構成ファイルを作成します。
- アプリケーションで使用されるキャッシュの事前入力。
- データベースインスタンスの移行と入力。
- ボリュームにアプリケーションプラグインをダウンロードしてインストールします。
- 依存関係(データベースや外部APIなど)が使用可能になるまで、アプリケーションの起動をブロックします。
これらのタスクのいくつかを実行する別の方法は、ReadyまたはRunトライアルを使用することです。ただし、意図には違いがあります。プローブは主にコンテナの状態をKubernetesに伝達するように設計されていますが、プロビジョニングコンテナはポッドの初期化中にアクションを実行するように設計されています。
概要
初期化コンテナは、Kubernetesポッドで初回実行の初期化ルーチンを実行する方法です。これらを使用して、依存関係が利用可能になるのを待つ間、またはスクリプトのブートストラップが完了するのを待つ間、アプリケーションコンテナの起動をブロックまたは遅延させることができます。
initコンテナの機能は、起動および準備チェックと重複する場合があります。実行するアクションが、条件が満たされるまでアプリケーションの実行を基本的にブロックしている場合に、プローブを使用できます。これらは、アプリのコンテナイメージにすでに存在するスクリプトに依存しています。ワンタイムユーティリティでメインイメージをオーバーロードせずに特別なアクションを実行する場合は、初期化コンテナが最適です。
コメントを残す