Рейтинг:0

livenessProbe не работает должным образом

флаг in

В моем развертывании следующее livenessProbe определено:

apiVersion: приложения/v1
вид: развертывание
метаданные:
  имя: бэкэнд-развертывание
  этикетки:
    имя: бэкэнд-развертывание
    приложение: fc-тест
спецификация:
  реплики: 1
  селектор:
    метки соответствия:
      имя: fc-backend-стручок
      приложение: fc-тест
  шаблон:
    метаданные:
      имя: fc-backend-стручок
      этикетки:
        имя: fc-backend-стручок
        приложение: fc-тест
    спецификация:
      контейнеры:
      - имя: fc-backend
        изображение: локальный: 5000/бэкэнд: 1.3
        порты:
        - контейнерПорт: 4042
        среда:
        - имя: NODE_ENV
          значение: "целое"
        живостьзонд:
          исполнитель:
            команда:
            - RESULT=$(curl -X GET $BACKEND_SERVICE_HOST:$BACKEND_SERVICE_PORT/api/v2/makes | wc | awk '{print $3}');
            - если [[ $RESULT -lt 150 ]]; затем выход 1; иначе выход 0; фи
          начальныйЗадержкаСекондс: 20
          порог отказа: 8
          периодСекунды: 10

Поскольку иногда возникают проблемы с подключением к API, я решил настроить действие, проверяющее, получает ли весь набор запрошенных данных из API. Если это так, весь набор занимает около 400 КБ. Если нет, то возвращается только короткое сообщение и размер ответа меньше 120 байт. И тут поступает вторая команда от зонда: он проверяет, РЕЗУЛЬТАТ переменная среды имеет низкий уровень: если это так, то это означает, что ответ не содержал всех нужных данных и завершается с кодом ошибки.

Обе команды были протестированы путем вызова из работающего контейнера, поэтому рассматриваются оба случая: а) извлечены правильные данные — выход 0 и б) получено просто сообщение об ошибке — выход 1.

Приложение, запущенное без зонда, работало корректно не менее 3-4 часов, затем появились проблемы с соединением, которые в итоге разрешились самостоятельно, но немного душили приложение, что было довольно нежелательно.

После внедрения зонда первые проблемы с нестабильностью начали возникать через несколько минут после развертывания. Каждые пару минут поды перезапускались, и количество перезапусков регулярно увеличивалось.

Что я нашел в описании развертывания:

Шаблон пода:
  Ярлыки: приложение=FC-тест
           имя = fc-backend-стручок
  Контейнеры:
   nsc-бэкенд:
    Изображение: локальный: 5000/бэкенд: 1.3
    Порт: 4042/TCP
    Хост-порт: 0/TCP
    Живость: exec [RESULT=$(curl -X GET $BACKEND_SERVICE_HOST:$BACKEND_SERVICE_PORT/api/v2/makes | wc | awk '{print $3}'); если [[ $RESULT -lt 150 ]]; затем выход 1; иначе выход 0; fi] задержка=20с тайм-аут=1с период=10с #успех=1 #неудача=8

Выглядит разумно, но при входе в работающий контейнер с исполнитель команда, я узнал, что эхо $ РЕЗУЛЬТАТ не выводит ничего (просто пустая строка).

Значит ли это, что только первый вызов зонда каким-то образом обработался успешно, а все последующие — нет? Как подойти к настройке зонда, чтобы он работал по назначению?

флаг au
Я бы ожидал, что зонд живости будет свойством контейнера, тогда как в вашем yaml он является родственным контейнеру. Интересно, может быть, ваш отступ нуждается в настройке?
AbreQueVoy avatar
флаг in
Это неправильное форматирование в вопросе - только что отредактировал это, и спасибо, что указали на это.
moonkotte avatar
флаг in
Судя по заголовку вопроса, livenessProbe работает, как и ожидалось. Все, что выходит с не `0`, должно быть перезапущено. [exec probe] (https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#probe-check-methods). Я предложил добавить в вашу команду журналирование, чтобы увидеть, что именно происходит (каждая итерация должна сохраняться в файл с точными результатами). Какое-нибудь кэширование на стороне сервера? [Например] (https://stackoverflow.com/a/36043573/15537201)
Рейтинг:2
флаг in

Протестировал два решения проблемы: первое немного изменило подход (спасибо, @moonkotte за подсказку о логировании: это натолкнуло меня на идею сохранить некоторые доказательства в каталоге приложения). Вместо использования переменной окружения я решил сбросить завитоквывод в файл. Затем я начал искать конкретное сообщение, которое, как ожидается, будет отправлено обратно, когда с удаленной конечной точкой произойдет что-то не так (Ответ пуст в таком случае). Если сообщение присутствует, grep обнаруживает это, но, в отличие от обычного режима, возвращает код выхода 1 из-за наличия -v аргумент (инверсия). Если указанное сообщение не найдено, кажется, что с конечной точкой все в порядке, и возвращается код выхода 0, в результате чего модуль продолжает работать в обычном режиме.

Вся команда выглядит так:

живостьзонд:
  исполнитель:
    команда:
    - ш
    - -с
    - >-
        curl -X ПОЛУЧИТЬ $BACKEND_SERVICE_HOST:$BACKEND_SERVICE_PORT/api/v2/makes |
        head -c 30 > /app/output.log &&
        grep -v 'Ответ пуст' /app/output.log

Второе решение заключается в том, чтобы поставить завиток команду в скрипт bash и отправив ее вместе со всем образом. Сам скрипт выглядит так:

#!/бин/баш
msg=$(curl -X GET $BACKEND_SERVICE_HOST:$BACKEND_SERVICE_PORT/api/v2/makes | head -c 30)
if [[ $msg == *"Ответ пуст"* ]]; тогда
        выход 1
еще
        выход 0
фи

Скрипт вызывается командой:

живостьзонд:
  исполнитель:
    команда:
    - ш
    - ./liveness_check.sh

Результаты такие же. Второй подход можно использовать в случае более сложной логики или в качестве обходного пути.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.