缩小 Kubernetes pod 并没有优雅地关闭 Vertx 应用程序(用 java 开发)。它基本上杀死了容器。
重写了 io.vertx.core.Launcher 类的 beforeStoppingVertx 和 afterStoppingVertx 方法,并打印一些日志以验证 Vertx 是否正常关闭。 当 Pod 缩小时,方法 beforeStoppingVertx 和 afterStoppingVertx 永远不会被调用。
@Override
public void beforeStoppingVertx(Vertx vertx) {
LOG.info("Vertx Closing Gracefully");
vertx.close();
}
@Override
public void afterStoppingVertx() {
LOG.info("Vertx Closed Gracefully");
}
尝试在部署 yml(这是通用模板)中添加 60 秒的宽限期,但仍然没有用(即使在 60 秒后也不会调用 beforeStoppingVertx 和 afterStoppingVertx 方法)
我怀疑 vert.x 永远不会被告知关闭。或者没有收到消息。 我们确实可以选择在 Kubernetes 中定义 Pre Stop 挂钩, https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination
问题是我们需要在 Pre-stop 挂钩中提及的实际脚本是什么,它会指示 Vert.x 正常关闭?
恕我直言,因为您使用的是自定义启动器类,所以 Kubernetes Vertx 甚至不会触发
vertx.close()
。
尝试在主方法末尾添加以下关闭挂钩:
public static void main(String[] args) {
final Vertx vertx = Vertx.vertx();
// deploy your verticles...
Runtime.getRuntime().addShutdownHook(() -> {
try {
this.vertx.close()
.toCompletionStage()
.toCompletableFuture()
.get(5, TimeUnit.SECONDS);
log.info("<main> graceful shutdown success");
} catch (Exception e) {
log.error("<main> graceful shutdown error", e);
}
});
}