【问题标题】:With Kubernetes Is there a way to wait for a pod to finish its ongoing tasks before updating it?使用 Kubernetes 有没有办法在更新之前等待 pod 完成其正在进行的任务?
【发布时间】:2020-04-07 17:42:36
【问题描述】:

我在 Kubernetes 中管理一个应用程序, 我有一个前端(nginx、flask)和一个后端(celery) 使用中间件(rabbitmq)将长时间运行的任务发送到后端

我的问题是我可以随时接收长时间运行的任务,我不希望它干扰我升级应用程序版本的计划。

我正在使用命令kubectl apply -f $MY_FILE 来部署/更新我的应用程序。但是,如果我在芹菜 po 忙的时候这样做,吊舱将被终止,我将失去任务。

我尝试使用就绪探针,但 pod 仍在被终止。 我的问题是,kube 有没有办法只针对“免费”的 pod,然后等待忙碌结束?

谢谢

【问题讨论】:

    标签: kubernetes deployment celery


    【解决方案1】:

    您可以使用 preStop 钩子在 Pod 终止之前完成正在进行的任务。

    Kubernetes 在容器终止之前立即发送 preStop 事件。除非 Pod 的宽限期到期,否则 Kubernetes 对 Container 的管理会一直阻塞到 preStop 处理程序完成。有关详细信息,请参阅Termination of Pods

    https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/#define-poststart-and-prestop-handlers

    【讨论】:

    • 谢谢你的回答,我会试试的!
    • 是的,它工作得很好,我现在只需要做一些调整。非常感谢!
    【解决方案2】:

    一种方法是使用新映像创建另一个部署,将其公开为服务。仅将任何新请求传递给此新部署/服务。

    同时,旧的部署/服务仍然可以继续处理现有的请求,而不接受任何新的请求。处理完所有请求后,可以删除旧的部署/服务。

    这种方法的唯一问题是,随着旧/新部署/服务并行运行,在一段时间内需要大约两倍的资源。

    类似于 A/B 测试。仅供参考 ... Istio 使用 traffic management 很容易。

    【讨论】:

    • 是的,这是一种解决方案,但为了做到这一点,由于我的后端没有被芹菜暴露,我不能像你建议的那样停止流量。在这种情况下,逻辑必须在我的后端实现,我想避免这种情况,因为对我来说这是 kube 的工作。 @ArghyaSadhu 找到了解决方案。
    猜你喜欢
    • 2019-10-26
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 2016-03-23
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多