На данный момент (v1.20) такого хука не существует и единственным способом гарантированного запуска чего-либо перед запуском основного контейнера - init containers
Данный хук отправляется сразу после создания контейнера, в асинхронном режиме и нет никаких гарантий что он будет выполнен до entrypoint
.
К сожалению данный хук не подходит для таких вещей как миграции баз данных и тому подобных - которые должны быть гарантированно выполнены до старта основного приложения.
Но, приложение запущенное в рамках хука, уже имеет доступ к переменным среды и он отлично подходит для различных задач по регистрации контейнера в системе мониторинга или отправки каких либо запросов в различные API
и т.п. едино разовые задачи в жизни конкретно взятого контейнера.
Данный хук вызывается непосредственно перед остановкой контейнера и является “блокирующим” - контейнер не будет удалён до момента окончания выполнения задачи определённой в хуке.
На мой взгляд один из самых полезных хуков (исключая 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