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

У нас есть служба Spring Boot, работающая в Kubernetes.
У этой службы есть конечная точка:
- ПОЛУЧИТЬ / здоровье

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

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

Когда я пытаюсь вызвать эту конечную точку вне модуля 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 правильный (иначе я бы получил эту ошибку).

Файл Docker:

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

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

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
1
0
756
4

Ответы 4

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

да, мы используем порт 8080 и недавно добавили поддержку tls, так что это https. Та же проблема и с http

Tantre 25.06.2018 14:15

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

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

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

Справка:

Ваша проблема может быть вызвана 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>

Мы используем Spring 2.0.2.RELEASE и Tomcat встроен в него, поэтому мы не указываем его версию.

Tantre 12.07.2018 14:14

Добавленное мной свойство является необязательным и может переопределить версию встроенного Tomcat.

Mariusz Kumor 13.07.2018 08:32

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