【发布时间】: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