У нас есть служба 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.
Не уверен, имеет ли это какое-то влияние, но вы пробуете все с https
. А можно вместо этого попробовать с http
? Ваше весеннее приложение, вероятно, не поддерживает https на порту 8080.
Проблема была решена путем вызова службы с полным доменным именем:
имя-службы. имя-пространства-имен.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 встроен в него, поэтому мы не указываем его версию.
Добавленное мной свойство является необязательным и может переопределить версию встроенного Tomcat.
да, мы используем порт 8080 и недавно добавили поддержку tls, так что это
https
. Та же проблема и сhttp