Есть ли в Kubernetes зонд живучести, который может уловить, когда контейнер python зависает?
У меня есть программа на Python, которая запускает бесконечный цикл, однако время от времени код зависает. Не возникает никаких ошибок или каких-либо других сообщений, которые могли бы предупредить меня о том, что что-то не так. Мне было интересно, есть ли у Kubernetes какой-либо зонд жизнеспособности, который мог бы помочь обнаружить, когда код зависает, чтобы он мог убить и перезапустить этот контейнер.
У меня есть идея, чтобы код Python создавал периодический журнал каждый раз, когда он завершает цикл. Таким образом, я могу сделать так, чтобы зонд живучести проверял файл журнала каждые 30 секунд или около того, чтобы узнать, обновился ли файл. Если файл не был обновлен по прошествии отведенного времени, предполагается, что программа зависла, а контейнер уничтожен и перезапущен.
В настоящее время я использую следующий код Python для тестирования:
#Libraries
import logging
import random as r
from time import sleep
#Global Veriables
FREEZE_TIME = 60
'''Starts an infinate loop that has a 10% chance of
freezing...........................................'''
def main():
#Create .log file to hold logged info.
logging.basicConfig(filename="freeze.log", level=logging.INFO)
#Start infinate loop
while True:
freeze = r.randint(1, 10) #10% chance of freezing.
sleep(2)
logging.info('Running infinate loop...')
print("Running infinate loop...")
#Simulate a freeze.
if freeze == 1:
print(f"Simulating freeze for {FREEZE_TIME} sec.")
sleep(FREEZE_TIME)
#Start code with main()
if __name__ == "__main__":
main()
Если бы кто-нибудь мог сказать мне, как реализовать эту идею журнала или есть лучший способ сделать это, я был бы очень благодарен! В настоящее время я использую Kubernetes на Docker-Desktop для Windows 10, если это имеет значение. Кроме того, я новичок в этом, поэтому, если бы вы могли сохранить свои ответы на уровне «Kubernetes для чайников», я был бы признателен.
1 ответ
Обычный подход к проверкам живучести в Kubernetes - это доступ к конечной точке HTTP (если она есть в приложении). Kubernetes проверяет, попадает ли код состояния ответа в диапазон 200–399 (успех) или нет (сбой). Запуск HTTP-сервера не является обязательным, поскольку вместо этого вы можете запустить команду или последовательность команд. В этом случае состояние работоспособности основывается на коде выхода (0 - нормально, все остальное - сбой).
Учитывая характер вашего скрипта и идею журнала, я бы написал другой скрипт на Python, чтобы прочитать последнюю строку этого журнала и проанализировать временную метку. Затем, если разница между текущим временем и отметкой времени больше, чем
[insert reasonable amount]
потом
exit(1)
, еще
exit(0)
.
Если вы подготовили сценарий проверки работоспособности, вы можете включить его следующим образом:
spec:
containers:
- name: my_app
image: my_image
livenessProbe:
exec:
command: # the command to run
- python3
- check_health.py
initialDelaySeconds: 5 # wait 5 sec after start for the log to appear
periodSeconds: 5 # run every 5 seconds
В документации есть подробное объяснение с отличными примерами.