3

我正在编写一个 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 文档中没有找到与此相关的任何具体内容。有人面临同样的挑战吗?

4

3 回答 3

3

你应该看看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

于 2018-06-04T15:15:57.677 回答
2

您可以timeout像下面这样添加标志,这里是文档https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands

kubectl rollout status deployment deployment_name --watch --timeout=5m
于 2020-05-20T08:41:04.260 回答
0

如果您不想等待推出完成,那么您可以使用--watch=false.

kubectl rollout status deployment deployment_name --watch=false

现在,您可以使用此命令检查具有特定间隔的持续时间。

于 2018-02-05T09:04:49.743 回答