Статус развертывания Kubernetes в Jenkins

Я пишу библиотеку Jenkins Global pipeline, где у меня есть этап для развертывания образа докера в кластере 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 rollout status deployment» не дает код выхода 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 я не нашел. Кто-нибудь сталкивается с такой же проблемой?


person Vaibhav Jain    schedule 05.02.2018    source источник


Ответы (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

person Chevy Hungerford    schedule 04.06.2018

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

kubectl rollout status deployment deployment_name --watch --timeout=5m
person Lenient Liu    schedule 20.05.2020

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

kubectl rollout status deployment deployment_name --watch=false

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

person Shahriar    schedule 05.02.2018
comment
Это означает, что ваше развертывание должно изменить свой статус на неудачный / успешный в течение определенного периода. - person Shahriar; 05.02.2018
comment
Спасибо @aerokite за ответ, но это решение не работает в моем случае, мне нужен правильный тайм-аут, чтобы продолжить артефакт на более высокий env. В основном то, что я хочу, - это либо статус развертывания, говорящий о том, что я не добился успеха за минимальное время и работа Дженкинса не удалась, либо он должен сказать, что я прошел, и работа продвигает артефакт в следующий env. Когда я запускаю эту команду и получаю статус выхода, он всегда равен 0, хотя я могу использовать ключевое слово «ожидание» или «успешно» из вывода, и на основе этого я могу ввести некоторую логику. Есть лучший способ сделать это? - person Vaibhav Jain; 05.02.2018
comment
Это значение периода ожидания, которое я ищу. - person Vaibhav Jain; 05.02.2018
comment
Можете ли вы установить MinReadySeconds в DeploymentSpec? - person Shahriar; 05.02.2018
comment
Удаление этого ответа, поскольку это не то, что вы хотите - person Shahriar; 05.02.2018
comment
Позвольте нам продолжить это обсуждение в чате. - person Vaibhav Jain; 05.02.2018