Kubernetes PostStart and PreStop hooks

PreStart

На данный момент (v1.20) такого хука не существует и единственным способом гарантированного запуска чего-либо перед запуском основного контейнера - init containers

PostStart

Данный хук отправляется сразу после создания контейнера, в асинхронном режиме и нет никаких гарантий что он будет выполнен до entrypoint. К сожалению данный хук не подходит для таких вещей как миграции баз данных и тому подобных - которые должны быть гарантированно выполнены до старта основного приложения. Но, приложение запущенное в рамках хука, уже имеет доступ к переменным среды и он отлично подходит для различных задач по регистрации контейнера в системе мониторинга или отправки каких либо запросов в различные API и т.п. едино разовые задачи в жизни конкретно взятого контейнера.

PreStop

Данный хук вызывается непосредственно перед остановкой контейнера и является “блокирующим” - контейнер не будет удалён до момента окончания выполнения задачи определённой в хуке. На мой взгляд один из самых полезных хуков (исключая PreStart которого не существует) - в рамках данного хука очень удобно выполнять такие задачи как выгрузка каких либо артефактов, перед завершением работы контейнера (дампы, логи и т.д.). Но необходимо учитывать то, что у Kubernetes есть своеобразный механизм защиты от “вечно живущих” мёртвых контейнеров - terminationGracePeriodSeconds, который по умолчанию равен 60сек. (может быть изменён конфигурацией кластера, уточняйте по месту). Если вы не уверены что задача в PreStop будет завершена примерно за 50-55сек. то обязательно переназначьте данное значение в манифесте.

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
spec:
  containers:
  - name: myapp-container
    image: busybox
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the postStart"]
      preStop:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the preSop"]
  terminationGracePeriodSeconds: 600 #<-- ten minutes delay before send a forced SIGTERM signal
  1. Container Lifecycle Hooks
  2. Init Containers