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 Triggers | EventListener для 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
Типичные ошибки
- Запуск от root. Privileged-поды запрещены PodSecurityStandards. Используйте
securityContext.runAsUser. - Workspaces без ReadWriteMany. Для параллельных Task нужен NFS или Longhorn.
- Плодятся старые PipelineRun. Настраивайте
keep-runs-sinceв tekton-config или cron для очистки. - Секреты в plaintext. Используйте external-secrets + Vault, а не kubectl create secret.
- Dockerfile со sudo. Kaniko не исполняет интерактивно — аккуратно с ENTRYPOINT.
Мониторинг
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.