【问题标题】:Kubernetes - Execute a script after the container is successfully completedKubernetes - 容器成功完成后执行脚本
【发布时间】:2021-04-10 02:39:47
【问题描述】:

我想在容器成功完成或由于 pod 中的错误而终止后立即执行脚本。

我尝试通过将处理程序附加到容器生命周期事件(如 preStop),但它仅在容器因 API 请求或管理事件(如活性探测失败、抢占、资源争用等)而终止时调用。

参考 - Kubernetes 文档:https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/

有没有其他方法可以解决这个问题?

【问题讨论】:

  • 您可以尝试将您的工作负载放入 initContainer 并将您的脚本放入主容器。如果即使失败也让 InitContainer 脚本以代码 0 退出,则主容器会在 InitContainer 完成后立即启动。只执行一次 Job 是完美的选择。如果你需要循环这个过程,Deployment 会更好。

标签: kubernetes containers kubernetes-pod


【解决方案1】:

正如你所说,来自官方文档:

Kubernetes 仅在 Pod 终止时发送 preStop 事件。这意味着当 Pod 完成时不会调用 preStop 钩子。

虽然,不建议使用裸 pod。考虑使用Job Controller

Job 创建一个或多个 Pod 并确保指定数量的 Pod 成功终止。当 pod 成功完成时,Job 会跟踪成功的完成情况。

您可以检查作业条件并通过以下方式等待它们:
kubectl wait --for=condition=complete job/your-job,然后运行您的脚本。同时将preStop 事件添加到您的 pod 定义中,以在 pod 终止时运行脚本。您可以编写额外的脚本,该脚本将在后台运行并检查作业是否完成,然后运行脚本。

while kubectl get jobs your-job -o jsonpath='{.status.conditions[? 
    (@.type=="Complete")].status}' | grep True ; do <run your main script> ; done

查看更多:job-completion-task

【讨论】:

    猜你喜欢
    • 2021-10-09
    • 1970-01-01
    • 2018-06-07
    • 2016-10-03
    • 2018-09-03
    • 1970-01-01
    • 2018-10-04
    • 2016-05-23
    • 2013-08-18
    相关资源
    最近更新 更多