当前位置: 首页 > 知识库问答 >
问题:

后端 - k8s中prestop钩子执行命令后的行为?

贺懿轩
2023-12-22

优雅停机,关于k8s可配置的prestop钩子。例如我采用exec执行命令行的形式,命令行执行正常返回0之后,k8s依然会等到宽限期到达才会删除pod而非是exec命令执行成功后立刻删除pod

在k8s的官方文档中没有找到这个问题的解答

共有2个答案

丌官盛
2023-12-22

https://kubernetes.io/docs/concepts/containers/container-life...

PreStop

This hook is called immediately before a container is terminated due to an API request or management event such as a liveness/startup probe failure, preemption, resource contention and others. A call to the PreStop hook fails if the container is already in a terminated or completed state and the hook must complete before the TERM signal to stop the container can be sent. The Pod's termination grace period countdown begins before the PreStop hook is executed, so regardless of the outcome of the handler, the container will eventually terminate within the Pod's termination grace period. No parameters are passed to the handler.

万英武
2023-12-22

preStop 是在 Kubernetes 中定义的一种生命周期钩子,它允许你在容器即将被终止之前执行一些命令。这个钩子的主要目的是让你可以在容器被终止之前执行一些清理工作,比如关闭日志,释放资源等。

关于你的问题,preStop 钩子执行命令后,Kubernetes 不会立即删除 Pod。这是因为 preStop 钩子的执行并不影响 Pod 的删除。preStop 钩子只是在 Pod 被删除之前执行一些清理工作,但它并不会改变 Pod 删除的时间。

在 Kubernetes 中,Pod 的删除是通过 API Server 发出的 DELETE 信号触发的。无论 preStop 钩子是否执行成功,API Server 都会在接收到 DELETE 信号后开始删除 Pod。如果 preStop 钩子执行成功,那么在 Pod 被删除之前,它将先执行 preStop 钩子中的清理工作。然而,如果 preStop 钩子执行失败,Pod 仍然会被删除,但在删除之前,它会返回一个错误状态。

至于你提到的 "宽限期",这实际上是 Kubernetes 为 Pod 删除提供的一个延时。这是为了防止 API Server 在短时间内频繁地删除和创建 Pod,从而避免对 Kubernetes 集群性能的影响。这个宽限期是默认存在的,且不能被修改。如果一个 Pod 在被删除后立刻重新创建,那么新的 Pod 将在旧的 Pod 完全删除后才会被创建。

因此,preStop 钩子执行命令后,Kubernetes 并不会立刻删除 Pod,而是会等待 preStop 钩子中的清理工作完成后再进行删除。即使 preStop 钩子执行失败,Pod 也仍然会被删除,但会在删除之前返回一个错误状态。

 类似资料:
  • 问题内容: 我想在我运行的每个bash命令之后打印日期。 这可以帮助我了解远离键盘时要执行多少命令。 我知道我能做 获取日期,但我不知道在bash上执行的每个命令之后如何甚至是否可以运行此命令。 我也会对在每个命令 之前 运行同一命令感兴趣,因此我可以知道一个命令花费了多长时间。 可能吗? 我应该编辑什么文件? 例如: 如果我也可以介绍以下功能,我将很高兴: 第一个日期是我运行程序的日期,第二个是

  • 问题内容: 我在终端中使用以下代码运行一些命令: 然后,我想知道运行此命令的结果是什么,例如,如果运行 我想阅读有关回购中更改的实际信息。有什么办法可以迅速做到这一点? 问题答案: 是用于将另一个程序作为子进程运行的类。您可以捕获程序的输出,错误输出,退出状态等等。 扩展我对xcode 6 swiftsystem()命令的回答,这是一个简单的实用函数,用于同步运行命令,并返回输出,错误输出和退出代

  • 目前使用了 vscode 的隧道功能,在服务器端使用 code tunnel 启动隧道,然后就可以在本地直接对服务器端的文件进行编辑。但是要执行 code tunnel 需要先使用终端连接上服务器,执行完命令后终端会被挂起 如果直接关闭终端,那么隧道会被断开。 有没有方法可以让 code tunnel 执行后在后台运行,这样就可以关闭终端并保持隧道。

  • 问题内容: 我正在使用Dockerfile创建Docker映像。我想在启动Docker容器时执行一些脚本。目前,我有一个Shell脚本来执行所有必要的过程 CMD [“ sh”,“ start.sh”] 我想用在后台示例中运行的进程执行shell命令 CMD [“ sh”,“-c”,“ mongod –dbpath / test&”] 问题答案: 除了对您的问题的评论已经指出有关Docker最佳实

  • 我正在使用DockerFile创建一个docker图像。我想在启动docker容器的同时执行一些脚本。目前我有一个shell脚本来执行所有必要的进程 CMD[“sh”,“start.sh”]

  • Sonarqube版本-7.9.5 SonarQube扫描仪-sonar-scanner-msbuild-5.0.4.24009-net46 源代码包含-C#、Angular.js、html5、JavaScript。 msbuild.exe/t:重新生成 sonarscanner.msbuild.exe结束/d:sonar.login=“tokenid_abc” 错误:SonarScanner执行