Развёртывание в Kubernetes из конвейера

Рейтинг: 70.1% · 9 голосов
Подробный курс по Jenkins и CI/CD: установка и настройка, плагины и Configuration as Code, конвейеры (pipeline) и Jenkinsfile, declarative и scripted, агенты, Docker и Kubernetes, общие библиотеки на Groovy, безопасность и credentials, интеграции (SonarQube, артефакты), траблшутинг. Актуально на 2026.
Ответить
Аватара пользователя
Andrey_CICD
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Развёртывание в Kubernetes из конвейера

Сообщение Andrey_CICD »

Оглавление курса (47)
  1. Что такое Jenkins и зачем нужен CI/CD
  2. Jenkins в 2026: версии, экосистема и сравнение с GitLab CI и GitHub Actions
  3. Архитектура Jenkins: контроллер, агенты, узлы и исполнители
  4. Установка Jenkins: пакеты, Docker и Kubernetes
  5. Первичная настройка Jenkins: мастер, плагины, пользователи
  6. Плагины Jenkins: установка, обновление и ключевой набор
  7. Configuration as Code (JCasC): настройка Jenkins декларативно
  8. Конвейеры Jenkins и Jenkinsfile: pipeline as code
  9. Scripted против Declarative: два синтаксиса конвейера
  10. Структура конвейера: node, stage, steps и первый pipeline
  11. Генератор сниппетов, запуск конвейера и Replay
  12. Типы заданий Jenkins: Freestyle, Pipeline, Multibranch и Organization
  13. Декларативный конвейер: структура pipeline, agent, stages
  14. agent, environment и переменные в конвейере
  15. tools, options, parameters и triggers в декларативном конвейере
  16. stages, parallel и matrix: организация этапов
  17. Условное выполнение when и блок post
  18. Триггеры сборки: webhook от GitHub, SCM polling и расписание
  19. Параметры сборки и пользовательский ввод
  20. Управление потоком: timeout, retry, sleep и waitUntil
  21. Параллелизм и блокировки: parallel, lock, milestone
  22. Постобработка и уведомления о результате сборки
  23. Groovy для Jenkins: основы скриптового конвейера
  24. Скриптовый конвейер: логика, циклы и функции
  25. Общие библиотеки Jenkins: Shared Libraries
  26. Подключение и загрузка общих библиотек
  27. Шаги оболочки: sh, bat, powershell и коды возврата
  28. Переменные среды, withEnv и рабочие пространства
  29. Работа с файлами, артефактами и отпечатками
  30. Сборка проектов в конвейере: Maven, Gradle, npm
  31. Качество кода: SonarQube и покрытие тестами
  32. Управление артефактами: публикация в Nexus и Artifactory
  33. Docker в Jenkins: образы как агенты сборки
  34. Сборка и публикация Docker-образов из конвейера
  35. Jenkins в Kubernetes: динамические pod-агенты
  36. Развёртывание в Kubernetes из конвейера (вы здесь)
  37. Безопасность Jenkins: аутентификация и матрица прав
  38. Учётные данные Jenkins: credentials в конвейере
  39. Безопасность сценариев: Groovy sandbox и Vault
  40. Уведомления и отчёты: email, Slack, Telegram, HTML
  41. Blue Ocean и интерфейс Jenkins в 2026
  42. Автоматизация Jenkins: CLI, REST API и script console
  43. Поиск и устранение неисправностей: читаем логи конвейера
  44. Типичные ошибки конвейера: сериализация и неутверждённый код
  45. Эксплуатация Jenkins: бэкап, обновление, масштабирование
  46. Конвертация и миграция: от Freestyle к Jenkinsfile
  47. Итог: сквозной CI/CD конвейер и Jenkins против альтернатив в 2026
Собрать образ и запушить его в реестр - это полдела. Самый нервный момент любого пайплайна наступает дальше: надо взять свежий тег и без даунтайма выкатить его в кластер так, чтобы прод не лёг, а если что-то пошло не так - откатиться за секунды, а не руками среди ночи. Этот урок про CD-часть: как из Jenkins деплоить приложение в Kubernetes, прокидывать kubeconfig как секрет, делать rolling update, проверять раскат и автоматически откатываться при сбое. Разберём связку jenkins kubernetes на практике, аппрув на прод и где Jenkins стоит вообще отдать деплой GitOps-движку.

Механика: как Jenkins получает доступ к кластеру

Чтобы стейдж деплоя что-то выкатил, агенту нужны две вещи: бинарь (kubectl или helm) и kubeconfig с правами в нужном namespace. Бинари ставим в образ агента заранее - не тяни их curl-ом на каждом запуске. Доступ к кластеру оформляем как credentials Jenkins, а не как файл на диске агента.

Есть два рабочих подхода. Первый - плагин Kubernetes CLI: ты кладёшь kubeconfig (или токен сервис-аккаунта) в Secret file credentials, а шаг withKubeConfig генерирует временный конфиг в воркспейсе и сносит его после выхода из блока. Второй, если сам агент крутится подом внутри того же кластера (см. урок про эфемерные pod-агенты, глава 59), - вообще не передавать креды: kubectl подхватит ServiceAccount пода. Это чище всего, но работает только для деплоя в тот же кластер, где живёт Jenkins.

Код: Выделить всё

pipeline {
    agent { label 'k8s' }
    environment {
        IMAGE     = "registry.cyberlake.ru/shop/api"
        TAG       = "${env.GIT_COMMIT.take(12)}"
        NAMESPACE = "dev"
    }
    stages {
        stage('Deploy dev') {
            steps {
                withKubeConfig([credentialsId: 'kubeconfig-dev', namespace: "${NAMESPACE}"]) {
                    sh '''
                        kubectl -n "$NAMESPACE" set image deployment/api \
                            api="$IMAGE:$TAG" --record
                        kubectl -n "$NAMESPACE" rollout status deployment/api --timeout=180s
                    '''
                }
            }
        }
    }
}
Обрати внимание на главное в jenkins kubectl-деплое: TAG берётся из стейджа сборки (тот же образ, что собрали и протестировали), а не latest. latest в проде - это лотерея, ты никогда не знаешь, что реально крутится. И сразу за apply идёт rollout status: команда висит, пока новые поды не станут Ready, и падает по таймауту, если раскат застрял. Без этой проверки пайплайн позеленеет, даже если поды уходят в CrashLoopBackOff.

Изображение

Helm вместо голого kubectl

Голый kubectl хорош для одного-двух манифестов. Как только появляются разные значения по окружениям, конфигмапы, инжресы и зависимости - удобнее Helm. Подход jenkins helm в declarative-пайплайне выглядит так:

Код: Выделить всё

        stage('Deploy stage') {
            steps {
                withKubeConfig([credentialsId: 'kubeconfig-stage']) {
                    sh '''
                        helm upgrade --install api ./charts/api \
                            --namespace stage --create-namespace \
                            --set image.repository="$IMAGE" \
                            --set image.tag="$TAG" \
                            --values ./charts/api/values-stage.yaml \
                            --wait --timeout 3m --atomic
                    '''
                }
            }
        }
Тут три флага решают почти всё. upgrade --install ставит релиз, если его ещё нет, и обновляет, если есть - идемпотентно, можно гонять сколько угодно раз. --wait заставляет helm ждать готовности подов, как rollout status. А --atomic - твоя страховка: если релиз не сошёлся за таймаут, helm сам откатит его на предыдущую ревизию. То есть откат при сбое ты получаешь бесплатно, без отдельной логики.

Окружения, аппрув и откат на проде

dev выкатываем автоматом на каждый коммит. На прод так нельзя - нужен живой человек, который нажмёт кнопку, и условие, что катим только из main. Это директива when и шаг input:

Код: Выделить всё

        stage('Deploy prod') {
            when { branch 'main' }
            steps {
                timeout(time: 30, unit: 'MINUTES') {
                    input message: "Выкатить ${TAG} в прод?", ok: 'Деплой',
                          submitter: 'release-managers'
                }
                withKubeConfig([credentialsId: 'kubeconfig-prod']) {
                    sh '''
                        helm upgrade --install api ./charts/api \
                            --namespace prod \
                            --set image.tag="$TAG" \
                            --values ./charts/api/values-prod.yaml \
                            --wait --timeout 5m --atomic
                    '''
                }
            }
            post {
                failure {
                    withKubeConfig([credentialsId: 'kubeconfig-prod']) {
                        sh 'helm -n prod rollback api --wait --timeout 3m || true'
                    }
                }
            }
        }
input ставит пайплайн на паузу и ждёт подтверждения; submitter ограничивает, кто вообще может нажать. Оборачивай input в timeout, иначе забытый пайплайн будет держать executor вечно. Блок post { failure } - подстраховка поверх --atomic: ловим любой провал стейджа и откатываем релиз. На rolling update это работает гладко - Kubernetes держит старые поды живыми, пока новые не поднимутся, так что откат не роняет трафик.

Про секреты кластера. kubeconfig и токены - это Secret file или Secret text в Jenkins Credentials, привязанные к нужным folder/job, чтобы dev-джоба физически не дотянулась до prod-кредов. Прод-kubeconfig - только для прод-джобы, в идеале на отдельном агенте. Сами секреты приложения (пароли БД, ключи) в манифесты не зашивай: храни в Kubernetes Secret, External Secrets Operator или Vault, а Helm пусть ссылается на уже существующий Secret. Логи Jenkins - публичная зона, любой echo токена туда и утечёт.

Где Jenkins отдаёт деплой GitOps (Argo CD)

Push-модель, которую мы разобрали, - Jenkins сам идёт в кластер и применяет манифесты - проста и наглядна, но у неё есть слабые места. Прод-креды живут в CI. Нет автоматического отслеживания дрейфа: кто-то поправил руками через kubectl edit - и состояние кластера разошлось с гитом, а ты не узнаешь. На десятках сервисов это становится больно.

Тут на сцену выходит GitOps и Argo CD. Идея простая: единственный источник правды - git-репозиторий с манифестами. Argo CD крутит в кластере reconciliation loop, постоянно сравнивая желаемое состояние из гита с реальным и подтягивая расхождения. В этой модели роль Jenkins сужается до честного CI: собрать, протестировать, запушить образ и обновить тег в git-репозитории конфигов. Дальше деплоит уже Argo CD.

Код: Выделить всё

        stage('Bump image tag (GitOps)') {
            when { branch 'main' }
            steps {
                withCredentials([gitUsernamePassword(credentialsId: 'gitops-repo')]) {
                    sh '''
                        git clone https://git.cyberlake.ru/infra/gitops.git
                        cd gitops
                        yq -i ".image.tag = \\"$TAG\\"" apps/api/values-prod.yaml
                        git commit -am "api: prod -> $TAG"
                        git push
                    '''
                }
            }
        }
К 2026 в облачно-нативных командах это де-факто стандарт: CI (Jenkins, GitLab CI или GitHub Actions) собирает, Argo CD катит. Дрейф ловится автоматом, откат - это git revert, мульти-кластер из коробки. Jenkins при этом не уходит на пенсию - он по-прежнему силён там, где нужны плагины, сложная оркестрация сборки и изоляция в собственном контуре (актуально для регулируемых сфер). Когда у тебя пять сервисов и один кластер - push-деплоем из jenkins cd вполне можно жить. Когда сервисов под сотню - отдавай раскат Argo CD, а Jenkins оставляй на CI.

Типичные грабли
  • Деплой по latest. Пайплайн зелёный, в кластере непонятно что. Всегда фиксируй тег из стейджа сборки - коммит-хэш или семвер.
  • apply без rollout status или helm без --wait. Джоба завершается раньше, чем поды поднялись, провал маскируется зелёной галочкой.
  • input без timeout. Забытый аппрув держит executor и копит очередь.
  • Один kubeconfig на все окружения. dev-джоба получает доступ к проду. Разделяй креды по namespace и по folder.
  • Токен в логах. Любой sh с echo секрета пишет его в публичный лог. Только через withCredentials / withKubeConfig.
  • kubectl/helm версии сильно расходятся с версией кластера. Держи бинари в образе агента и обновляй их вместе с апгрейдом кластера.
Мини-лаба
  • Заведи Secret file credentials с kubeconfig для namespace dev. Собери пайплайн со стейджем deploy через withKubeConfig + kubectl set image + rollout status. Убедись, что джоба краснеет, если выставить заведомо несуществующий тег.
  • Перепиши deploy на helm upgrade --install с флагами --wait --atomic. Сломай деплой намеренно (битый image.tag) и проверь, что Helm сам откатил релиз.
  • Добавь стейдж deploy prod с when { branch 'main' }, input с submitter и блоком post { failure } с rollback. Прогони из ветки и из main - убедись, что стейдж пропускается не из main.
Контрольные вопросы
  • Зачем после kubectl apply ставить rollout status, а в helm - флаг --wait? Что без них ломается?
  • Чем отличается push-деплой из Jenkins от pull-модели Argo CD и в какой точке Jenkins отдаёт раскат GitOps?
  • Как ограничить, из какой ветки и кем можно выкатить на прод? Какие директивы за это отвечают?
  • Почему прод-kubeconfig нельзя держать доступным dev-джобе и как развести креды по окружениям?
Итог

CD из Jenkins в Kubernetes держится на четырёх вещах: тег образа из стейджа сборки, kubeconfig как изолированный секрет, проверка раската через rollout status или helm --wait, и откат при сбое (--atomic либо rollback в post failure). На прод вешаешь when + input с timeout. А как только сервисов становится много - не геройствуй с push-деплоем, передай раскат Argo CD, оставив Jenkins честным CI. Версии бинарей и кластера держи в одной лодке, секреты - вне манифестов и вне логов.
👍 ❤️4 🔥1 😄 🤔
Аватара пользователя
Gga1939
Сообщения: 1
Зарегистрирован: 14 май 2026, 13:44

Re: Развёртывание в Kubernetes из конвейера

Сообщение Gga1939 »

Наконец дошло, зачем --atomic в helm нужен. Раньше деплоил без него, релиз падал на середине и кластер оставался в кашице из старых и новых подов. Теперь откат сам отрабатывает, спасибо.
👍1 ❤️1 🔥 😄 🤔2
Аватара пользователя
haskell_sre
Сообщения: 1
Зарегистрирован: 28 май 2026, 14:39

Re: Развёртывание в Kubernetes из конвейера

Сообщение haskell_sre »

А если агент сам поднят как pod внутри кластера, реально можно вообще без kubeconfig жить на ServiceAccount? Звучит удобно, но как тогда катить в ДРУГОЙ кластер, не тот где Jenkins крутится?
👍2 ❤️ 🔥 😄 🤔2
Ответить
← Предыдущая глава
Jenkins в Kubernetes: динамические pod-агенты
Следующая глава →
Безопасность Jenkins: аутентификация и матрица прав

Все главы курса «Jenkins: конвейеры CI/CD от основ до продакшена»

Поделиться темой: ✈ Telegram VK
Похожие запросы: как установить jenkins на linux и в dockergroovy в jenkins scripted pipeline как написатьпараметры и параллельные стейджи в jenkins pipelineminikube или kind что выбрать для локального кластера kuberneteskubectl get describe logs основные команды для работы с кластеромчем отличается deployment от pod в kubernetes простыми словами

Вернуться в «Jenkins: конвейеры CI/CD от основ до продакшена»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя