我正在编写一个 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,我尝试了一个逻辑来将超时设置在这个命令上,并且计算是这样的:
timeout = (pod 数量 * liveness probe time + pod 数量 * 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 都被安排好并且旧的完全终止之前不会给出退出代码 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 文档中没有找到与此相关的任何具体内容。有人面临同样的挑战吗?