Kubernetes限制重试次数



对于某些上下文,我正在用python创建一个API,该API使用用户在ENV变量中输入来创建K8s job。

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

首先,我想知道在此状态下的资源是否分配给作业?

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

我已经将backofflimit设置为0,但这是当作业检测到一个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状态。这里有一个解决方法,即更改pod的重启策略:

一个PodSpec有一个restartPolicy字段,可能的值是Always,不要失败,不要失败。默认值为Always。restartPolicy适用于Pod中的所有容器。restartPolicy仅指由同一节点上的kubelet重新启动容器。退出由kubelet重新启动的容器使用指数后退延迟(10秒,20秒,40秒……)上限为5分钟,并在成功执行10分钟后重置。如前所述在Pods文档中,一旦绑定到节点,Pod将永远不会被绑定反弹到另一个节点

在文档中或从这里查看更多详细信息。

就是这样!快乐的黑客。

关于第一个问题,这里已经有答案了。

最新更新