Крючок preStop не выполняется - PullRequest
1 голос
/ 21 марта 2019

Я тестирую ловушки жизненного цикла, и постстартовые 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...