広告

kubernetes – initContainers

infrastructure as code

initContainersとは

manifestのリソース指定:
kind: Pod
spec:initContainers[]
※Pod、ReplicaSet、DeploymentなどのワークロードのPod部分に対して設定可能

コンテナ技術の一つのメリットは、コンテナ内に余計なものがなく、アプリを走らせるためのものだけ残っているので、無駄なくリソースをアプリに使える点です。
ただ、コンテナの環境を整えるのに、一時的に使うツールなどを入れないといけない時があります。

そうすると、また余計なものが入ってしましますよね。

k8sでは、Containerを作るための作業を一時的なコンテナでやらせる機能があります。それがinitContainersです。

名前の通り、initContainersは初期化をするためのコンテナです。

initContainersとContainer

一般的なContainer

podの中に、複数コンテナを起動する場合、基本コンテナは並行起動するようになっているので、順番での起動ではありません。
また、起動したら、そのまま動くようになっています。

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:  # container01、container02、container03は並行で起動をする
  - name: container01
    image: nginx
  - name: container02
    image: nginx
  - name: container03
    image: nginx

initContainer

initContainersは、コンテナの処理は一個ずつ実行していきます。
前のinitContainerが終わらない限り、次のinitContainerは起動されません。
また、実行完了したコンテナは破棄されます。

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  initContainers:
  - name: init-1st  # 一個目のinitコンテナ:init-volumeをマウントして、index.htmlファイルを作成し、書き込む
    image: busybox:1.28
    command: ['sh', '-c', 'sleep 10; echo the 1st initContainer write into here! >> /mnt/test-vol/index.html']
    volumeMounts:  # Volumeをマウント
      - name: init-volume
        mountPath: /mnt/test-vol
  - name: init-2nd  # 二個目のinitコンテナ:init-volumeをマウントし、index.htmlに書き込む
    image: busybox:1.28
    command: ['sh', '-c', 'sleep 10; echo the 2nd initContainer write into here! >> /mnt/test-vol/index.html']
    volumeMounts:  # Volumeをマウント
      - name: init-volume
        mountPath: /mnt/test-vol
  containers:  # 実際動くためのコンテナの定義
  - name: myapp-container
    image: nginx
    volumeMounts:  # 書き込み後のindex.htmlが入っているVolumeをマウントする
      - name: init-volume
        mountPath: /mnt/test-vol
  volumes:  # nodeのシステム領域を使って、一時ディスクとしてPodにマウントする
    - name: init-volume
      emptyDir: {}

initContainersの特徴

上記の例から、initContainerは以下の特徴を持っています。

  • initContainerは順番で実行される
  • 前のinitContainerの実行が終わらない限り、次のinitContainerは起動しない
  • 実行が終わったら破棄される

initContainersの用途

上に説明した通、initContainerはメインコンテナのための事前処理をするためのコンテナです。

多くの場合以下の用途に使われています。

  • リポジトリからファイルなどを取得する処理
  • コンテナの起動を遅延させるための処理
  • 設定ファイルを動的に生成する処理(上記の例と近い)
  • Serviceが作成されているかの確認
  • その他メインコンテナを起動する前のチェック作業など

公式ドキュメントが挙げている例は、まさにDBが接続可能かをチェックするためのものです。

公式ドキュメント例:

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox:1.28
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-myservice
    image: busybox:1.28
    command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
  - name: init-mydb
    image: busybox:1.28
    command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']

最後に

今回はinitContainerについて、説明しました。
メインコンテナ起動すうための事前作業として、initContainerが使われます。
例えば、他のサービスと依存関係のあるコンテナを起動する前の通信チェックなどとか

ここまで読んでいただいて、お疲れ様でした。

コメント

タイトルとURLをコピーしました