• Русский
  • Pod Templates

    Pod templates — это поля конфигурации в спецификациях TaskRun и PipelineRun, которые позволяют настраивать конфигурацию Pod для ваших рабочих нагрузок Tekton. Они определяют часть PodSpec, которую Tekton использует для настройки Pod, выполняющих ваши Tasks и Pipelines. Такая конфигурация позволяет настраивать среду выполнения без изменения основных определений Task или Pipeline.

    NOTE

    Важно: Pod templates не являются отдельными ресурсами Kubernetes. Это поля конфигурации внутри спецификаций TaskRun и PipelineRun.

    Зачем нужны Pod Templates

    Проблемы конфигурации Pod

    Системы CI/CD на базе Kubernetes сталкиваются с рядом проблем при конфигурации Pod:

    • Согласованность среды: обеспечение единообразия среды выполнения для всех Tasks
    • Управление ресурсами: указание вычислительных ресурсов, селекторов узлов и предпочтений планирования
    • Безопасность: применение контекстов безопасности и контроля доступа
    • Сеть и хранилище: настройка DNS-политик, томов и доступа к образам

    Решение Tekton

    Pod templates в Tekton решают эти задачи, предоставляя:

    • Повторное использование: определение общих конфигураций для множества TaskRun и PipelineRun
    • Настраиваемость: возможность кастомизации среды выполнения без изменения определений Task/Pipeline
    • Гибкость: поддержка как глобальных, так и специфичных для выполнения конфигураций

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

    • Согласованность: обеспечение единообразной среды выполнения для всех запусков Pipeline
    • Гибкость: переопределение стандартных конфигураций Pod для конкретных случаев
    • Повторное использование: определение конфигураций один раз и применение их к множеству запусков
    • Безопасность: применение политик безопасности и контроля доступа на уровне Pod
    • Управление ресурсами: оптимизация распределения ресурсов и планирования

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

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

    • Ресурсоёмкие задачи: настройка вычислительных ресурсов для задач сборки и тестирования
    • Приложения с повышенными требованиями к безопасности: применение контекстов безопасности и контроля доступа
    • Кластеры с несколькими узлами: использование селекторов узлов и правил affinity для оптимального планирования
    • Доступ к приватным реестрам: настройка секретов для доступа к приватным реестрам образов
    • Требования к сети: кастомизация DNS-политик и сетевых настроек
    • Требования к хранилищу: определение томов и конфигураций хранилища

    Ограничения и ограничения

    • Конфигурация pod template влияет только на конфигурацию Pod, а не на логику Task или Pipeline
    • Некоторые поля могут быть переопределены внутренними требованиями Tekton
    • Глобальные конфигурации объединяются с конфигурациями, специфичными для выполнения
    • Pod affinity assistant поддерживает только подмножество полей конфигурации pod template
    • Конфигурация pod template не может изменять основную функциональность или поведение Tekton

    Принципы

    Обработка Pod Template

    При указании конфигурации pod template:

    1. Tekton валидирует конфигурацию pod template
    2. Конфигурация объединяется с глобальной конфигурацией pod template (если есть)
    3. Для PipelineRun конфигурация применяется ко всем TaskRun, если не переопределена в taskRunSpecs
    4. Для TaskRun конфигурация применяется непосредственно к Pod
    5. Tekton создаёт Pod с объединённой конфигурацией
    6. Pod выполняет шаги Task или Pipeline с указанной конфигурацией

    Стратегия объединения конфигураций

    Конфигурации pod template объединяются по определённым правилам с чёткой иерархией приоритетов:

    Порядок приоритетов

    Конфигурации pod template объединяются в следующем порядке приоритетов (от высокого к низкому):

    1. PipelineRun taskRunSpecs podTemplate (высший приоритет) — конфигурации pod template, указанные в taskRunSpecs для конкретных задач внутри PipelineRun
    2. PipelineRun podTemplate (средний приоритет) — конфигурации pod template, указанные на уровне PipelineRun
    3. Глобальный default-pod-template (низший приоритет) — глобальные конфигурации pod template, определённые в ConfigMap или TektonConfig

    Если для одного и того же поля существуют несколько конфигураций, применяется конфигурация с более высоким приоритетом.

    Правила объединения

    • Переменные окружения (env): объединяются по имени в элементах массива. Если имена совпадают, используется элемент из TaskRun или PipelineRun
    • Тома (volumes): объединяются по имени в элементах массива. Если имена совпадают, используется элемент из TaskRun или PipelineRun
    • Другие поля: если поле присутствует в нескольких конфигурациях, приоритет имеет конфигурация с более высоким приоритетом

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

    Базовая конфигурация Pod Template для TaskRun

    apiVersion: tekton.dev/v1
    kind: TaskRun
    metadata:
      name: build-with-pod-template
    spec:
      taskRef:
        name: build-task
      podTemplate:
        nodeSelector:
          disktype: ssd
        tolerations:
        - key: "dedicated"
          operator: "Equal"
          value: "build"
          effect: "NoSchedule"
        securityContext:
          runAsUser: 1000
          runAsGroup: 1000
          fsGroup: 1000
        volumes:
        - name: cache-volume
          emptyDir: {}

    Конфигурация Pod Template для PipelineRun

    apiVersion: tekton.dev/v1
    kind: PipelineRun
    metadata:
      name: build-deploy-with-pod-template
    spec:
      pipelineRef:
        name: build-deploy-pipeline
      podTemplate:
        nodeSelector:
          environment: production
        affinity:
          nodeAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
              nodeSelectorTerms:
              - matchExpressions:
                - key: kubernetes.io/os
                  operator: In
                  values:
                  - linux
        securityContext:
          runAsNonRoot: true
          runAsUser: 1000
        imagePullSecrets:
        - name: registry-secret
        env:
        - name: BUILD_ENV
          value: "production"

    Глобальная конфигурация Pod Template

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: config-defaults
      namespace: tekton-pipelines
    data:
      default-pod-template: |
        nodeSelector:
          workload: tekton
        tolerations:
        - key: "workload"
          operator: "Equal"
          value: "tekton"
          effect: "NoSchedule"
        securityContext:
          fsGroup: 65532
          fsGroupChangePolicy: "OnRootMismatch"
        imagePullSecrets:
        - name: default-registry-secret
    NOTE

    Если необходимо сохранить эту глобальную конфигурацию, рекомендуется использовать TektonConfig вместо ConfigMap.

    apiVersion: operator.tekton.dev/v1alpha1
    kind: TektonConfig
    metadata:
      name: config
    spec:
      pipeline:
        default-pod-template: |
          securityContext:
            fsGroup: 65532
            fsGroupChangePolicy: "OnRootMismatch"

    TaskRunSpecs с конфигурацией Pod Template

    Конфигурации pod template могут применяться к конкретным задачам внутри PipelineRun с помощью TaskRunSpecs.

    apiVersion: tekton.dev/v1
    kind: PipelineRun
    metadata:
      name: build-deploy-with-specific-templates
    spec:
      pipelineRef:
        name: build-deploy-pipeline
      podTemplate:
        # Глобальная конфигурация pod template для всех задач в pipeline
        # Эта конфигурация будет применена ко всем задачам, если не переопределена в taskRunSpecs
        nodeSelector:
          environment: production
        securityContext:
          runAsUser: 0
      taskRunSpecs:
      - pipelineTaskName: build
        podTemplate:
          # Конфигурация pod template для конкретной задачи
          # Эта конфигурация переопределяет глобальную podTemplate для задачи 'build'
          nodeSelector:
            disktype: ssd
          tolerations:
          - key: "dedicated"
            operator: "Equal"
            value: "build"
            effect: "NoSchedule"
      - pipelineTaskName: deploy
        podTemplate:
          # Конфигурация pod template для конкретной задачи
          # Эта конфигурация переопределяет глобальную podTemplate для задачи 'deploy'
          nodeSelector:
            environment: production
          securityContext:
            runAsNonRoot: true
            runAsUser: 1000

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

    Поддерживаемые поля

    Конфигурация pod template поддерживает поля, перечисленные в таблице ниже.

    ПолеОписание
    envПеременные окружения, определённые в pod template на уровне TaskRun и PipelineRun, имеют приоритет над переменными, определёнными в steps и stepTemplate
    nodeSelectorДолжен быть true для подходящего узла для Pod.
    tolerationsПозволяет (но не требует) планировать Pods на узлах с соответствующими taints.
    affinityПозволяет ограничить набор узлов, на которых может быть запланирован Pod, на основе меток узла.
    securityContextОпределяет атрибуты безопасности на уровне Pod и общие настройки контейнеров, такие как runAsUser и selinux.
    volumesОпределяет список томов, которые контейнеры внутри Pod могут монтировать. Позволяет указать тип тома для каждого volumeMount в Task.
    runtimeClassNameОпределяет runtime class для Pod.
    automountServiceAccountTokenПо умолчанию: true. Определяет, предоставляет ли Tekton автоматически токен сервисного аккаунта, используемого Pod, внутри контейнеров по предопределённому пути.
    dnsPolicyПо умолчанию: ClusterFirst. Определяет DNS-политику для Pod. Допустимые значения: ClusterFirst, Default и None. Не поддерживает ClusterFirstWithHostNet, так как Pods Tekton не могут работать с сетевым пространством хоста.
    dnsConfigОпределяет дополнительную DNS-конфигурацию для Pod, такую как серверы имён и поисковые домены.
    enableServiceLinksПо умолчанию: true. Определяет, будут ли сервисы в namespace Pod доступны как переменные окружения для Pod.
    priorityClassNameОпределяет класс приоритета для Pod. Позволяет избирательно включать вытеснение для рабочих нагрузок с низким приоритетом.
    schedulerNameОпределяет планировщик, который используется при диспетчеризации Pod. Можно указать разные планировщики для разных типов рабочих нагрузок, например volcano.sh для задач машинного обучения.
    imagePullSecretsОпределяет секрет, используемый при загрузке образа контейнера.
    hostNetworkПо умолчанию: false. Определяет, использовать ли сетевое пространство хоста.
    hostAliasesДобавляет записи в /etc/hosts Pod для переопределения имён хостов на уровне Pod. Подробнее см. документацию Kubernetes по этому полю.
    topologySpreadConstraintsОпределяет, как Pods распределяются по кластерам среди топологических доменов.

    Выбор узла и планирование

    nodeSelector

    Определяет метки узлов, которые должны присутствовать для планирования Pod.

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

    • Обеспечение запуска Pods на определённых типах узлов (SSD, GPU и т.д.)
    • Маршрутизация рабочих нагрузок на выделенную инфраструктуру
    • Оптимизация использования ресурсов

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

    podTemplate:
      nodeSelector:
        disktype: ssd
        environment: production

    affinity

    Позволяет тонко настраивать планирование Pod на основе меток узлов.

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

    • Предпочтение узлов с определёнными характеристиками
    • Избегание определённых типов узлов
    • Балансировка распределения нагрузки

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

    podTemplate:
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              - key: kubernetes.io/arch
                operator: In
                values:
                - amd64

    tolerations

    Позволяет планировать Pods на узлах с соответствующими taints.

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

    • Планирование Pods на выделенных или специализированных узлах
    • Обработка сценариев обслуживания узлов
    • Оптимизация распределения ресурсов

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

    podTemplate:
      tolerations:
      - key: "dedicated"
        operator: "Equal"
        value: "build"
        effect: "NoSchedule"

    Конфигурация безопасности

    securityContext

    Определяет атрибуты безопасности на уровне Pod и общие настройки контейнеров.

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

    • Запуск контейнеров от имени непривилегированных пользователей
    • Установка владельца группы файловой системы
    • Настройка SELinux
    • Применение политик безопасности

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

    podTemplate:
      securityContext:
        runAsNonRoot: true
        runAsUser: 1000
        runAsGroup: 1000
        fsGroup: 1000
        seccompProfile:
          type: RuntimeDefault

    Управление ресурсами и томами

    volumes

    Определяет тома, которые контейнеры внутри Pod могут монтировать.

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

    • Совместное использование данных между шагами
    • Монтирование конфигурационных файлов
    • Обеспечение постоянного хранилища
    • Доступ к секретам и configMap

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

    podTemplate:
      volumes:
      - name: shared-data
        emptyDir: {}
      - name: config-volume
        configMap:
          name: app-config
      - name: secret-volume
        secret:
          secretName: app-secrets

    Сетевая конфигурация

    dnsPolicy

    Определяет DNS-политику для Pod.

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

    • Настройка пользовательского разрешения DNS
    • Обеспечение требований к сетевой изоляции
    • Оптимизация сетевой производительности

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

    podTemplate:
      dnsPolicy: ClusterFirst
      dnsConfig:
        nameservers:
        - 8.8.8.8
        - 8.8.4.4
        searches:
        - default.svc.cluster.local
        - svc.cluster.local

    Определяет, будут ли сервисы в namespace Pod доступны как переменные окружения.

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

    • Контроль поведения обнаружения сервисов
    • Оптимизация использования переменных окружения
    • Поддержка требований устаревших приложений

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

    podTemplate:
      enableServiceLinks: false

    Конфигурация доступа к образам

    imagePullSecrets

    Определяет секреты, используемые при загрузке образов контейнеров.

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

    • Доступ к приватным реестрам контейнеров
    • Обработка аутентификации в реестрах
    • Поддержка корпоративных конфигураций реестров

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

    podTemplate:
      imagePullSecrets:
      - name: private-registry-secret
      - name: enterprise-registry-secret

    Примечание: При настройке imagePullSecrets и отсутствии команды в Task, Tekton автоматически определит точку входа образа, используя указанные секреты.

    Переменные окружения

    env

    Определяет переменные окружения для Pod.

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

    • Установка переменных среды сборки
    • Настройка параметров приложения
    • Передача конфигурационных данных в контейнеры

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

    podTemplate:
      env:
      - name: BUILD_ENV
        value: "production"
      - name: DEBUG_LEVEL
        value: "info"
      - name: API_ENDPOINT
        valueFrom:
          configMapKeyRef:
            name: app-config
            key: api-endpoint

    Лучшие практики

    Организация конфигурации

    • Глобальные конфигурации: использовать для общих настроек для всех запусков
    • Конфигурации, специфичные для выполнения: использовать для уникальных требований или переопределений
    • Конфигурации для конкретных задач: использовать TaskRunSpecs для тонкого контроля

    Вопросы безопасности

    • Всегда по возможности запускать контейнеры от имени непривилегированных пользователей
    • Использовать соответствующие контексты безопасности
    • Настраивать image pull secrets для приватных реестров
    • Применять принципы минимальных привилегий

    Оптимизация ресурсов

    • Использовать node selectors для маршрутизации рабочих нагрузок на подходящие узлы
    • Настраивать tolerations для специализированной инфраструктуры
    • Устанавливать адекватные лимиты и запросы ресурсов
    • Оптимизировать конфигурации томов для производительности

    Обслуживание

    • Поддерживать конфигурации простыми и сфокусированными
    • Документировать цели и требования конфигураций
    • Использовать систему контроля версий для конфигураций
    • Тестировать изменения конфигураций в непроизводственных средах

    Ссылки