Я тестирую ловушки жизненного цикла, и постстартовые wotks довольно хороши, но я думаю, что pre-stop никогда не выполняется. Существует еще один ответ , но он не работает, и на самом деле, если он будет работать, это будет противоречить документации k8s. Итак, из документов:
PreStop
Этот хук вызывается непосредственно перед завершением контейнера из-за
на запрос API или событие управления, такое как сбой датчика живучести,
упреждение, ресурсная конкуренция и др. Вызов на крючок preStop
завершается неудачей, если контейнер уже находится в завершенном или завершенном состоянии.
Итак, запрос API заставляет меня думать, что я могу просто сделать kubectl delete pod POD
, и я в порядке.
Больше из документов ( процесс отключения pod ):
1.- Пользователь отправляет команду на удаление Pod с льготным периодом по умолчанию (30 с)
2.- Стручок на сервере API обновляется временем, после которого Стручок считается «мертвым» вместе с льготным периодом.
3.- Pod отображается как «Завершающий», когда указан в клиентских командах
4.- (одновременно с 3) Когда Kubelet видит, что Pod был отмечен как завершающий, потому что время в 2 было установлено, он начинает процесс отключения pod.
4.1.- Если в одном из контейнеров Pod задан хук preStop, он вызывается внутри контейнера. Если ловушка preStop все еще работает после истечения льготного периода, то шаг 2 вызывается с небольшим (2 секунды) продленным льготным периодом.
4.2.- Контейнеру отправляется сигнал TERM. Обратите внимание, что не все контейнеры в модуле будут получать сигнал TERM в одно и то же время, и каждый из них может потребовать ловушку preStop, если имеет значение порядок, в котором они закрываются.
...
Итак, так как, когда вы делаете kubectl delete pod POD
, модуль включается Terminating
, я предполагаю, что могу это сделать.
Из другого ответа я не могу этого сделать, но способ состоит в том, чтобы сделать непрерывное обновление. Ну, я пытался всеми возможными способами, и это тоже не сработало.
Мои тесты:
У меня есть развертывание:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: my-deploy
spec:
replicas: 1
template:
metadata:
name: lifecycle-demo
labels:
lifecycle: demo
spec:
containers:
- name: nginx
image: nginx
lifecycle:
postStart:
exec:
command:
- /bin/sh
- -c
- echo "Hello at" `date` > /usr/share/post-start
preStop:
exec:
command:
- /bin/sh"
- -c
- echo "Goodbye at" `date` > /usr/share/pre-stop
volumeMounts:
- name: hooks
mountPath: /usr/share/
volumes:
- name: hooks
hostPath:
path: /usr/hooks/
Я ожидаю, что файлы pre-stop
и post-start
будут созданы в /usr/hooks/
на хосте (узле, где работает модуль). постстарт есть, но предстоп, никогда.
- Я пытался
kubectl delete pod POD
, и это не сработало.
- Я пытался
kubectl replace -f deploy.yaml
, с другим изображением, и когда я делаю kubectl get rs
, я вижу созданный новый набор реплик, но файла там нет.
- Я попробовал
kubectl set image ...
, и снова я вижу созданный новый replicaSet
, но файла там нет.
- Я даже пытался поместить их в полностью разделенные тома, как я думал, возможно, когда я убиваю модуль и он воссоздается, он заново создает папку, в которой должны быть созданы файлы, поэтому он удаляет папку и Предварительно остановить файл, но это был не тот случай.
Примечание. Он всегда создается заново на одном и том же узле. Я в этом убедился.
Чего я не пробовал, так это взорвать контейнер и разбить его, установив низкий предел ЦП, но это не то, что мне нужно.
Есть идеи, при каких обстоятельствах срабатывает preStop
hook?