• Русский
  • TaskRuns

    TaskRun — это пользовательский ресурс Kubernetes, который создаёт экземпляр Task для выполнения. TaskRuns отвечают за выполнение шагов, определённых в Task, и управление их жизненным циклом, предоставляя возможность запускать Tasks как автономно, так и в составе Pipeline.

    Зачем нужны TaskRuns

    Задачи выполнения в CI/CD

    В системах CI/CD существует несколько задач, связанных с выполнением задач:

    • Отслеживание выполнения: необходимость отслеживать прогресс и статус каждого выполнения задачи
    • Распределение ресурсов: необходимость выделять соответствующие ресурсы для каждой задачи
    • Управление входными и выходными данными: необходимость управлять входами и выходами выполнения задач
    • Обработка ошибок: необходимость обрабатывать сбои и предоставлять информацию для отладки
    • Аудит: необходимость вести учёт всех выполнений задач для целей аудита

    Решение Tekton

    TaskRuns Tekton решают эти задачи следующим образом:

    • Экземпляр выполнения: каждый TaskRun представляет собой одно выполнение Task с конкретными входными данными
    • Отслеживание статуса: TaskRuns отслеживают статус выполнения каждого Step
    • Связывание ресурсов: TaskRuns связывают реальные ресурсы (тома, учётные данные) с требованиями Task
    • Сбор результатов: TaskRuns собирают и сохраняют результаты, полученные от Tasks
    • Интеграция с Kubernetes: TaskRuns используют возможности Kubernetes для управления ресурсами и планирования

    Преимущества

    • Изоляция: каждый TaskRun выполняется независимо, что позволяет параллельно запускать один и тот же Task
    • Отслеживаемость: TaskRuns предоставляют подробную историю выполнения и логи
    • Гибкость: TaskRuns могут переопределять параметры Task и привязки рабочих областей
    • Повторное использование: один и тот же Task можно выполнять с разными входными данными через разные TaskRuns
    • Интеграция: TaskRuns могут запускаться различными системами через Kubernetes API
    • Наблюдаемость: статус и логи TaskRun можно мониторить с помощью инструментов Kubernetes

    Сценарии использования

    TaskRuns полезны в различных сценариях, включая:

    • Ручной запуск задач: выполнение Task по запросу для тестирования или отладки
    • Плановые операции: запуск Tasks по расписанию для обслуживания
    • Событийный запуск: запуск Tasks в ответ на внешние события
    • Компоненты Pipeline: выполнение Tasks в составе более крупного Pipeline
    • CI/CD операции: сборка, тестирование и деплой приложений

    Ограничения и лимиты

    • TaskRuns выполняются на одном узле Kubernetes и не могут охватывать несколько узлов
    • После запуска параметры TaskRun изменить нельзя
    • TaskRuns имеют ограниченные возможности повторных попыток для неудачных Steps
    • Время выполнения TaskRun ограничено таймаутом pod Kubernetes
    • TaskRuns нельзя приостанавливать после начала выполнения

    Принципы

    Модель выполнения TaskRun

    При создании TaskRun:

    1. Tekton проверяет спецификацию TaskRun
    2. Kubernetes создаёт Pod для TaskRun
    3. Каждый Step из Task становится контейнером в Pod
    4. Tekton внедряет бинарный entrypoint в каждый контейнер Step
    5. Steps выполняются последовательно в порядке, заданном в Task
    6. Статус TaskRun обновляется по мере завершения каждого Step
    7. Результаты собираются и сохраняются в статусе TaskRun
    8. Pod завершается после выполнения всех Steps или при ошибке

    Статус TaskRun

    Статус TaskRun содержит подробную информацию о выполнении:

    1. Общий статус (Running, Succeeded, Failed и т.д.)
    2. Время начала и завершения
    3. Статусы отдельных Steps
    4. Результаты Task
    5. Причина ошибки (если применимо)
    6. Имя Pod для доступа к логам

    Примеры конфигураций

    Простой пример TaskRun

    apiVersion: tekton.dev/v1
    kind: TaskRun
    metadata:
      name: build-app-run
    spec:
      taskRef:
        name: build-app
      params:
        - name: image
          value: my-registry/my-app:latest
      workspaces:
        - name: source
          persistentVolumeClaim:
            claimName: app-source-pvc

    TaskRun с встроенным определением Task

    apiVersion: tekton.dev/v1
    kind: TaskRun
    metadata:
      name: print-message-run
    spec:
      taskSpec:
        params:
          - name: message
            type: string
        steps:
          - name: print
            image: ubuntu
            script: |
              echo "$(params.message)"
      params:
        - name: message
          value: "Hello, Tekton!"

    Важные параметры

    Таймаут

    Таймаут позволяет задать максимальную продолжительность выполнения TaskRun.

    Сценарии использования

    • Предотвращение бесконечного потребления ресурсов долгими задачами
    • Обеспечение завершения CI/CD pipeline в разумные сроки
    • Обработка зависших или заблокированных задач

    Принципы

    Таймауты:

    • Задаются в спецификации TaskRun
    • Применяются ко всему выполнению TaskRun
    • Отсчитываются с начала первого Step до завершения последнего
    • Приводят к ошибке TaskRun при превышении

    Пример конфигурации

    apiVersion: tekton.dev/v1
    kind: TaskRun
    metadata:
      name: build-with-timeout
    spec:
      taskRef:
        name: build-app
      timeout: "10m"
      params:
        - name: image
          value: my-registry/my-app:latest

    Ограничения ресурсов

    Ограничения ресурсов позволяют задать требования и лимиты по вычислительным ресурсам для выполнения TaskRun. Поле computeResources в спецификации TaskRun даёт возможность контролировать выделение CPU и памяти для Pod, который выполняет шаги TaskRun.

    Сценарии использования

    • Управление ресурсами: справедливое распределение ресурсов между TaskRuns
    • Контроль затрат: предотвращение чрезмерного потребления ресурсов
    • Производительность: оптимизация выделения ресурсов для вычислительно интенсивных операций
    • Стабильность: предотвращение исчерпания ресурсов, влияющего на другие нагрузки

    Принципы

    Ограничения ресурсов:

    • Используют поле computeResources в спецификации TaskRun
    • Включают requests (минимум) и limits (максимум)
    • Применяются ко всем контейнерам в Pod TaskRun
    • Могут быть переопределены в спецификациях отдельных Steps
    • Соответствуют формату спецификации ресурсов Kubernetes

    Примеры конфигураций

    Базовые ограничения ресурсов

    apiVersion: tekton.dev/v1
    kind: TaskRun
    metadata:
      name: build-with-resources
    spec:
      taskRef:
        name: build-app
      computeResources:
        requests:
          memory: "512Mi"
          cpu: "250m"
        limits:
          memory: "1Gi"
          cpu: "500m"

    Шаблон Pod

    Шаблоны Pod позволяют настраивать конфигурацию Kubernetes Pod для TaskRun. Поле podTemplate в спецификации TaskRun предоставляет способ конфигурирования базового Pod, который выполняет шаги TaskRun.

    TIP

    Для получения дополнительной информации о Pod Templates, пожалуйста, обратитесь к Pod Templates.

    Сценарии использования

    • Настройка безопасности: установка security context для запуска контейнеров от имени непривилегированных пользователей
    • Выбор узлов: использование node selectors для планирования Pod на конкретных узлах
    • Толерантности: добавление tolerations для узлов с taints
    • Сервисные аккаунты: настройка пользовательских сервисных аккаунтов для выполнения Pod
    • Конфигурация томов: добавление дополнительных томов или настройка монтирования томов
    • Переменные окружения: установка переменных окружения на уровне Pod
    • Правила affinity: настройка affinity и anti-affinity для Pod

    Принципы

    Шаблоны Pod:

    • Применяются к Pod, создаваемому для TaskRun
    • Могут переопределять стандартные настройки Pod, заданные Tekton
    • Позволяют тонко настраивать среду выполнения Pod
    • Используются для соблюдения требований безопасности, соответствия или ресурсов
    • Поддерживают все стандартные поля спецификации Pod Kubernetes
    • Объединяются с конфигурацией Pod по умолчанию Tekton

    Примеры конфигураций

    Базовый шаблон Pod с security context

    apiVersion: tekton.dev/v1
    kind: TaskRun
    metadata:
      name: build-with-pod-template
    spec:
      taskRef:
        name: build-app
      podTemplate:
        securityContext:
          runAsNonRoot: true
          runAsUser: 1001
          fsGroup: 1001

    Шаблон Pod с node selector и ограничениями ресурсов

    apiVersion: tekton.dev/v1
    kind: TaskRun
    metadata:
      name: build-with-resources
    spec:
      taskRef:
        name: build-app
      computeResources:
        requests:
          memory: "512Mi"
          cpu: "250m"
        limits:
          memory: "1Gi"
          cpu: "500m"
      podTemplate:
        nodeSelector:
          disktype: ssd
          environment: production

    Шаблон Pod с tolerations и affinity

    apiVersion: tekton.dev/v1
    kind: TaskRun
    metadata:
      name: build-with-affinity
    spec:
      taskRef:
        name: build-app
      podTemplate:
        tolerations:
          - key: "dedicated"
            operator: "Equal"
            value: "build"
            effect: "NoSchedule"
        affinity:
          nodeAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
              nodeSelectorTerms:
                - matchExpressions:
                    - key: "kubernetes.io/e2e-az-name"
                      operator: "In"
                      values:
                        - "e2e-az1"
                        - "e2e-az2"

    Шаблон Pod с сервисным аккаунтом и переменными окружения

    apiVersion: tekton.dev/v1
    kind: TaskRun
    metadata:
      name: build-with-env
    spec:
      taskRef:
        name: build-app
      podTemplate:
        serviceAccountName: build-service-account
        env:
          - name: BUILD_ENVIRONMENT
            value: "production"
          - name: LOG_LEVEL
            value: "debug"

    Ссылки