TechLunch

The free lunch is over.

Kubernetes入門6: 初期化専用コンテナを起動する

一般的には、何らかのサービスを提供するアプリケーションをコンテナとして起動することが多いです。しかし、DBなどの初期化処理などを実行するコンテナを一度だけ起動したいということもあります。

その場合、KubernetesInit 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に初期データを投入するといった使い方もできます。