Состояние развертывания Kubernetes в Дженкинсе

Я пишу глобальную конвейерную библиотеку Jenkins, где у меня есть этап для развертывания моего образа докера в кластере K8s. Таким образом, после создания моего образа докера во время процесса CI, я продвигаю (развертываю) образ в нескольких средах (последовательно ниже или выше). Таким образом, чтобы получить правильный статус развертывания после запуска

kubectl apply -f Application-k8s-file.yaml

Я использовал следующую команду в шаге оболочки.

kubectl rollout status deployment deployment_name

Все идет хорошо, если в моем развертывании нет ошибки, но если в моем развертывании есть какая-то ошибка (может быть какая-то ошибка кода, приложение не запускается), тогда эта команда kubectl rollout status deployment <deployment name> работает бесконечно (так как k8s повторяет попытки снова и снова для повторного развертывания), и моя работа Jenkins выполняется бесконечно (до истечения времени ожидания задания).

Поэтому, чтобы найти взлом, я попытался с помощью логики установить время ожидания для этой команды, и вычисления выглядят примерно так:

время ожидания = (количество стручков * время проверки жизнеспособности + количество стручков * 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" не дает код выхода 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. Кто-нибудь сталкивается с такой же проблемой?

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/

Вы можете добавить timeoutфлаг, как показано ниже, вот документ https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands

kubectl rollout status deployment deployment_name --watch --timeout=5m

Если вы не хотите ждать окончания развертывания, вы можете использовать --watch=false,

kubectl rollout status deployment deployment_name --watch=false

Теперь вы можете проверить с помощью этой команды длительность с определенным интервалом.