Я пишу библиотеку 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 я не нашел. Кто-нибудь сталкивается с такой же проблемой?