У меня есть очень простое фляжное приложение, работающее на kubernetes (GKE). Модули получают достаточный объем трафика (60 запросов в секунду +-) и работают в группе автоматического масштабирования с минимум 4 активными и 10 макс.
Каждые 4-5 часов начинает глючить liveness probe и все поды перезапускаются. Иногда я обнаруживаю, что мои модули перезагружались 11-12 раз за одну ночь. Когда я описываю стручки, я получаю ту же ошибку:
Liveness probe failed: Get http://10.12.5.23:5000/_status/healthz/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
Все модули имеют одинаковое количество перезапусков, поэтому это не проблема загрузки (и у меня также есть автомасштабирование).
Конечная точка _status/healthz/
настолько проста, насколько это возможно:
@app.route('/')
@app.route('/_status/healthz/')
def healthz():
return jsonify({
"success": True
})
У меня есть еще один маршрут в этом приложении, который подключается к mysql и проверяет некоторые данные. У меня были те же приложения, распределенные по дроплетам digitalocean, которые месяцами работали под гораздо более высокой нагрузкой без проблем.
Кажется, я не могу понять, почему проверки жизнеспособности начинают давать сбой сразу же, и мои модули перезапускаются.
Выделенные ресурсы также приличные и очень близки к тому, что у меня было на дроплетах digitalocean:
"resources": {
"requests": {
"cpu": "500m",
"memory": "1024Mi"
},
"limits": {
"cpu": "800m",
"memory": "1024Mi"
}
}
У меня были одни и те же модули, работающие с 100m
для ограничения процессора и с 900m
. Тот же результат, каждые несколько часов все модули перезагружаются.
Настройки живости:
"livenessProbe": {
"initialDelaySeconds": 30,
"httpGet": {
"path": "/_status/healthz/",
"port": 5000
},
"timeoutSeconds": 5
},
ОБНОВЛЕНИЕ: добавлен Readiness
зонд, увеличен ЦП = те же результаты, 7 перезапусков на каждом из 4 модулей.