• Русский
  • Workspaces

    Рабочее пространство (Workspace) — это декларация файловой системы, которая требуется Task или Pipeline во время выполнения. Workspaces позволяют задачам объявлять части файловой системы, которые должны быть предоставлены во время выполнения, обеспечивая обмен данными между задачами, постоянное хранение, а также монтирование секретов, конфигураций или общих инструментов.

    Зачем нужны Workspaces

    Традиционные проблемы хранения в CI/CD

    В традиционных системах CI/CD обмен данными между шагами или задачами сталкивается с рядом проблем:

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

    Решение Tekton

    Workspaces в Tekton решают эти проблемы следующим образом:

    • Декларативный подход: задачи объявляют свои потребности в хранилище без указания реализации
    • Привязка во время выполнения: детали хранилища предоставляются во время выполнения, а не жестко прописываются в задачах
    • Гибкая реализация: Workspaces могут быть реализованы с помощью различных типов томов
    • Обмен данными: Workspaces позволяют обмениваться данными между задачами в Pipeline
    • Разделение ответственности: авторы задач определяют потребности в хранилище, пользователи предоставляют фактическое хранилище

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

    • Гибкость: задачи могут работать с разными реализациями хранилища без изменений
    • Повторное использование: задачи можно использовать в разных средах и с разными конфигурациями хранилища
    • Безопасность: конфиденциальные данные можно безопасно предоставлять через соответствующие типы томов
    • Постоянство: данные могут сохраняться между запусками задач с помощью PersistentVolumeClaims
    • Изоляция: каждый TaskRun может иметь собственное изолированное хранилище
    • Общий доступ: несколько задач могут совместно использовать данные через одно Workspace

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

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

    • Доступ к исходному коду: предоставление исходного кода задачам сборки и тестирования
    • Хранение артефактов: сохранение артефактов сборки между задачами
    • Предоставление учетных данных: безопасная передача учетных данных задачам
    • Общий доступ к конфигурациям: обмен файлами конфигурации между задачами
    • Хранение кэша: поддержание кэша зависимостей или артефактов сборки
    • Общие инструменты: предоставление доступа к общим инструментам и утилитам

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

    • Workspaces, основанные на PersistentVolumeClaims с режимом доступа ReadWriteOnce, могут монтироваться только на одном узле одновременно
    • Workspaces, основанные на ConfigMaps или Secrets, ограничены размером 1 МБ
    • Workspaces на базе ConfigMaps или Secrets всегда монтируются только для чтения
    • Workspaces не поддерживают динамическое выделение томов без VolumeClaimTemplate
    • Постоянство данных в Workspace зависит от типа тома

    Принципы

    Объявление Workspace

    При объявлении Workspace:

    1. Задачи указывают имя и необязательные свойства Workspace
    2. Задачи определяют, как Workspace будет использоваться (только для чтения или с возможностью записи)
    3. Задачи могут указать путь монтирования по умолчанию для Workspace
    4. Задачи могут пометить Workspace как необязательное
    5. TaskRuns или PipelineRuns предоставляют фактическую реализацию хранилища

    Привязка Workspace

    При привязке Workspace:

    1. TaskRuns или PipelineRuns указывают источник тома для каждого Workspace
    2. Источниками томов могут быть PersistentVolumeClaims, ConfigMaps, Secrets или другие типы
    3. TaskRuns или PipelineRuns могут указать subPath внутри тома
    4. PipelineRuns определяют, как Workspaces разделяются между задачами

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

    Базовое Workspace в задаче

    apiVersion: tekton.dev/v1
    kind: Task
    metadata:
      name: build
    spec:
      workspaces:
        - name: source
          description: Рабочее пространство, содержащее исходный код
          readOnly: false
      steps:
        - name: build
          image: golang
          workingDir: $(workspaces.source.path)
          script: |
            go build -o app .

    Необязательное Workspace в задаче

    apiVersion: tekton.dev/v1
    kind: Task
    metadata:
      name: lint
    spec:
      workspaces:
        - name: cache
          description: Рабочее пространство для кэширования данных линтера
          optional: true
      steps:
        - name: lint
          image: golangci/golangci-lint
          script: |
            if [ "$(workspaces.cache.bound)" == "true" ]; then
              export GOLANGCI_LINT_CACHE=$(workspaces.cache.path)
            fi
            golangci-lint run ./...

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

    Флаг ReadOnly

    Флаг readOnly указывает, будет ли задача изменять содержимое Workspace.

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

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

    Принципы

    Workspaces с readOnly:

    • Монтируются как тома только для чтения в контейнерах задачи
    • Запрещают задачам запись в Workspace
    • Обеспечивают более безопасный параллельный доступ нескольких задач
    • Могут быть реализованы с помощью томов только для чтения, таких как ConfigMaps и Secrets

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

    apiVersion: tekton.dev/v1
    kind: Task
    metadata:
      name: test
    spec:
      workspaces:
        - name: source
          description: Рабочее пространство, содержащее исходный код
          readOnly: true
      steps:
        - name: test
          image: golang
          workingDir: $(workspaces.source.path)
          script: |
            go test ./...

    Флаг Optional

    Флаг optional указывает, что Workspace не обязателен для выполнения задачи.

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

    • Предоставление необязательного кэша для повышения производительности
    • Поддержка необязательной инъекции учетных данных
    • Повышение гибкости задач в разных средах
    • Позволяет задачам адаптироваться к наличию или отсутствию определенных данных

    Принципы

    Optional Workspaces:

    • Не обязательно предоставлять в TaskRun
    • Задачи должны обрабатывать ситуацию, когда Workspace не предоставлен
    • Задачи могут проверять привязку Workspace с помощью переменной $(workspaces.name.bound)
    • Обеспечивают более гибкие и повторно используемые задачи

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

    apiVersion: tekton.dev/v1
    kind: Task
    metadata:
      name: build-with-cache
    spec:
      workspaces:
        - name: source
          description: Рабочее пространство, содержащее исходный код
        - name: cache
          description: Кэш для артефактов сборки
          optional: true
      steps:
        - name: build
          image: gradle
          workingDir: $(workspaces.source.path)
          script: |
            if [ "$(workspaces.cache.bound)" == "true" ]; then
              gradle build --build-cache --gradle-user-home=$(workspaces.cache.path)
            else
              gradle build
            fi

    Изолированные Workspaces

    Изолированные Workspaces позволяют ограничить доступ к конфиденциальным данным только определённым шагам внутри задачи.

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

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

    Принципы

    Изолированные Workspaces:

    • Монтируются только в тех шагах, которые явно их запрашивают
    • Требуют установки флага enable-api-fields в значение "beta"
    • Обеспечивают более безопасную работу с конфиденциальными данными
    • Могут иметь разные пути монтирования в разных шагах

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

    apiVersion: tekton.dev/v1
    kind: Task
    metadata:
      name: clone-and-build
    spec:
      workspaces:
        - name: source
          description: Рабочее пространство для исходного кода
        - name: ssh-credentials
          description: SSH-учетные данные для операций git
      steps:
        - name: clone
          workspaces:
            - name: ssh-credentials
          image: alpine/git
          script: |
            mkdir -p ~/.ssh
            cp $(workspaces.ssh-credentials.path)/* ~/.ssh/
            chmod 600 ~/.ssh/id_rsa
            git clone ssh://git@github.com:org/repo.git $(workspaces.source.path)
        - name: build
          image: golang
          workingDir: $(workspaces.source.path)
          script: |
            go build -o app .

    Источники томов

    PersistentVolumeClaim

    PersistentVolumeClaims обеспечивают долговременное хранилище, которое может сохраняться дольше, чем TaskRun или PipelineRun.

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

    • Обмен данными между задачами в Pipeline
    • Сохранение артефактов сборки между запусками Pipeline
    • Поддержание кэша зависимостей
    • Хранение результатов тестов для последующего анализа

    Принципы

    PersistentVolumeClaims:

    • Обеспечивают долговременное хранилище на базе Kubernetes PersistentVolumes
    • Могут быть предварительно созданными или создаваться из VolumeClaimTemplate
    • Поддерживают различные режимы доступа (ReadWriteOnce, ReadWriteMany, ReadOnlyMany)
    • Могут использоваться совместно несколькими задачами в Pipeline

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

    apiVersion: tekton.dev/v1
    kind: TaskRun
    metadata:
      name: build-with-pvc
    spec:
      taskRef:
        name: build
      workspaces:
        - name: source
          persistentVolumeClaim:
            claimName: my-source-pvc

    EmptyDir

    EmptyDir предоставляет временное хранилище, существующее только в течение жизни TaskRun.

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

    • Временное хранилище для одного TaskRun
    • Обмен данными между шагами в задаче
    • Случаи, когда постоянство не требуется
    • Тестирование и отладка задач

    Принципы

    EmptyDir:

    • Создает временный каталог, существующий только во время TaskRun
    • Автоматически очищается после завершения TaskRun
    • Не может использоваться совместно между разными TaskRun
    • Подходит для задач, которым не нужно сохранять данные

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

    apiVersion: tekton.dev/v1
    kind: TaskRun
    metadata:
      name: build-with-emptydir
    spec:
      taskRef:
        name: build
      workspaces:
        - name: source
          emptyDir: {}

    ConfigMap и Secret

    ConfigMaps и Secrets позволяют внедрять конфигурационные данные и конфиденциальную информацию в задачи.

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

    • Предоставление конфигурационных файлов задачам
    • Внедрение учетных данных для аутентификации
    • Обеспечение настроек, специфичных для окружения
    • Совместное использование небольших объемов данных только для чтения

    Принципы

    ConfigMaps и Secrets:

    • Всегда монтируются как тома только для чтения
    • Ограничены размером 1 МБ
    • Должны существовать до создания TaskRun
    • Подходят для конфигурационных данных и учетных данных

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

    apiVersion: tekton.dev/v1
    kind: TaskRun
    metadata:
      name: deploy-with-config
    spec:
      taskRef:
        name: deploy
      workspaces:
        - name: config
          configMap:
            name: deployment-config
        - name: credentials
          secret:
            secretName: deployment-credentials

    Ссылки