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

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

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

Когда я запускаю служебный модуль: wget https://localhost:8080/healthz я получаю ответ (ОК)

Когда я пытаюсь вызвать эту конечную точку вне модуля wget https://myhost:8080/healthz, я получаю ответ 400 без тела.
Я не вижу журналов Sprint. Кажется, что он не доходит до 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 правильный (иначе я бы получил эту ошибку).

Файл Docker:

ОТ 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 = file: / dev /./ urandom", "- jar", "/ app.jar"]
EXPOSE 8080

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

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




Ответы (4)


Ваша проблема может быть вызвана 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>
person Mariusz Kumor    schedule 11.07.2018
comment
Мы используем Spring 2.0.2.RELEASE и Tomcat встроен в него, поэтому мы не указываем его версию. - person Tantre; 12.07.2018
comment
Добавленное мной свойство является необязательным и может переопределить версию встроенного Tomcat. - person Mariusz Kumor; 13.07.2018

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

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

Ссылка:

person Lukasz Wozniak    schedule 11.07.2018

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

person Christiaan    schedule 25.06.2018
comment
да, мы используем порт 8080 и недавно добавили поддержку tls, так что это https. Та же проблема с http тоже - person Tantre; 25.06.2018

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

person Tantre    schedule 27.06.2018