Проверка готовности и общий HTTP-клиент Apache
У меня простая установка OpenShift со службой, настроенной с двумя бэкэнд-PODS. У PODS настроен датчик готовности. Услуга предоставляется через NodePort. Все эти конфигурации в порядке, они работают, как ожидалось. После сбоя зондов готовности службы помечают модуль как недоступный, и никакие НОВЫЕ запросы не направляются на модуль POD.
Сценарий 1. Я выполняю команду CURL для доступа к службам. Пока выполняется команда curl, я представляю ошибку готовности Pod-1. Я вижу, что в Pod -1 не отправляются новые запросы. Это хорошо
Сценарий 2: Я использую Java-клиент и использую клиентскую библиотеку Apache Commons Http для инициации подключения к Kubernetes Service. Соединение устанавливается и работает нормально. Проблема возникает, когда я представляю отказ готовности Pod-1. Я по-прежнему вижу, что Клиент отправляет запросы только к Pod-1, хотя у Сервисов есть только конечная точка Pod-2.
Моя догадка, поскольку Http Client использует Persistence Connection и Services при открытии через NodePorts, адрес назначения для Http-соединения - это сам POD-1. Таким образом, даже если проверка готовности терпит неудачу, она все равно отправляет запросы в Pod-1.
Может кто-нибудь объяснить, почему это работает так, как описано выше?
1 ответ
Kube -proxy (или, скорее, правила iptables, которые он генерирует) намеренно не закрывает существующие TCP-соединения при изменении сопоставления конечных точек (это то, что запускает неудачная проверка готовности). Это много обсуждалось на многих билетах на протяжении многих лет, но в целом мало единого мнения о том, следует ли менять поведение. На данный момент лучше всего использовать Ingress Controller для HTTP-трафика, поскольку все они обновляются в реальном времени и обходят kube-proxy. Вы также можете отправить обратноKeep-Alive
заголовок в ваших ответах и разорвать постоянные соединения через N секунд или запросов, хотя это только сжимает окно для недопустимости.