PipelineRuns
PipelineRun — это пользовательский ресурс Kubernetes, который создает экземпляр Pipeline для выполнения. PipelineRuns отвечают за выполнение Tasks, определенных в Pipeline, и управление их жизненным циклом, предоставляя способ запускать end-to-end CI/CD workflows.
Содержание
Зачем нужны 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 и привязки workspaces
- Повторное использование: один и тот же Pipeline можно запускать с разными входными данными через разные PipelineRuns
- Интеграция: PipelineRuns могут запускаться различными системами через Kubernetes API
- Наблюдаемость: состояние и журналы PipelineRun можно отслеживать с помощью инструментов Kubernetes
Сценарии
PipelineRuns полезны в различных сценариях, включая:
- CI/CD приложений: сборка, тестирование и развертывание приложений
- Infrastructure as Code: подготовка и управление инфраструктурой
- Управление релизами: координация сложных процессов выпуска
- Запланированные workflow: запуск workflow по расписанию
- Event-driven workflow: запуск workflow в ответ на внешние события
Ограничения и лимиты
- PipelineRuns выполняются в одном кластере Kubernetes
- После запуска параметры PipelineRun нельзя изменить
- PipelineRuns имеют ограниченные возможности повторных попыток для сбойных Tasks
- Время выполнения PipelineRun ограничено таймаутами Pod Kubernetes
- 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
- Результаты Tasks
- Причина сбоя (если применимо)
- Имена TaskRun для доступа к журналам
Примеры конфигурации
Базовый пример PipelineRun
PipelineRun со встроенным определением Pipeline
Важные параметры
Timeout
Timeout позволяет задать максимальную длительность выполнения PipelineRun.
Сценарии использования
- Предотвращение бесконечного потребления ресурсов долго выполняющимися Pipelines
- Обеспечение завершения CI/CD workflow в разумные сроки
- Обработка зависших или взаимоблокированных 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, используемый для аутентификации.
Сценарии использования
- Предоставление учетных данных для доступа к частным container registries
- Аутентификация у cloud providers
- Авторизация доступа к ресурсам Kubernetes
- Предоставление учетных данных для Git operations
Принципы
ServiceAccounts:
- Могут задаваться на уровне PipelineRun для всех Tasks
- Могут сопоставляться с конкретными Tasks с помощью taskRunSpecs
- Предоставляют учетные данные через Kubernetes secrets
- Обеспечивают безопасный доступ к внешним ресурсам
Пример конфигурации
Pod Template
Pod Template позволяет указать Pod template, который будет использоваться как основа для конфигурации Pod, выполняющего каждый Task.
Дополнительную информацию о Pod Templates см. в разделе Pod Templates.
Сценарии использования
- Задание node selectors для конкретных аппаратных требований
- Настройка tolerations для выделенных nodes
- Указание security contexts для повышения безопасности
- Задание ограничений и запросов ресурсов на уровне Pod
- Настройка правил affinity для более эффективного использования ресурсов
- Добавление пользовательских annotations или labels к Pods
Принципы
Pod Templates:
- Применяются ко всем Tasks в PipelineRun, если не переопределены через taskRunSpecs
- Соответствуют спецификации Pod template Kubernetes
- Могут быть переопределены Task-specific конфигурациями в taskRunSpecs
- Обеспечивают единообразную конфигурацию Pod для всех Tasks в PipelineRun
- Поддерживают все стандартные поля Pod template Kubernetes
Пример конфигурации
TaskRunSpecs
TaskRunSpecs позволяют настраивать отдельные конфигурации TaskRun внутри PipelineRun, указывая список PipelineTaskRunSpec, который позволяет задавать ServiceAccountName, Pod template, computeResources и Metadata для каждого task.
Сценарии использования
- Применение разных ServiceAccount к разным Tasks для точного управления доступом
- Задание Pod templates, специфичных для Task, чтобы удовлетворять различным требованиям к ресурсам или безопасности
- Настройка metadata, специфичной для Task, для лучшей организации и отслеживания
- Переопределение глобальных конфигураций PipelineRun для конкретных Tasks
- Применение разных compute resources или node selectors к разным этапам Pipeline
Принципы
TaskRunSpecs:
- Переопределяют Pod template, заданный для всего Pipeline
- Обеспечивают точный контроль над средами выполнения Task
- Могут использоваться для удовлетворения конкретных требований к безопасности, ресурсам или планированию
- Позволяют использовать разные конфигурации для разных этапов Pipeline
- Поддерживают все стандартные спецификации Pod template Kubernetes
- Могут сочетаться с глобальными конфигурациями PipelineRun
Поля конфигурации
Каждый TaskRunSpec поддерживает следующие поля:
- pipelineTaskName: имя Task pipeline, к которому применяется конфигурация
- serviceAccountName: ServiceAccount, используемый для этого конкретного Task
- podTemplate: конфигурация Pod template, специфичная для этого Task
- computeResources: требования к вычислительным ресурсам (requests и limits) для этого Task, переопределяющие значения по умолчанию, заданные в спецификации 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,
переопределяя любые значения по умолчанию, заданные в спецификации Task:
computeResources в taskRunSpecs — это Beta feature и требует enable-api-fields: beta (или alpha) в ConfigMap feature flags Tekton. В стандартной установке платформы enable-api-fields уже задан как beta, поэтому эта функция работает сразу — вам нужно изменить флаг только в том случае, если он был вручную установлен в stable.
Workspaces
Workspaces позволяют делиться данными между Tasks в Pipeline.
Сценарии использования
- Совместное использование исходного кода между Tasks сборки и тестирования
- Передача артефактов сборки в 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.