PipelineRuns
PipelineRun — это Kubernetes Custom Resource, который создаёт экземпляр Pipeline для выполнения. PipelineRun отвечает за выполнение Tasks, определённых в Pipeline, и управление их жизненным циклом, предоставляя способ запускать сквозные CI/CD workflow.
Содержание
Зачем нужны PipelineRunsПроблемы CI/CD workflowРешение TektonПреимуществаСценарииОграниченияПринципыМодель выполнения PipelineRunСостояние PipelineRunПримеры конфигурацииБазовый пример PipelineRunPipelineRun со встроенным определением PipelineВажные параметрыTimeoutСценарии использованияПринципыПоля TimeoutПримеры конфигурацииServiceAccountСценарии использованияПринципыПример конфигурацииPod TemplateСценарии использованияПринципыПример конфигурацииTaskRunSpecsСценарии использованияПринципыПоля конфигурацииПримеры конфигурацииWorkspacesСценарии использованияПринципыПример конфигурацииУправление состоянием PipelineRunМониторинг состояния выполненияОтмена PipelineRunКорректная остановка PipelineRunСсылкиЗачем нужны PipelineRuns
Проблемы CI/CD workflow
В CI/CD systems существует несколько проблем, связанных с выполнением workflow:
- Оркестрация workflow: необходимо координировать несколько tasks в определённом порядке
- Координация ресурсов: необходимо управлять ресурсами между несколькими tasks
- Обмен данными: необходимо передавать данные между tasks в workflow
- Отслеживание выполнения: необходимо отслеживать ход всего workflow
- Обработка ошибок: необходимо обрабатывать сбои как на уровне task, так и на уровне workflow
- Аудитируемость: необходимо сохранять запись всех выполнений workflow
Решение Tekton
Tekton PipelineRuns решают эти задачи следующим образом:
- Экземпляр workflow: каждый PipelineRun представляет собой одно выполнение Pipeline с определёнными входными данными
- Оркестрация: PipelineRuns управляют порядком выполнения Tasks на основе зависимостей
- Привязка ресурсов: PipelineRuns связывают фактические ресурсы с требованиями Pipeline
- Отслеживание состояния: PipelineRuns отслеживают состояние выполнения каждой Task
- Передача результатов: PipelineRuns обеспечивают обмен результатами между Tasks
- Интеграция с Kubernetes: PipelineRuns используют Kubernetes для управления ресурсами и планирования
Преимущества
- Изоляция: каждый PipelineRun выполняется независимо, что позволяет параллельно запускать один и тот же Pipeline
- Трассируемость: PipelineRuns предоставляют подробную историю выполнения и логи
- Гибкость: PipelineRuns могут переопределять параметры Pipeline и привязки workspace
- Повторное использование: один и тот же Pipeline можно выполнять с разными входными данными через разные PipelineRuns
- Интеграция: PipelineRuns могут запускаться различными systems через Kubernetes API
- Наблюдаемость: состояние и логи PipelineRun можно отслеживать с помощью инструментов Kubernetes
Сценарии
PipelineRuns полезны в различных сценариях, включая:
- Application CI/CD: сборка, тестирование и развёртывание applications
- Infrastructure as Code: подготовка и управление infrastructure
- Управление релизами: координация сложных процессов release
- Плановые workflow: запуск workflow по расписанию
- Event-Driven workflow: запуск workflow в ответ на внешние события
Ограничения
- PipelineRuns выполняются внутри одного Kubernetes cluster
- После запуска параметры PipelineRun нельзя изменять
- У PipelineRuns ограничены возможности повторных попыток для failed Tasks
- Время выполнения PipelineRun ограничено тайм-аутами Kubernetes pod
- PipelineRuns нельзя поставить на паузу после начала выполнения (кроме "finally" tasks)
Принципы
Модель выполнения PipelineRun
Когда создаётся PipelineRun:
- Tekton проверяет спецификацию PipelineRun
- Tekton создаёт TaskRuns для каждой Task в Pipeline
- TaskRuns выполняются на основе своих зависимостей
- Результаты из Tasks собираются и могут использоваться последующими Tasks
- Состояние PipelineRun обновляется по мере завершения каждого TaskRun
- "Finally" Tasks выполняются после завершения или сбоя всех остальных Tasks
- PipelineRun завершается, когда завершены все TaskRuns
Состояние PipelineRun
Состояние PipelineRun предоставляет подробную информацию о выполнении:
- Общее состояние (Running, Succeeded, Failed и т. д.)
- Время начала и завершения
- Состояния отдельных TaskRun
- Результаты Task
- Причина сбоя (если применимо)
- Имена TaskRun для доступа к логам
Примеры конфигурации
Базовый пример PipelineRun
PipelineRun со встроенным определением Pipeline
Важные параметры
Timeout
Timeout позволяет задать максимальную длительность выполнения PipelineRun.
Сценарии использования
- Предотвращение бесконечного потребления ресурсов долгоживущими Pipelines
- Обеспечение завершения CI/CD workflow в разумные сроки
- Обработка зависших или deadlocked Tasks
- Настройка разных ограничений timeout для разных фаз выполнения pipeline
Принципы
Timeouts:
- задаются в спецификации PipelineRun с помощью поля
timeouts(устаревшее полеtimeoutсчитается deprecated) - применяются ко всему выполнению PipelineRun или к отдельным секциям (tasks, finally)
- измеряются от начала первой Task до завершения последней Task
- приводят к сбою PipelineRun при превышении
- должны удовлетворять ограничению:
timeouts.pipeline >= timeouts.tasks + timeouts.finally - Важно: если любое подполе установлено в "0", для этой секции timeout отсутствует. Чтобы установить
timeouts.tasksилиtimeouts.finallyв "0", также необходимо установитьtimeouts.pipelineв "0"
Поля Timeout
- pipeline: максимальная длительность всего PipelineRun
- tasks: максимальная длительность всех non-finally tasks
- finally: максимальная длительность всех finally tasks
Примеры конфигурации
Пример 1: стандартная конфигурация timeout
Пример 2: без timeout для tasks и finally (требует, чтобы timeout pipeline был 0)
Примечание:
- Пример 1 соответствует ограничению, где
pipeline (1h) >= tasks (45m) + finally (15m) - Пример 2 показывает, как отключить timeouts, установив все значения в "0"
ServiceAccount
ServiceAccount позволяет указать Kubernetes ServiceAccount, используемый для аутентификации.
Сценарии использования
- Предоставление учётных данных для доступа к private container registries
- Аутентификация у cloud providers
- Авторизация доступа к Kubernetes resources
- Предоставление учётных данных для Git operations
Принципы
ServiceAccounts:
- могут быть заданы на уровне PipelineRun для всех Tasks
- могут быть сопоставлены с конкретными Tasks с помощью taskRunSpecs
- предоставляют учётные данные через Kubernetes secrets
- обеспечивают безопасный доступ к внешним ресурсам
Пример конфигурации
Pod Template
Pod Template позволяет указать Pod template, который будет использоваться как основа для конфигурации Pod, выполняющего каждую Task.
Для получения дополнительной информации о Pod Templates см. Pod Templates.
Сценарии использования
- Настройка node selectors для специальных аппаратных требований
- Конфигурирование tolerations для dedicated nodes
- Указание security contexts для повышения безопасности
- Задание limits и requests ресурсов на уровне Pod
- Конфигурирование правил affinity для лучшего использования ресурсов
- Добавление пользовательских annotations или labels к Pods
Принципы
Pod Templates:
- применяются ко всем Tasks в PipelineRun, если не переопределены через taskRunSpecs
- соответствуют спецификациям Kubernetes Pod template
- могут быть переопределены Task-specific конфигурациями в taskRunSpecs
- обеспечивают единообразную конфигурацию Pod для всех Tasks в PipelineRun
- поддерживают все стандартные поля Kubernetes Pod template
Пример конфигурации
TaskRunSpecs
TaskRunSpecs позволяют настраивать конфигурации отдельных TaskRun внутри PipelineRun, задавая список PipelineTaskRunSpec, который позволяет устанавливать ServiceAccountName, Pod template, computeResources и Metadata для каждой task.
Сценарии использования
- Применение разных ServiceAccounts к разным Tasks для тонкой настройки контроля доступа
- Задание Task-specific Pod templates для разных требований к ресурсам или безопасности
- Конфигурирование Task-specific metadata для лучшей организации и отслеживания
- Переопределение глобальных настроек PipelineRun для конкретных Tasks
- Применение разных compute resources или node selectors к разным этапам Pipeline
Принципы
TaskRunSpecs:
- переопределяют Pod template, заданный для всего Pipeline
- позволяют тонко управлять средами выполнения Task
- могут использоваться для удовлетворения конкретных требований безопасности, ресурсов или планирования
- обеспечивают разные конфигурации для разных этапов Pipeline
- поддерживают все стандартные спецификации Kubernetes Pod template
- могут комбинироваться с глобальными конфигурациями PipelineRun
Поля конфигурации
Каждый TaskRunSpec поддерживает следующие поля:
- pipelineTaskName: имя Pipeline task, к которой применяется конфигурация
- serviceAccountName: ServiceAccount, используемый для этой конкретной Task
- podTemplate: конфигурация Pod template, специфичная для этой Task
- computeResources: требования к вычислительным ресурсам (requests и limits) для этой Task, переопределяющие значения по умолчанию, определённые в spec Task
- metadata: конфигурация metadata для TaskRun
Примеры конфигурации
Пример 1: базовые TaskRunSpecs с ServiceAccount и Pod Template
Пример 2: TaskRunSpecs с расширенной конфигурацией Pod
Пример 3: TaskRunSpecs с конфигурацией Metadata
Пример 4: TaskRunSpecs, переопределяющие глобальный Pod Template
TaskRunSpecs могут переопределять глобальный Pod template, заданный на уровне PipelineRun:
Пример 5: переопределение computeResources для конкретных Tasks
Используйте taskRunSpecs[].computeResources, чтобы назначить разные CPU/memory quotas для отдельных Tasks,
переопределяя любые значения по умолчанию, определённые в spec Task:
computeResources в taskRunSpecs — это Beta feature и требует enable-api-fields: beta (или alpha) в ConfigMap feature flags Tekton. В стандартной установке платформы enable-api-fields уже установлен в beta, поэтому эта функция работает сразу — вам нужно изменять флаг только если он был вручную установлен в stable.
Workspaces
Workspaces позволяют обмениваться данными между Tasks в Pipeline.
Сценарии использования
- Обмен исходным кодом между build и test Tasks
- Передача build artifacts в Tasks развёртывания
- Обмен файлами конфигурации между несколькими Tasks
- Сохранение данных между выполнениями Pipeline
Принципы
Workspaces:
- объявляются в Pipeline и привязываются в PipelineRun
- могут использовать различные типы volumes (PVC, ConfigMap, Secret и т. д.)
- обеспечивают обмен данными без прямых зависимостей
- поддерживают разные режимы доступа (ReadOnly, ReadWrite)
Пример конфигурации
Управление состоянием PipelineRun
Мониторинг состояния выполнения
Поле status в PipelineRun предоставляет подробную информацию о ходе выполнения:
Отмена PipelineRun
Чтобы отменить выполняющийся PipelineRun, обновите поле spec.status:
Это немедленно завершает все выполняющиеся TaskRuns и не запускает ожидающие Tasks или finally Tasks.
Корректная остановка PipelineRun
Чтобы корректно остановить PipelineRun и позволить выполниться finally Tasks:
Это завершает уже выполняющиеся Tasks, но не запускает новые, за исключением finally Tasks.