· 17 мин чтения

Tekton Pipelines: cloud-native CI/CD для Kubernetes

Меня зовут Семёнов Евгений Сергеевич, директор АйТи Фреш. 15+ лет в администрировании инфраструктур, последние 5 лет — плотная работа с Kubernetes-платформами для клиентов, разрабатывающих собственные продукты. Jenkins и GitLab CI у меня закрыты почти везде, где есть k8s. Их место занял Tekton: родной для Kubernetes, декларативный, GitOps-совместимый. Расскажу, как развернуть и заточить под реальный проект.

Почему Tekton

Tekton — это набор CRD в Kubernetes, которые описывают Task, Pipeline, PipelineRun и триггеры. Каждый step выполняется как контейнер в поде — никаких Docker-in-Docker, Jenkins-агентов, слепых SSH. Линейное масштабирование за счёт кластера, GitOps из коробки, изоляция между сборками через неймспейсы.

Архитектура

КомпонентЧто делает
tekton-pipelines-controllerКонтроллер: создаёт поды для Task и PipelineRun
tekton-pipelines-webhookВалидация CRD
Tekton TriggersEventListener для webhooks
Tekton DashboardВеб-UI для просмотра прогресса
Tekton ChainsПодпись артефактов Sigstore

Установка

kubectl apply -f https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml
kubectl apply -f https://storage.googleapis.com/tekton-releases/triggers/latest/release.yaml
kubectl apply -f https://storage.googleapis.com/tekton-releases/triggers/latest/interceptors.yaml
kubectl apply -f https://storage.googleapis.com/tekton-releases/dashboard/latest/release.yaml

kubectl get pods -n tekton-pipelines

Первый Task: git-clone

apiVersion: tekton.dev/v1
kind: Task
metadata:
  name: git-clone
spec:
  params:
    - name: url
    - name: revision
      default: main
  workspaces:
    - name: output
  steps:
    - name: clone
      image: alpine/git:latest
      script: |
        git clone $(params.url) $(workspaces.output.path)
        cd $(workspaces.output.path)
        git checkout $(params.revision)

Task для сборки Docker-образа через Kaniko

apiVersion: tekton.dev/v1
kind: Task
metadata:
  name: kaniko-build
spec:
  params:
    - name: image
    - name: dockerfile
      default: Dockerfile
  workspaces:
    - name: source
    - name: dockerconfig
  steps:
    - name: build
      image: gcr.io/kaniko-project/executor:latest
      args:
        - --dockerfile=$(workspaces.source.path)/$(params.dockerfile)
        - --context=$(workspaces.source.path)
        - --destination=$(params.image)
        - --cache=true
      volumeMounts:
        - name: docker-config
          mountPath: /kaniko/.docker
      env:
        - name: DOCKER_CONFIG
          value: /kaniko/.docker
  volumes:
    - name: docker-config
      secret:
        secretName: harbor-credentials

Сборка в Pipeline

apiVersion: tekton.dev/v1
kind: Pipeline
metadata:
  name: build-and-deploy
spec:
  params:
    - name: repo-url
    - name: revision
      default: main
    - name: image
  workspaces:
    - name: shared
    - name: docker-credentials
  tasks:
    - name: clone
      taskRef: { name: git-clone }
      params:
        - { name: url,      value: $(params.repo-url) }
        - { name: revision, value: $(params.revision) }
      workspaces:
        - { name: output, workspace: shared }
    - name: test
      runAfter: [ clone ]
      taskRef: { name: go-test }
      workspaces:
        - { name: source, workspace: shared }
    - name: build
      runAfter: [ test ]
      taskRef: { name: kaniko-build }
      params:
        - { name: image, value: $(params.image) }
      workspaces:
        - { name: source,       workspace: shared }
        - { name: dockerconfig, workspace: docker-credentials }
    - name: deploy
      runAfter: [ build ]
      taskRef: { name: kubectl-apply }

Триггеры из GitHub

apiVersion: triggers.tekton.dev/v1beta1
kind: EventListener
metadata:
  name: github-listener
spec:
  serviceAccountName: tekton-triggers
  triggers:
    - name: github-push
      interceptors:
        - ref: { name: github }
          params:
            - name: secretRef
              value: { secretName: github-webhook, secretKey: token }
            - name: eventTypes
              value: ["push"]
      bindings:
        - ref: github-push-binding
      template:
        ref: github-pipeline-template

На GitHub создаём webhook на https://tekton.corp.itfresh.ru/hooks, секрет, события push — и каждый коммит запускает полный pipeline.

Workspaces и кэш

У нас на практике без кэширования сборка Go-сервиса занимает 8–12 минут, с кэшем — 90 секунд. Я всегда делаю отдельный PVC для зависимостей.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: go-cache
spec:
  accessModes: [ ReadWriteOnce ]
  resources:
    requests:
      storage: 10Gi
  storageClassName: fast-ssd

Мини-кейс: микросервисный стартап

Весной 2025 к нам обратился финтех-стартап: 14 микросервисов на Go, Jenkins-сервер валится каждую неделю, разработчики ждут по полчаса своей очереди. Kubernetes-кластер уже был развёрнут на нашей стойке в дата-центре МТС: 3 ноды Dell с Xeon Platinum 8280, 40G Mellanox interconnect, Rancher. За 6 рабочих дней перенесли все пайплайны на Tekton: git-clone → go-test → kaniko-build → harbor-push → argocd-sync. Среднее время пайплайна упало с 28 до 4,5 минут за счёт параллельных Task и кэширования $GOMODCACHE. Джуны больше не ждут очереди — каждый PR собирается в своём поде. Стоимость миграции — 195 000 руб., окупаемость — 3 месяца против Jenkins-лицензии на Enterprise-фичи.

Интеграция с Harbor и Argo CD

Tekton собирает образ и пушит в Harbor. Далее ArgoCD замечает обновление manifests в Git и раскатывает. GitOps-цикл замкнут.

# Task: обновление тега в values.yaml
- name: update-gitops
  image: alpine/git
  script: |
    git clone $(params.gitops-repo) /tmp/gitops
    cd /tmp/gitops
    yq eval '.image.tag = "$(tasks.build.results.image-tag)"' -i values.yaml
    git add . && git commit -m "bump to $(tasks.build.results.image-tag)"
    git push

Типичные ошибки

Мониторинг

Tekton-контроллер экспортирует метрики в Prometheus: количество активных PipelineRun, время выполнения Task, сбои. Дашборд Grafana поверх этого показывает SLO конвейера. Алерты — через Alertmanager.

Построим Tekton CI/CD под вашу команду

Развёртывание в k8s, шаблоны Task под Go/Java/Node.js, интеграция с GitHub/Harbor/ArgoCD. От 150 000 руб. за полный проект.

Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш

FAQ — частые вопросы о Tekton Pipelines

Чем Tekton отличается от Jenkins?
Tekton живёт в Kubernetes: каждый step — контейнер в поде, масштабирование через кластер, конфигурация через CRD в YAML и Git.
Нужен ли свой Kubernetes-кластер?
Да, Tekton — Kubernetes-native, без кластера не работает.
Есть ли UI у Tekton?
Tekton Dashboard — простой веб-интерфейс для просмотра PipelineRuns.
Как подключить GitHub webhooks?
Через Tekton Triggers: EventListener + TriggerBinding + TriggerTemplate.
Поддерживает ли Tekton кэш между сборками?
Да, через Workspaces с PVC.

Подпишитесь на рассылку ITfresh

Раз в неделю — практические гайды для руководителя IT и сисадмина: безопасность, 1С, миграции, резервные копии, лайфхаки из реальных проектов.

Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.