为Java Web应用程序设置kubernetes livenessProbe是否有用?

时间:2019-04-04 08:43:55

标签: kubernetes

我已经看到许多帖子将livenessProbe设置为Java Web应用程序的运行状况端点。以springboot为例:

livenessProbe:
            httpGet:
              path: /actuator/health
              port: http

但是据我所知,以下命令(即dockerfile的最后一行)已经可以保证与livenessProbe相同。

CMD ["-c", "/usr/bin/java ${DOCKER_JAVA_OPTS} -jar YOUR_JAR.jar"]

也就是说,如果Java应用程序崩溃,将创建一个新的pod,因此,无需为Java应用程序设置livenessProbe吗?

对我来说,将readinesProbe设置为livenessProbe也是没有意义的,因为当livenessProbe通过时,readinessProbe肯定会通过,而readinessProbe更有用因为在容器运行后,应用程序必须初始化一些连接,例如,必须等待初始化。

我看到的一个例子是,许多帖子同时使用livenessProbereadinessProbe,并且都调用相同的运行状况终结点。

        livenessProbe:
            httpGet:
              path: /actuator/health
              port: http
          readinessProbe:
            httpGet:
              path: /actuator/health
              port: http

2 个答案:

答案 0 :(得分:1)

Kubernetes仅在主容器进程结束时才重新启动Pod,而不是在它停止响应或挂起时重新启动。 livenessProbe旨在重新启动无响应的容器。

我不建议readinessProbe和livenessProbe完全相同。您至少应对initialDelay使用不同的值(延迟小于readinessProbe的启动时间,大于livenessProbe的启动时间)。如果livenessProbe的延迟太短,您的应用程序将被杀死并重新启动,然后才能完全启动。

readinessProbe应该指示您的容器是否准备好响应请求。 livenessProbe的失败应表明该应用程序已挂起并应重新启动。对于许多没有复杂运行状况检查的简单应用程序,这种情况是相同的,因此它们使用相同的测试。如果您进行了更细粒度的运行状况检查,则可以对两个探针进行不同的测试。另一个差异的例子是您知道由于某些间歇性问题可以自行解决,因此您的健康检查有时会失败。在这种情况下,我建议您增加livenessProbe的failureThreshold。

因此,总的来说,我将使readinessProbe比livenessProbe更加严格。这样,您可以确保仅将请求发送到响应的Pod,而避免不必要的重启。显然,您需要考虑到应用程序的细节。

答案 1 :(得分:0)

  1. 不要使黑白豆荚与容器混淆。吊舱可以运行多个容器。
  2. 在“容器正在运行”和“应用程序正在运行”之间不要混淆。您的应用程序可能取决于多个因素,例如数据库启动了吗? SSO在工作吗?

    作为原则,应从系统的角度而不是开发人员着眼于需要进行可用性测试的内容。您的应用程序可能已启动,但可能死锁或引发与数据库相关的错误。因此,建议使用容器级别的运行状况检查而不是容器级别的检查。