kubernetesのライフサイクル(postStart, preStop)

kubernetes

説明

kubernetesのライフサイクルには「postStart」と「preStop」というイベントハンドラーがあります。
すごく簡単にいうと、コンテナの起動直後にpostStartイベントを送信し、コンテナの終了直前にpreStopイベントを送信します。
※preStopは猶予期間(GracePeriod)が短いと、preStopイベントが実行されないことがあるので注意が必要です。詳しくはこちら

実行してみる

コンテナのpostStartイベント時とpreStop時にmessageファイルに書き込みを行うデモを作成します。

以下のマニフェストを作成します。(lifecycle-demo.yml)

apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-demo
spec:
  containers:
  - name: lifecycle-demo-container
    image: nginx
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo HelloWorld > /var/log/data-vol/message"]
      preStop:
        exec:
          command: ["/bin/sh", "-c", "echo GoodBye >> /var/log/data-vol/message"]
    volumeMounts:
    - name: data-vol
      mountPath: /var/log/data-vol
  volumes:
  - name: data-vol
    hostPath:
      path: /data/data-vol
  terminationGracePeriodSeconds: 10

実行します。(postStartが動きます)

$ kubectl apply -f lifecycle-demo.yml
pod/lifecycle-demo created

$ kubectl get po
NAME             READY   STATUS    RESTARTS   AGE
lifecycle-demo   1/1     Running   0          37

messageファイルの確認

$ cat /data/data-vol/message 
Hello from the postStart handler

終了します。(コンテナが削除する直前にpreStopが動きます)

$ kubectl delete -f lifecycle-demo.yml 
pod "lifecycle-demo" deleted

messageファイルの確認。メッセージが追加されています。

$ cat /data/data-vol/message
HelloWorld 
GoodBye

補足

terminationGracePeriodSecondsを0に設定すると、preStopは作動せず、コンテナは削除されます。

以上です。

コメント

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