Служба загрузки Spring в кубернетах всегда отвечает с HTTP-статусом 400

55
3

У нас есть служба Spring Boot, работающая в Kubernetes.
Эта служба имеет конечную точку:
- GET/healthz

У нас есть зонд, который использует эту конечную точку. Зонд работает успешно.
Это означает, что конечная точка доступна из сервисного модуля (localhost).

Когда я запускаю в сервисе pod: wget https://localhost:8080/healthz я получаю ответ (OK)

Когда я пытаюсь вызвать эту конечную точку вне pod wget https://myhost:8080/healthz, я получаю ответ 400 без тела.
Я не вижу никаких журналов Sprint. Кажется, что он не доходит до Спринта.
Когда я добавил флаг -Djavax.net.debug=all я вижу в журнале, что рукопожатие TLS завершено, а затем:

GET /healthz HTTP/1.1    
host: myhost:8080
accept: application/json
Connection: close

и немедленно

HTTP/1.1 400 
Transfer-Encoding: chunked
Date: Mon, 25 Jun 201 8 08:43:43 GMT
Connection: close

Когда я пытаюсь wget https://myhost:8080/blahblah (не существующая конечная точка), я все равно получаю 400, а не 404!

Когда я пытаюсь wget https://myWronghost:8080/healthz (неправильный хост), я получаю сообщение об ошибке " Bad address. Это означает, что хост "myhost" является правильным (иначе я бы получил эту ошибку).

Файл докеров:

FROM openjdk: 8-jdk-alpine
VOLUME/tmp
ARG JAR_FILE
COPY $ {JAR_FILE} app.jar
ENV JAVA_TOOL_OPTIONS -Dfile.encoding = UTF8
ENTRYPOINT ["java", "-Djavax.net.debug = all", "-Djava.security.egd = файл: /dev/./urandom", "-jar", "/app.jar"]
ЭКСПОЗИЦИЯ 8080

Подведение итогов:
Конечные точки службы доступны изнутри сервисного модуля, но недоступны извне модуля.
Любая идея почему?

Обновить:
Проблема была решена путем вызова службы с полным доменным именем: serviceName.namespaceName.svc.cluster.local
Tomcat не принимал вызовы с короткой доменной службойName.namespaceName, ответила 400.

спросил(а) 2018-06-25T15:05:00+03:00 2 года, 1 месяц назад
1
Решение
57

Ваша проблема может быть вызвана https://github.com/spring-projects/spring-boot/issues/13205. Все, что вам нужно сделать, это обновить версию Tomcat до 8.5.32. Вы можете сделать это, добавив версию в файл pom.xml.

 <properties>
<!-- your properties -->
<tomcat.version>8.5.32</tomcat.version>
</properties>

ответил(а) 2018-07-11T13:57:00+03:00 2 года назад
40

Если вы используете Spring boot 2, это может быть связано с ошибкой в Tomcat 8.5.31, которая не позволяет "-" в последней части полного доменного имени

Обновление Tomcat до 8.5.32 исправляет это.


Ссылка:

ответил(а) 2018-07-11T13:54:00+03:00 2 года назад
39

Проблема была решена путем вызова службы с полным доменным именем:
сервис-name.namespace-name.svc.cluster.local
Служба не принимала вызовы с именем службы.namespace-name, ответила 400.

ответил(а) 2018-06-27T14:07:00+03:00 2 года, 1 месяц назад
40

Не уверен, что это имеет какое-то влияние здесь, но вы пытаетесь все с помощью https. Можете ли вы попробовать с http вместо этого? Возможно, ваше приложение Spring не поддерживает https на порту 8080.

ответил(а) 2018-06-25T15:10:00+03:00 2 года, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема