Деплой в куб через GitLab: как вывести ошибку деплоя в журнал pipeline?
У нас есть GitLab, в которой pipeline раскатывает изменения в k8s через helm.
У меня нет доступа к yaml-файлам, все что я вижу - запуск этой команды, которая завершается с ошибкой:
helm upgrade $([ -n "${USE_CONTEXT}" ] && \
echo --kube-context "${USE_CONTEXT}") --install --atomic --wait --timeout=10m $([ -n "${FORCE_DEPLOY}" ] && \
echo --set dorestartme=$(date +%s) ) --set image.repository="${CI_ARTIFACTS_HOST}:${CI_ARTIFACTS_PORT}/docker/${CI_PROJECT_NAME}" --set image.tag=${CI_COMMIT_SHORT_SHA} $([ -f "${HELM_VALUES}/all.yaml" ] && \
echo -f "${HELM_VALUES}/all.yaml" ) $([ -f "${HELM_VALUES}/${UNION_NAMESPACE}.yaml" ] && \
echo -f "${HELM_VALUES}/${UNION_NAMESPACE}.yaml" ) $([ -f "${HELM_VALUES}/${TARGET_NAMESPACE}.yaml" ] && \
echo -f "${HELM_VALUES}/${TARGET_NAMESPACE}.yaml" ) $([ -f "${HELM_VALUES}/${CI_PROJECT_NAME}.yaml" ] && \
echo -f "${HELM_VALUES}/${CI_PROJECT_NAME}.yaml" ) $([ -f "${HELM_VALUES}/${UNION_NAMESPACE}-${CI_PROJECT_NAME}.yaml" ] && \
echo -f "${HELM_VALUES}/${UNION_NAMESPACE}-${CI_PROJECT_NAME}.yaml" ) $([ -f "${HELM_VALUES}/${TARGET_NAMESPACE}-${CI_PROJECT_NAME}.yaml" ] && \
echo -f "${HELM_VALUES}/${TARGET_NAMESPACE}-${CI_PROJECT_NAME}.yaml" ) --set "app.profiles=${APP_PROFILES}" --set "app.name=${APP_NAME}" --set "app.kube_cluster_name=${KUBE_CLUSTER_NAME:-NaN}" --set "kubeClusterQN=${KUBE_CLUSTER_QN}" --set "app.dns_suffix=${DNS_SUFFIX}" --set "app.appdep=${L_APPDEP}" --set "app.appmission=${L_APPMISSION}" --set "app.appgate=${L_APPGATE}" --set "app.apptype=${L_APPTYPE}" --set "app.applangversion=${L_APPLANGVARSION}" -n "${TARGET_NAMESPACE}" ${APP_NAME} ${HELM_CHART_NAME}
Ошибка:
Error: UPGRADE FAILED: release *** failed, and has been rolled back due to atomic being set: timed out waiting for the condition
Uploading artifacts for failed job 00:01
Uploading artifacts...
Runtime platform arch=amd64 os=linux pid=25415 revision=943fc252 version=13.7.0
deploy.env: found 1 matching files and directories
Uploading artifacts as "dotenv" to coordinator... ok id=238266 responseStatus=201 Created token=VSsYmxhx
Cleaning up file based variables 00:00
ERROR: Job failed: exit status 1
Почему произошла ошибка, не понятно. Каждый раз мы обращаемся к девопсам и ищем ошибку совместными усилиями пол дня. Смотрим рединесс-пробы (кибана), журнал инит-контейнера (не знаю где), наличие ресурсов в кубе (графана).
Мне эта ситуация надоела. Я хочу, чтобы к журнал писалось, какая именно ошибка произошла - не прошла рединесс проба, кончились ресурсы, ...
Вопрос - это ведь можно сделать? И если можно, то как? Хотелось бы прийти с непустыми руками. Комментарии в духе "идите договаривайтесь" не нужны, ни мы, ни руководство не можем повлиять на ситуацию. Хотелось бы получить ответ - эта часть сделана не правильно, нужно вот так, ...
Ответы (1 шт):
Предлагаю убрать --atomic если он не нужен. Тогда после неудавшейся инсталляции по руинам можно будет попытаться восстановить картину
На время отладки можно убрать и --wait, чтобы сама команда отработала и пошла дальше. У нас появляется время для маневра
Добавить в шаблон deployment доп отладочный контейнер.
containers:
- name: wait
image: busybox
command: [sleep, '600'] #вы ждете 10 минут
Теперь можно спокойно приаттачится к поду и смотреть его логи. Если лог доступен только через ci, то придется применять магию скриптов из следующей комбинации.
# Находим под
kubectl get pod -w
# Нужно будет искать по маске, так как у пода будет имя типа something-server-12345678-abcde
kubectl logs deployment/something-server-12345678-abcde
Ну и нужно будет еще поиграться с задержкой перед выводом лога.