kubectl rollout status deployment ${deployment} --timeout=10s
为了持续监控default命名空间中的所有部署,我们可以创建一个Bash脚本:
#!/bin/bash
while true; do
sleep 60
deployments=$(kubectl get deployments --no-headers -o custom-columns=":metadata.name" | grep -v "deployment-checker")
echo "====== $(date) ======"
for deployment in ${deployments}; do
if ! kubectl rollout status deployment ${deployment} --timeout=10s 1>/dev/null 2>&1; then
echo "Error: ${deployment} - rolling back!"
kubectl rollout undo deployment ${deployment}
else
echo "Ok: ${deployment}"
fi
done
done
2条答案
按热度按时间7kqas0il1#
你提到:
我部署了一个系统。不知什么原因过了一段时间没有React。
在这种情况下,可以使用liveness and readiness探测器:
Kubelet使用活动探测器来了解何时重新启动容器。例如,活动探测器可以捕获死锁,即应用程序正在运行但无法继续运行。在这种状态下重新启动容器有助于提高应用程序的可用性,尽管存在错误。
Kubelet使用就绪探测器来了解容器何时准备好开始接受流量。当Pod的所有容器都就绪时,该Pod被视为就绪。此信号的一个用途是控制将哪些Pod用作服务的后端。当Pod未就绪时,它将从服务负载平衡器中删除。
上述探测器可能会阻止您部署损坏的版本,但是liveness和readyness探测器无法将您的部署回滚到以前的版本。Github上有类似的issue,但我不确定在不久的将来是否会有任何进展。
如果您真的想自动化回滚过程,下面我将介绍一个您可能会发现有帮助的解决方案。
此解决方案需要从Pod中运行
kubectl
命令。简而言之,您可以使用脚本持续监视部署,并在出现错误时运行kubectl rollout undo deployment DEPLOYMENT_NAME
。首先,您需要决定如何查找失败的部署。例如,我将使用以下命令检查执行更新超过10秒的部署:
**注:**您可以根据需要使用不同的命令。
为了持续监控
default
命名空间中的所有部署,我们可以创建一个Bash脚本:我们希望从Pod内部运行此脚本,因此我将其转换为
ConfigMap
,这将允许我们在卷中装载此脚本(请参见:将ConfigMap用作Pod中的文件):我已经创建了一个单独的
deployment-checker
服务帐户,并分配了edit
角色,我们的Pod将在此服务帐户下运行:**注意:**我创建了一个部署,而不是单个Pod。
应用上述清单后,
deployment-checker
部署已创建并开始监视default
命名空间中的部署资源:最后,我们可以检查它是如何工作的。我已经创建了三个部署(
app-1
,app-2
,app-3
):然后我将
app-1
的图像更改为不正确的图像(nnnginx
):在
deployment-checker
日志中,我们可以看到app-1
已回滚到以前的版本:yqlxgs2m2#
我偶然发现了Argo Rollout,它解决了这种非自动回滚和许多其他与部署相关的事情。
https://argoproj.github.io/argo-rollouts/