Состояние развертывания 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
Теперь вы можете проверить с помощью этой команды длительность с определенным интервалом.