问题标签 [graceful-shutdown]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
382 浏览

java - Spring Boot 2.3 Liveness Probe 功能无法正常关闭

我正在使用 Kubernetes字段测试 Spring Boot 2.3(server.shutdown=graceful 和 Tomcat Web 服务器)中的新功能正常关闭。terminationGracePeriodSeconds当正常关闭阶段开始时,新的 HTTP 请求按预期被拒绝,此时应详细说明当前请求,直到可配置的超时 ( spring.lifecycle.timeout-per-shutdown-phase)。奇怪的行为是 Spring boot actuator liveness 结果,因为在这种情况下,liveness 端点是不可达的。

因此,kubelet 无法知道微服务在关闭期间是否还活着,或者因为其他事情而卡住了。由于K8s liveness probe不依赖terminationGracePeriodSecondsfield,POD会根据自己的K8s liveness配置重启,Spring boot微服务因为野蛮重启无法优雅关闭。

我错过了什么吗?我该如何管理这种情况?

0 投票
0 回答
332 浏览

kubernetes - Vetx 应用程序中的优雅关闭

缩小 Kubernetes pod 并没有优雅地关闭 Vertx 应用程序(用 java 开发)。它基本上杀死了容器。

覆盖 io.vertx.core.Launcher 类的 beforeStoppingVertx 和 afterStoppingVertx 方法并打印一些日志以验证 Vertx 是否正常关闭。当 Pod 缩小时,永远不会调用 beforeStoppingVertx 和 afterStoppingVertx 方法。

尝试将 60 秒的宽限期添加到作为通用模板的部署 yml 中,但它仍然没有用(即使在 60 秒后也没有调用 beforeStoppingVertx 和 afterStoppingVertx 方法)

我怀疑 vert.x 永远不会被告知要关闭。或者它没有收到消息。我们确实有在 Kubernetes 中定义 Pre Stop 挂钩的选项, https: //kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination

问题是实际的脚本是什么,我们需要在 Pre-stop 钩子中提到它,它会指示 Vert.x 正常关闭?

0 投票
1 回答
562 浏览

python - 在这里可以接受抑制 `asyncio.CancelledError` 吗?

例子:

为避免Task was destroyed but it is pending!警告,我必须在取消后等待任务,但等待它们会导致终端被CancelledError. 我知道它被取消了,但我不需要看到它。

在这里使用是否contextlib.suppress会对取消产生负面影响?我可以避免看到取消的错误(或任务被破坏的警告而无需等待)的唯一另一种方法是使用asyncio.wait而不是开始我的初始任务asyncio.gather。出于某种原因,wait似乎抑制了异常。我使用return_when=asyncio.FIRST_EXCEPTIONonwaitreturn_exceptions=Trueon gather。但似乎无论我如何设置他们的关键字参数,都会gather打印异常而wait没有。

0 投票
1 回答
427 浏览

java - SpringApplication.exit() 返回 java.lang.InterruptedException: null

最近,我将 spring boot 版本从 升级2.3.42.4.2. 我有下面的代码来优雅地关闭应用程序。

这段代码在升级之前运行良好。现在它给出了以下异常并且应用程序继续运行(没有终止)。

知道如何解决这个问题吗?

更新

根据@vvs 的回答,我将代码更改为首先关闭 Hikari 数据源。现在 InterruptedException 不存在。令人惊讶的是,该应用程序仍在运行。我可以看到下面的日志经常记录。意思是,这些线程没有终止。

0 投票
0 回答
221 浏览

django-celery - Celery 任务在本地运行时在正常关闭时重新排队到代理,但尽管配置相同但在 kubernetes 中丢失

我有一个在 k8 pod 中运行的芹菜。这是我的芹菜清单

我在 django settings.py 中的 Celery 配置是

ctrl-C当我使用 celery 和 redis 作为消息代理运行一个简单的 django 应用程序时,当我为工作人员启动热关机时,我的任务会重新排队到代理中。但是,当同一个应用程序部署到 celery、django 和 redis 在 3 个不同 pod 中运行的 kubernetes 时,当 celery pod 正常终止时,我的任务不会重新排队回到 redis。我无法理解为什么?我的芹菜设置在这两种情况下都没有改变。

0 投票
0 回答
71 浏览

node.js - SIGTERM 事件后:进程不断接收请求

我创建了一个最小的快递 POC,只有一个基本路由在 30 秒后使用 setTimeout 发送 hello world。

我发送了一个 HTTP 请求并开始等待。同时我跟踪了节点的PID并从终端杀死了它。

SIGTERM 事件被触发和处理如下:

出现了前两个日志,如果我尝试设置另一个 http 请求,它就会失败。正是我想要的。但是,当第一个 http 请求最终完成并返回时,可能有 3-5 秒的间隙,我可以线程另一个 http 请求!然后它可以再等 30 秒并完成,然后我可以设置另一个等等。

如果有大量请求,例如 k8s,将完全不正常地关闭它,并且所有这些请求都将失败(达到超时)。

为什么会发生,它是 Nodejs v14 中的错误吗?当最后一个 http 请求结束时,该进程应该立即停止并且永远不会收到任何类型的其他请求。然后告诉像 k8s 这样的管理器,容器现在已停止,并且允许终止 pod。

完整的行为应该是这样的:

假设我们只有一个 pod。

然后我们升级版本。

K8S 开始创建一个新的 pod,当新的 pod 被创建时,它会停止将任何新请求路由到旧的。

它不会也不应该终止旧的 pod,除非它清楚地表明他已经完成了最后一个 http 请求的服务。

然后应该终止旧的 pod,我们的停机时间为零——这是使用 K8S 的核心原因之一。

0 投票
2 回答
281 浏览

go - 通道和优雅关闭死锁

运行以下程序并运行 CTRL + C,handle例程在尝试发送到通道时被阻止,但process例程已关闭。有什么更好的并发设计来解决这个问题?

编辑程序以描述应用此处建议的规则的问题https://stackoverflow.com/a/66708290/4106031

输出

0 投票
1 回答
309 浏览

kubernetes - 如何在 Sidecar 中调整优雅关闭时间

想知道kubernetes中是否有任何设置可以调整sidecar容器的优雅关闭时间?正如我们发现周期太短并希望延长它。

0 投票
1 回答
364 浏览

go - 为什么 kill -15 没有优雅地杀死我的 Golang gRPC 服务?

我已经使用信号处理程序来处理SIGTERM,SIGINT信号。当 grpc 服务器启动并运行时,我发出sudo kill -15 [PID]命令,但看不到正常的关闭日志报告,而且我得到:

现在,当我使用 netstat 时,它报告端口号 50051 已打开,并且由于端口号繁忙,我无法运行我的服务器。

我做了什么:

server.Stop()函数用于停止 grpc 服务器grpcServer.GracefulStop(),并记录一些数据。当我发布时,CTRL+C一切都按预期工作。为什么对sudo kill -15我有这种行为?

0 投票
0 回答
224 浏览

kubernetes - 保证 Promtail 从终止的 Kubernetes pod 中抓取所有日志消息

我正在使用loki/loki-stack版本“0.38.2”的 Promtail,有时会丢失短期 k8s pod 的日志消息或正在终止的 pod 的最终日志消息。

当我使用默认值时会发生这种情况

当我设置为sync_period0.1s,不会丢失任何消息。

因此,我有以下问题:

  1. 是否有关于 Promtail 的配置参数的任何文档config -> target_config -> sync_period(除了上面的评论)?
  2. 当我设置sync_period为时,我会得到什么负面影响0.1s?我是否仍然可能丢失日志消息,只是不太可能?
  3. 我在网上找到了很多例子,都设置sync_period10s. 为什么他们没有像我一样丢失日志消息?我可能在我的 k8s 集群中错误配置了什么?我如何保证在我的最后一条日志消息之后仍然会发生刮擦?