У нас есть служба 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.