kubernetes Vetx应用程序中的正常关闭

disbfnqx  于 12个月前  发布在  Kubernetes
关注(0)|答案(1)|浏览(157)

缩小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优雅地关闭?

mepcadol

mepcadol1#

IMHO,而不是Kubernetes Vertx甚至不会触发vertx.close(),因为您使用的是自定义Launcher类。
尝试在main方法的末尾添加以下shutdown钩子:

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);
        }
    });
  }

字符串

相关问题