Используя Контейнерные крючки , вы можете настроить prestop
, который может выглядеть следующим образом:
apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
containers:
- name: lifecycle-demo-container
image: nginx
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
preStop:
exec:
command: ["/usr/sbin/nginx","-s","quit"]
Этот хук вызывается непосредственно перед завершением контейнера. Это блокировка, то есть синхронная, поэтому она должна быть завершена до того, как будет отправлен вызов для удаления контейнера. Параметры не передаются обработчику.
Вы можете следить за потоком на Завершение стручков
- Пользователь отправляет команду на удаление Pod с льготным периодом по умолчанию (30 с)
- Стручок на сервере API обновляется временем, после которого Стручок считается «мертвым», а также льготным периодом.
- Pod отображается как «Завершающий», когда перечислен в клиентских командах
- (одновременно с 3) Когда Kubelet видит, что Pod был отмечен как завершающий, потому что время в 2 было установлено, он начинает процесс отключения pod.
- Если модуль определил preStop hook , он вызывается внутри модуля. Если хук
preStop
все еще работает после истечения льготного периода, то шаг 2 вызывается с небольшим (2 секунды) продленным льготным периодом.
- Процессам в Pod отправляется сигнал TERM.
- (одновременно с 3) Pod удаляется из списка конечных точек для службы и больше не считается частью набора запущенных модулей для контроллеров репликации. Блоки, которые медленно отключаются, не могут продолжать обслуживать трафик, поскольку балансировщики нагрузки (например, прокси-сервер службы) удаляют их из своих вращений.
- Когда льготный период истекает, любые процессы, все еще работающие в модуле, уничтожаются SIGKILL.
- Kubelet завершит удаление Pod на сервере API, установив льготный период 0 (немедленное удаление). Модуль исчезает из API и больше не виден клиенту.