説明
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は作動せず、コンテナは削除されます。
以上です。
コメント