Kubernetes入門6: 初期化専用コンテナを起動する
一般的には、何らかのサービスを提供するアプリケーションをコンテナとして起動することが多いです。しかし、DBなどの初期化処理などを実行するコンテナを一度だけ起動したいということもあります。
その場合、KubernetesのInit Containersが要件に適しているでしょう。Configure Pod Initializationを参考に試してみました。
準備
techlunch.hatenablog.com minikubeを用意しておきましょう。
init containerを含むPodを作成する
以下のPod設定ファイルで、1つのアプリケーションコンテナと1つのinit containerを持つPodを作成します。
# https://k8s.io/examples/pods/init-containers.yaml apiVersion: v1 kind: Pod metadata: name: init-demo spec: containers: - name: nginx image: nginx ports: - containerPort: 80 volumeMounts: - name: workdir mountPath: /usr/share/nginx/html # These containers are run during pod initialization initContainers: - name: install image: busybox command: - wget - "-O" - "/work-dir/index.html" - http://kubernetes.io volumeMounts: - name: workdir mountPath: "/work-dir" dnsPolicy: Default volumes: - name: workdir emptyDir: {}
設定ファイルを見ると、init containerとアプリケーションコンテナはworkdirというボリューム
を共有していることがわかります。
init containerは、アプリケーションコンテナが起動する前に、
wget -O /work-dir/index.html http://kubernetes.io
という処理を実行し、完了します。この際にnginxサーバのルートディレクトリにファイルを書き込んでいることがわかります。
それでは実行してみます。
$ kubectl create -f https://k8s.io/examples/pods/init-containers.yaml $ kubectl get pods NAME READY STATUS RESTARTS AGE init-demo 1/1 Running 0 5m
次に、nginxによって提供されているpageがinit containerによって書き込まれたファイルであることを確認します。
$ kubectl exec -it init-demo -- /bin/bash # apt update; apt install curl -y # curl localhost ...
今回はnginxを例にしましたが、MySQLなどのDBに初期データを投入するといった使い方もできます。