我在Kubernetes集群上的Docker镜像中运行Tomcat上的Java webapp。服务运行正常,我正在尝试设置活动和准备情况的探测器。
我还没有找到关于Tomcat和Kubernetes的最佳实践的文档,但我认为documentation之后的HTTP GET请求是这样的:
livenessProbe:
failureThreshold: 3
httpGet:
path: /
port: 8080
scheme: HTTP
initialDelaySeconds: 20
periodSeconds: 20
successThreshold: 1
timeoutSeconds: 3
访问Tomcat基本URL时,它会返回欢迎页面和代码200 -- OK
。但是,活动探测失败,这在pod描述中:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 3m default-scheduler Successfully assigned xxxxx-service-7f8f76988-lkxdf to kube-03
Normal SuccessfulMountVolume 3m kubelet, kube-03 MountVolume.SetUp succeeded for volume "default-token-b6tps"
Normal Created 1m (x3 over 3m) kubelet, kube-03 Created container
Normal Started 1m (x3 over 3m) kubelet, kube-03 Started container
Warning Unhealthy 42s (x7 over 3m) kubelet, kube-03 Liveness probe failed: Get http://10.233.96.19:8080/: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
Normal Pulling 40s (x4 over 3m) kubelet, kube-03 pulling image "xxxxx:4999/xxxxx/xxxxxservice:v1.3.0"
Normal Pulled 40s (x4 over 3m) kubelet, kube-03 Successfully pulled image "xxxxx:4999/xxxxx/xxxxxservice:v1.3.0"
Normal Killing 40s (x3 over 2m) kubelet, kube-03 Killing container with id docker://xxxxx-service:Container failed liveness probe.. Container will be killed and recreated.
在以相同方式设置时,准备探测也是如此。
但是,当我停用探针时,服务运行正常。我可以使用/
以及实际的webapp访问Tomcat欢迎页面。
我的问题是:我应该如何为Tomcat webapp正确设置Kubernetes活性/准备情况探测?为什么简单的HTTP GET
方法失败了?
相关问题似乎是由于启动时间长于initialDelaySeconds
参数中设置的时间(例如this),就像错误消息所示。但是,在这种情况下,Tomcat和webapp几秒后就可以访问了,所以启动时间不是问题。
以下是部署规范:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: xxxxx-service
namespace: xxxxx
spec:
replicas: 1
template:
metadata:
labels:
app: xxxxx-service
spec:
imagePullSecrets:
- name: regsecret
containers:
- image: xxxxxservice:v1.3.0
imagePullPolicy: Always
name: xxxxx-service
ports:
- containerPort: 8080
protocol: TCP
resources:
limits:
cpu: "0.2"
memory: 4Gi
答案 0 :(得分:2)
我有同样的问题。经过一段时间的调查,我发现应用程序中的tomcat服务器需要大约35秒钟才能启动。因此,我将initialDelaySeconds更改为大于35秒。我还将超时秒数增加到10,将periods_second增加到10秒。然后,Kubernetes探针运行良好。
答案 1 :(得分:1)
您的配置看起来不错,应该可以使用,但在我看到的事件中:
Get http://10.233.96.19:8080/: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
这意味着kubelet
已连接到您的pod,但请求已取消,因为在等待标头时超时超时。
所以,我认为问题出在您的应用程序中,它可以是:
默认路由规则不正确。默认情况下,kubelet
发送的请求没有任何标头(包括Host
),因此应用程序可能只是不知道如何处理该请求。尝试设置Host
标题:
livenessProbe:
httpGet:
httpHeaders:
Host: <desired.host.of.application.com>
一开始,应用程序的运行速度有点慢。在这种情况下,3秒的超时可能是不够的。您可以尝试增加timeoutSeconds
值。