簡體   English   中英

kubernetes中的Spring啟動服務始終響應HTTP狀態400

[英]Spring boot service in kubernetes always responses with HTTP status 400

我們在Kubernetes運行Spring Boot服務。
該服務有端點:
- GET / healthz

我們有使用此端點的活動探測器。 探針成功運行。
這意味着可以從服務pod(localhost)訪問端點。

當我在服務pod中運行時: 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
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”]
EXP80 8080

加起來:
服務端點可從服務pod中訪問,但無法從pod外部訪問。
知道為什么嗎?

更新:
通過使用完全限定的域名調用服務來解決該問題: serviceName.namespaceName.svc.cluster.local
Tomcat不接受短域serviceName.namespaceName的調用,它回復400。

您的問題可能是由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 boot 2,這可能是由於Tomcat 8.5.31中的錯誤,它在FQDN的最后部分中不允許使用' - '

將Tomcat更新到8.5.32修復此問題。

參考:

不確定它是否對此有任何影響,但您正在使用https嘗試所有內容。 你可以嘗試使用http嗎? 您的春季應用程序可能不支持端口8080上的https。

通過使用完全限定的域名調用服務解決了該問題:
服務name.namespace-name.svc.cluster.local
該服務不接受service-name.namespace-name的調用,響應400。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM