【问题标题】:Spring boot service in kubernetes always responses with HTTP status 400Kubernetes 中的 Spring Boot 服务始终以 HTTP 状态 400 响应
【发布时间】:2018-12-04 00:10:43
【问题描述】:

我们在 Kubernetes 中运行 Spring Boot 服务。
该服务有端点:
- 获取 /healthz

我们有使用此端点的活性探针。探测成功运行。
这意味着可以从服务 pod (localhost) 访问端点。

当我在服务 pod 中运行时: wget https://localhost:8080/healthz 我得到答案(OK)

当我尝试在 pod wget https://myhost:8080/healthz 之外调用此端点时,我得到 response 400 without body
我没有看到任何 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
复制 ${JAR_FILE} app.jar
ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8
入口点 ["java","-Djavax.net.debug=all", "-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
曝光 8080

总结:
服务端点可以从服务 pod 内部访问,但不能从 pod 外部访问。
知道为什么吗?

更新:
通过使用完全限定域名调用服务解决了这个问题:serviceName.namespaceName.svc.cluster.local
Tomcat 不接受短域 serviceName.namespaceName 的调用,它响应 400。

【问题讨论】:

    标签: spring-boot kubernetes kubernetes-ingress kubernetes-health-check kubernetes-security


    【解决方案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>
    

    【讨论】:

    • 我们使用的是Spring 2.0.2.RELEASE,其中嵌入了Tomcat,所以我们不指定它的版本。
    • 我添加的属性是可选的,可以覆盖嵌入式Tomcat的版本。
    【解决方案2】:

    如果您使用的是 Spring boot 2,这可能是由于 Tomcat 8.5.31 中的错误 不允许在 FQDN 的最后部分使用“-”

    将 Tomcat 更新到 8.5.32 解决了这个问题。

    参考:

    【讨论】:

      【解决方案3】:

      不确定它在这里是否有任何影响,但您正在尝试使用 https 进行所有操作。你可以试试http 吗?您的 spring 应用程序可能不支持端口 8080 上的 https。

      【讨论】:

      • 是的,我们正在使用端口 8080 并且最近添加了 tls 支持,所以它是 httpshttp 也有同样的问题
      【解决方案4】:

      通过使用完全限定域名调用服务解决了问题:
      service-name.namespace-name.svc.cluster.local
      该服务不接受带有 service-name.namespace-name 的调用,响应 400。

      【讨论】:

        猜你喜欢
        • 2018-09-27
        • 1970-01-01
        • 2021-01-16
        • 2016-09-11
        • 2019-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多