PreStop hook in kubernetes never gets executed

4/5/2018

I am trying to create a little Pod example with two containers that share data via an emptyDir volume. In the first container I am waiting a couple of seconds before it gets destroyed.

In the postStart I am writing a file to the shared volume with the name "started", in the preStop I am writing a file to the shared volume with the name "finished".

In the second container I am looping for a couple of seconds outputting the content of the shared volume but the "finished" file never gets created. Describing the pod doesn't show an error with the hooks either.

Maybe someone has an idea what I am doing wrong

apiVersion: v1
kind: Pod
metadata:
  name: shared-data-example
  labels:
    app: shared-data-example
spec:
  volumes:
  - name: shared-data
    emptyDir: {}
  containers:

  - name: first-container
    image: ubuntu
    command: ["/bin/bash"]
    args: ["-c", "for i in {1..4}; do echo Welcome $i;sleep 1;done"]
    imagePullPolicy: Never
    env:
    - name: TERM
      value: xterm
    volumeMounts:
    - name: shared-data
      mountPath: /myshareddata
    lifecycle:
      preStop:
        exec:
          command: ["/bin/sh", "-c", "echo First container finished > /myshareddata/finished"]
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo First container started > /myshareddata/started"]

  - name: second-container
    image: ubuntu
    command: ["/bin/bash"]
    args: ["-c", "for i in {1..20}; do ls /myshareddata;sleep 1;done"]
    imagePullPolicy: Never
    env:
    - name: TERM
      value: xterm
    volumeMounts:
    - name: shared-data
      mountPath: /myshareddata
  restartPolicy: Never
-- cloudnaut
kubernetes

1 Answer

4/5/2018

It is happening because the final status of your pod is Completed and applications inside containers stopped without any external calls.

Kubernetes runs preStop hook only if pod resolves an external signal to stop. Hooks were made to implement a graceful custom shutdown for applications inside a pod when you need to stop it. In your case, your application is already gracefully stopped by itself, so Kubernetes has no reason to call the hook.

If you want to check how a hook works, you can try to create Deployment and update it's image by kubectl rolling-update, for example. In that case, Kubernetes will stop the old version of the application, and preStop hook will be called.

-- Anton Kostenko
Source: StackOverflow