我已经看到许多帖子将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
更有用因为在容器运行后,应用程序必须初始化一些连接,例如,必须等待初始化。
我看到的一个例子是,许多帖子同时使用livenessProbe
和readinessProbe
,并且都调用相同的运行状况终结点。
livenessProbe:
httpGet:
path: /actuator/health
port: http
readinessProbe:
httpGet:
path: /actuator/health
port: http
答案 0 :(得分:1)
Kubernetes仅在主容器进程结束时才重新启动Pod,而不是在它停止响应或挂起时重新启动。 livenessProbe旨在重新启动无响应的容器。
我不建议readinessProbe和livenessProbe完全相同。您至少应对initialDelay使用不同的值(延迟小于readinessProbe的启动时间,大于livenessProbe的启动时间)。如果livenessProbe的延迟太短,您的应用程序将被杀死并重新启动,然后才能完全启动。
readinessProbe应该指示您的容器是否准备好响应请求。 livenessProbe的失败应表明该应用程序已挂起并应重新启动。对于许多没有复杂运行状况检查的简单应用程序,这种情况是相同的,因此它们使用相同的测试。如果您进行了更细粒度的运行状况检查,则可以对两个探针进行不同的测试。另一个差异的例子是您知道由于某些间歇性问题可以自行解决,因此您的健康检查有时会失败。在这种情况下,我建议您增加livenessProbe的failureThreshold。
因此,总的来说,我将使readinessProbe比livenessProbe更加严格。这样,您可以确保仅将请求发送到响应的Pod,而避免不必要的重启。显然,您需要考虑到应用程序的细节。
答案 1 :(得分:0)
在“容器正在运行”和“应用程序正在运行”之间不要混淆。您的应用程序可能取决于多个因素,例如数据库启动了吗? SSO在工作吗?
作为原则,应从系统的角度而不是开发人员着眼于需要进行可用性测试的内容。您的应用程序可能已启动,但可能死锁或引发与数据库相关的错误。因此,建议使用容器级别的运行状况检查而不是容器级别的检查。