1

我必须将terminationGracePeriodSecondsKubernetes 部署清单文件中的 30 更改为 120,但是当我使用 helm 进行部署时:

helm upgrade --install <chartname> --values <valuesfilename>

旧的 pod 立即终止,新的 pod 开始运行。

但预期的行为是让旧 pod 保持终止状态,并按照定义继续其当前进程 120 秒。

这里还缺少什么?

这能解决我的问题吗?

containers:
  - name: containername
    lifecycle:
      preStop:
        exec:
          command: [ "/bin/sleep", "20" ]

我遇到的一个问题是,添加 sleep 命令是否会停止 Pod 的当前进程的执行,并且在它处于终止状态时只是休眠?

4

2 回答 2

0

基本上,这是 的预期行为terminationGracePeriodSeconds,因为它是pod 需要优雅终止的可选持续时间(以秒为单位)。

在 pod 终止时 -此处描述了生命周期- pod 接收terminating状态并将其从所有服务的端点列表中删除并停止获取新流量。信号立即发送到 pod 中运行的进程,Kubernetes 在option 中SIGTERM指定的宽限期内等待 pod 自行正常停止。terminationGracePeriodSeconds一旦terminationGracePeriodSeconds到期,Pod 就会被SIGKILL信号强行杀死。在您的情况下,在 120 秒的宽限期过去之前,pod 中的进程刚刚正常关闭。

反过来,preStop 钩子会在 Pod 终止之前立即调用,这意味着钩子将在kubectl发送SIGTERM到 Pod 之前执行。如文档中所述,挂钩必须TERM在发送停止容器的信号之前完成。terminationGracePeriodSeconds与 preStop 钩子并行发生,SIGTERM信号及其倒计时在preStop钩子执行之前开始。pod 最终将在 pod 的终止宽限期内终止,无论钩子是否完成。

因此,在接收到 hook 的sleep命令时preStop ,pod 已经被标记为Terminating但其中的进程尚未终止 - 因此容器可以在此期间完成所有活动的请求。

于 2022-02-22T22:10:29.190 回答
0

Kubernetes 参数terminationGracePeriodSeconds决定 Kubernetes 等待多长时间,直到它强制终止您的容器。换句话说,当 Kubernetes 想要终止您的 Pod 时,它会执行以下操作:

  1. Kubernetes 发送SIGTERM到您的容器
  2. Kubernetes 最多等待。terminationGracePeriodSeconds为了发生以下操作序列:
    • 容器正常停止
    • PreStop钩子执行
  3. Kubernetes 发送SIGKILL到您的容器(和您的PreStop容器)并因此强制终止它们

请注意,您的容器和PreStop容器不是同时执行的,而是同步执行的,一个接一个。

阅读Kubernetes Hook Handler Execution了解更多信息。

于 2022-02-22T08:32:28.650 回答