Kubernetes探针在Tomcat上失败

时间:2018-04-11 08:21:28

标签: tomcat kubernetes

我在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

2 个答案:

答案 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,但请求已取消,因为在等待标头时超时超时。

所以,我认为问题出在您的应用程序中,它可以是:

  1. 默认路由规则不正确。默认情况下,kubelet发送的请求没有任何标头(包括Host),因此应用程序可能只是不知道如何处理该请求。尝试设置Host标题:

    livenessProbe:
      httpGet:
        httpHeaders:
          Host: <desired.host.of.application.com>
    
  2. 一开始,应用程序的运行速度有点慢。在这种情况下,3秒的超时可能是不够的。您可以尝试增加timeoutSeconds值。