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が使われます。
例えば、他のサービスと依存関係のあるコンテナを起動する前の通信チェックなどとか
ここまで読んでいただいて、お疲れ様でした。
コメント