Ошибка API REST кластера Kubernetes: внутренняя ошибка сервера 500
У меня есть кластер k8s, развернутый с использованием kubespray. Используется балансировщик нагрузки metalLB. Я развернул в этом кластере таблицу управления, в которой есть служба REST по адресу 10.0.8.26:50028
Я отправляю запросы на этот сервис:
http://10.0.8.26:50028/data/v3/authentication
http://10.0.8.26:50028/data/v3/actions
http://10.0.8.26:50028/data/v3/versions
Но каждый раз, когда я вызываю конечные точки, он возвращает ответы в порядке:
503 транспорт закрывается
500 Внутренний сервер
500 Внутренний сервер
204 - правильный ответ
Тот же порядок возвращается, когда я вызываю каждую конечную точку. Как только верный ответ возвращается, после этого ошибок нет. Но попытка нового endoint вернет ошибку.
Может кто-нибудь, пожалуйста, помогите мне?
1 ответ
Эта ошибка была связана с соединениями между службами в кластере. Кластер использовал kube-прокси в режиме IPVS. Из-за таймаутов IPVS (в узлах) соединение между службами прерывается через 900 секунд:
$ ipvsadm -l --timeout
Timeout (tcp tcpfin udp): 900 120 300
Это означает, что соединение tcp было прервано другим агентом. Мое приложение использует оба протокола GRPC для связи между некоторыми службами. Итак, после установки grpc keepalive в коде приложения и tcp keepalive pods на более низкое значение, проблема была решена.
Следующие ссылки могут предоставить более подробную информацию:
https://success.docker.com/article/ipvs-connection-timeout-issue