Kubernetes изящно закрыл приложение Springboot Tomcat - PullRequest
1 голос
/ 11 октября 2019

Я запускаю приложение весенней загрузки java на tomcat в кластере kuberentes, я использую ловушку жизненного цикла, чтобы завершить работу tomcat перед завершением работы контейнера. Также определяется льготный период завершения 30 с.

ожидаемое поведение: tomcat корректно завершает работу, когда я убиваю модуль или удаляю развертывание.

фактическое поведение: tomcat резко отключается.

lifecycle:
          preStop:
            exec:
              command:
              - /usr/local/tomcat/bin/catalina.sh

Может кто-нибудь помочь, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

В Kubernetes хук preStop выполняется до завершения работы модуля.

В приведенном выше случае использования процесс tomcat должен быть корректно завершен до завершения работы модуля при удалении модуля / развертывания.

Следующее примерное определение модуля работает путем постепенного отключения сервера tomcat до его завершения. Примечание. Контейнером в этом определении является FROM tomcat:9.0.19-jre8

apiVersion: v1 
kind: Pod 
metadata:
  name: demopod
spec:
  containers:
  - image: demo:web
    name: demo-container
    ports:
    - containerPort: 8080
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
      preStop:
        exec:
          command: ["/bin/sh", "-c", "echo Stopping server > /usr/share/message1; sleep 10; sh /usr/local/tomcat/bin/catalina.sh stop"]

. В приведенном выше файле определения мы запускаем три команды (меняются по мере необходимости).

  1. Написать сообщение о завершении работы в / usr / share / message1

  2. sleep 10 (Просто, чтобы дать время для просмотра журналов модуля / контейнера)

  3. Запустите сценарий Catalina.sh stop, чтобы остановить сервер Tomcat.

Для отладки: Для PreStop, если обработчик завершается неудачно, передается событие FailedPreStopHook. Вы можете увидеть эти события, запустив kubectl describe pod <pod_name>

Журналы выключения: Valid shutdown logs

0 голосов
/ 11 октября 2019

Это распространенная ошибка концепции изящного периода. Люди думают, что, если они установят льготный период, скажем, 30 секунд, при удалении контейнера он будет ждать 30 секунд, что неправильно.

На самом деле льготный период - это убийство, а не сохранение. это живой. Если у вас есть приложение, которое отключается через 1 секунду, вы можете установить любой льготный период, но модуль умрет через 1 секунду. Он убил бы модуль (отправив SIGKILL), если бы он прошел льготный период.

Таким образом, вы бы установили льготный период, чтобы модуль не находился в состоянии завершения навсегда (и убил бы его после определенного количествавремя), а затем продолжайте работу модуля в течение определенного времени после его удаления. Надеюсь, что это имеет смысл.

И, вероятно, preStop запускается, если все настроено правильно, но это будет зависеть от того, что вы делаете, чтобы увидеть результаты. Например, вы не можете видеть журналы, если вы не сделали их постоянными.

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