我们在Kubernetes中运行了Spring Boot服务。
该服务具有端点:
-获取/ healthz
我们有使用此端点的活动探针。探针成功运行。
这意味着可以从服务窗格(本地主机)访问端点。
当我在服务舱运行时:
wget https://localhost:8080/healthz
我得到一个答案(确定)
当我尝试在Pod 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
音量/ 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”]
展览8080
总结:
服务端点可以从服务容器内部访问,但不能从容器外部访问。
知道为什么吗?
更新:
通过使用完全限定的域名调用服务来解决该问题: serviceName.namespaceName.svc.cluster.local
Tomcat不接受使用短域 serviceName.namespaceName 的呼叫,它响应了400。
答案 0 :(得分:1)
您的问题可能是由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>
答案 1 :(得分:0)
不确定它是否对这里有影响,但是您正在尝试使用https
进行所有操作。您可以改用http
吗?您的spring应用可能在端口8080上不支持https。
答案 2 :(得分:0)
通过使用完全限定域名调用服务来解决此问题:
service-name.namespace-name.svc.cluster.local
该服务不接受带有 service-name.namespace-name 的呼叫,响应为400。
答案 3 :(得分:0)
如果您使用的是Spring Boot 2,这可能是由于 Tomcat 8.5.31中的错误引起的,该错误在FQDN的最后一部分不允许
将Tomcat更新到8.5.32 即可解决此问题。
参考: