Ошибка 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

https://github.com/moby/moby/issues/31208

https://github.com/kubernetes/kubernetes/issues/80298

Другие вопросы по тегам