【ITニュース解説】100 Days of DevOps: Day 61
2025年10月04日に「Dev.to」が公開したITニュース「100 Days of DevOps: Day 61」について初心者にもわかりやすく解説しています。
ITニュース概要
KubernetesのInitコンテナは、メインアプリ起動前に必要な設定準備を行う。これにより、アプリ本体のイメージを変更せず、起動前に環境を整え、確実に動作させられる。共有ボリュームでデータ連携も可能だ。
ITニュース解説
Kubernetes環境でアプリケーションを動かす際、メインのアプリケーションコンテナが起動する前に、特定の準備作業が必要となる場合がある。例えば、データベースの初期設定を行ったり、アプリケーションが利用する設定ファイルを生成したりといったタスクだ。このような事前準備を確実に行うために、「Init Container(イニットコンテナ)」という特別なコンテナが活用される。
Init Containerは、メインのアプリケーションコンテナよりも先に実行されるよう設計されたコンテナである。複数のInit Containerが定義されている場合、それらは順番に実行され、一つが成功裏に完了しなければ次のコンテナは起動しない。これにより、メインアプリケーションが起動する時には、必要な前提条件がすべて満たされている状態が保証される。準備作業をメインアプリケーションのイメージから分離することで、アプリケーションイメージはよりシンプルになり、それぞれの役割が明確になるという利点がある。
今回の具体的なシナリオでは、あるアプリケーションをデプロイする前に、メインアプリケーションが読み込む特定の「設定ファイル」を作成する必要があった。このファイルは、アプリケーションの起動に必要な情報を含むため、アプリケーションが正しく機能するためには、その存在が不可欠である。この事前準備をInit Containerを用いて実現する。
この構成は、Kubernetesの「Deployment(デプロイメント)」として定義される。デプロイメント名にはic-deploy-devopsが指定される。このデプロイメント内には、二つのコンテナと一つの共有ボリュームが含まれる。
一つ目は「Init Container」として定義されたic-msg-devopsである。このコンテナはdebian:latestイメージを使い、その主なタスクは「Init Done - Welcome to xFusionCorp Industries」という文字列を/ic/ecommerceというパスに存在するファイルに書き込むことである。このファイルが、メインアプリケーションが必要とする設定ファイルとなる。
二つ目は「メインコンテナ」として定義されたic-main-devopsである。これもdebian:latestイメージを使用し、Init Containerによって作成された/ic/ecommerceファイルを継続的に読み込み、その内容を標準出力に表示し続ける。この動作により、Init Containerがファイルを正しく作成し、メインコンテナがそのファイルを問題なく利用できていることが検証される。
これら二つのコンテナ間で設定ファイルを共有するために、「共有ボリューム」が用いられる。ここではic-volume-devopsという名前のemptyDirタイプのボリュームが使用される。emptyDirボリュームはPodが作成されると同時に生成される一時的なストレージであり、Podが削除されるとデータも消滅する。Init Containerとメインコンテナはそれぞれ、このic-volume-devopsボリュームを自身のファイルシステム内の/icという同じパスにマウントすることで、ファイル共有を実現している。Init Containerが/ic/ecommerceに書き込んだ内容は、メインコンテナの/ic/ecommerceからアクセス可能となる仕組みだ。
これらの設定は、YAML形式の「Kubernetesデプロイメントマニフェスト」として記述される。マニフェストのtemplate.specセクションには、まずinitContainersセクションがあり、ここにic-msg-devopsコンテナの詳細が定義される。具体的には、使用するイメージ、実行するコマンド(文字列をファイルに書き込む処理)、そして共有ボリュームを/icにマウントする設定が含まれる。
その直後にはcontainersセクションがあり、ここにメインコンテナであるic-main-devopsが定義される。これも同様にイメージ、コマンド(ファイルを繰り返し読み込む処理)、そして共有ボリュームを/icにマウントする設定が記述されている。volumesセクションでic-volume-devopsというemptyDirボリュームが実際に定義されることで、コンテナ間の共有ストレージが利用可能となる。このYAMLマニフェストは、Init Containerがメインコンテナの起動前に実行され、共有ボリュームを通じて必要な設定ファイルが確実にメインコンテナに渡されるという、一連の処理の流れをKubernetesに指示している。
このデプロイメントをKubernetesクラスタに適用するには、kubectl apply -f [マニフェストファイル名].yamlというコマンドを実行する。これにより、Kubernetesは定義されたデプロイメントとそれに伴うPodを作成・管理し始める。Podが正常に起動したことを確認した後、メインコンテナのログをkubectl logs [Pod名] -c ic-main-devopsコマンドで確認することができる。
ログ出力には「Init Done - Welcome to xFusionCorp Industries」という文字列が繰り返し表示される。これは、Init Containerであるic-msg-devopsがその役割を成功裏に果たし、共有ボリュームに設定ファイルを生成したこと、そしてその後に起動したメインコンテナic-main-devopsが、その共有ファイルを問題なく読み取れていることを示している。
この結果は、Init ContainerがKubernetes環境において、アプリケーションの事前準備や設定の初期化といったタスクを、メインアプリケーションのロジックから独立させて、かつ高い信頼性で実行するための非常に効果的な手法であることを証明する。Init Containerを適切に活用することで、アプリケーションのデプロイプロセスをより堅牢にし、複雑な初期化要件を持つシステムでも安定して運用することが可能となる。