У нас в Kubernetes запущена служба Spring Boot.
У этой службы есть конечная точка:
- GET / healthz
У нас есть датчик живучести, который использует эту конечную точку.Зонд работает успешно.
Это означает, что конечная точка доступна из служебного модуля (localhost).
Когда я запускаю в сервисном модуле: wget https://localhost:8080/healthz
Я получаю ответ (ОК)
Когда я пытаюсь вызвать эту конечную точку за пределами модуля wget https://myhost:8080/healthz
, я получаю ответ400 без тела .
Я не вижу никаких журналов Спринта.Кажется, что он не достигает Спринта.
Когда я добавил флаг -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
ОБЪЕМ / 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.