我正在编写一个Jenkins Global管道库,我有一个阶段将我的docker镜像部署到K8s集群。 因此,在CI过程中构建我的docker镜像后,我将图像提升(部署)到多个环境(从低到高)。 因此,要在运行
后获得正确的部署状态kubectl apply -f Application-k8s-file.yaml
我在shell步骤中使用了以下命令。
kubectl rollout status deployment deployment_name
如果我的部署没有错误但是如果我的部署有一些错误(可能是某些代码错误,应用程序无法启动),则事情顺利进行,那么此命令kubectl rollout status deployment <deployment name>
无限运行(因为k8s一次又一次地重试重新部署)我的Jenkins作业无限运行(直到作业超时)。
所以为了找到一个hack,我尝试了一个逻辑来将超时置于这个命令上并且计算是这样的:
超时=(豆荚数*活力探测时间+豆荚数* 10秒)
不确定此计算是否正确。
我的代码段看起来像这样
sh(returnStdout: true,script:"#!/bin/sh +e\n timeout --preserve-status ${timeout_value} kubectl rollout status deployment ${deploymentName} --kubeconfig='/opt/kubernetes-secrets/${env}/kubeconfig' 2>tmpfile; echo \$? > tmpfile1")
def readThisFile = readFile "tmpfile1.txt"
def var=readThisFile.toInteger()
if(var==0)
{
echo "deployment successful"
}
else{"do something else"}
最初效果很好但后来我发现k8s“kubectl rollout status deployment”命令在所有pod都被调度并且old完全终止有时需要时间之前不会给出退出代码0。
我基本上想要的是最小计算超时值。
我的K8s文件包含以下参数:
spec:
minReadySeconds: 30
livenessProbe:
httpGet:
path: /ping
port: 80
initialDelaySeconds: 45
periodSeconds: 5
timeoutSeconds: 60
name: test-dummyservice
ports:
- containerPort: 80
readinessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 60
periodSeconds: 120
timeoutSeconds: 60
我在K8s文档中没有找到与此相关的任何具体内容。有人面临同样的挑战吗?
答案 0 :(得分:2)
你应该看看progressDeadlineSeconds
。一旦超过截止日期,rollout status
将退出。
kubectl rollout status deployment ng
Waiting for rollout to finish: 2 out of 7 new replicas have been updated...
error: deployment "ng" exceeded its progress deadline
https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#progress-deadline-seconds
答案 1 :(得分:0)
如果您不想等待推出完成,那么您可以使用--watch=false
。
kubectl rollout status deployment deployment_name --watch=false
现在,您可以使用此命令检查具有特定时间间隔的持续时间。
答案 2 :(得分:0)
您可以按如下所示添加timeout
标志,这是文档https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands
kubectl rollout status deployment deployment_name --watch --timeout=5m