繁体   English   中英

Kubernetes 限制重试次数

[英]Kubernetes limit number of retry

在某些情况下,我在 python 中创建了一个 API,它使用 ENV 变量中的用户输入创建 K8s 作业。

有时,选择的图像不存在或已被删除。 机密不存在或未创建卷。 因此它使 Job 处于crashloopbackoffimagepullbackoff状态。

首先我想知道这种状态下的资源是否分配给了工作?

如果是,我不希望 Job 永远循环并将资源锁定到永远不会启动的 Job。

我已将backofflimit设置为 0,但这是当 Job 检测到失败的 Pod 并尝试重新启动另一个 Pod 以重试时。 就我而言,我知道如果 Pod 无法完成作业,则主要是由于 OOM 或代码失败,并且总是由于用户输入而失败。 所以重试总是会失败。

但它不限制尝试crashloopbackoffimagepullbackoff的次数。 有没有办法设置terminatefail作业? 我不想杀死它,而只是释放资源并将事件保存在( status.container.state.waiting.reason + status.container.state.waiting.message )或( status.container.state.terminated.reason + status.container.state.terminated.exit_code

是否可以设置一个选项来限制创建时的重试次数,以便我可以释放资源,但不能删除它以保留日志。

我已经测试了你的第一个问题,是的,即使一个 pod 处于 crashloopbackoff 状态,资源仍然分配给它!!! 这是我的测试: 当 Pod 处于 crashLoopBackOff 状态时,Kubernetes 请求的资源是否仍然分配给它?

谢谢你的提问!

长回答短,不幸的是在 Kubernetes 中没有这样的选项。

但是,您可以手动执行此操作,方法是检查 pod 是否处于crashloopbackoff中,然后取消分配其资源或简单地删除 pod 本身。

以下脚本从指定namespace中删除任何处于crashloopbackoff状态的 pod

#!/bin/bash
# This script check the passed namespace and delete pods in 'CrashLoopBackOff state 

NAMESPACE="test"
delpods=$(sudo kubectl get pods -n ${NAMESPACE} |
  grep -i 'CrashLoopBackOff' |
  awk '{print $1 }')    

for i in ${delpods[@]}; do

  sudo kubectl delete pod $i --force=true --wait=false \
    --grace-period=0 -n ${NAMESPACE}
    
done

由于我们通过了--grace-period=0选项,因此 Pod 不会再次自动重启。 但是,如果在使用此脚本或将其分配给作业后,您注意到 pod 继续重新启动并由于某种奇怪的原因再次进入CrashLoopBackOff状态。 Thera 是一种解决方法,它正在更改 pod 的重启策略:

PodSpec 有一个 restartPolicy 字段,其可能值 Always、OnFailure 和 Never。 默认值为始终。 restartPolicy 适用于 Pod 中的所有容器。 restartPolicy 仅指同一节点上的 kubelet 对容器的重启。 由 kubelet 重启的已退出容器会以指数回退延迟(10 秒、20 秒、40 秒……)重启,上限为 5 分钟,并在成功执行 10 分钟后重置。 正如 Pods 文档中所讨论的,一旦绑定到一个节点,Pod 将永远不会被反弹到另一个节点。

文档中或从此处查看更多详细信息。

就是这样! 快乐的黑客。

关于第一个问题, bguess here已经回答了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM