Tekton: cloud-native CI/CD пайплайны в Kubernetes

Tekton: CI/CD нативный для Kubernetes

Tekton — open-source фреймворк для построения CI/CD пайплайнов, работающий непосредственно в Kubernetes как набор CRD (Custom Resource Definitions). В отличие от Jenkins или GitLab CI, которые запускают задачи в контейнерах поверх Kubernetes, Tekton является нативным компонентом кластера.

Основные концепции Tekton:

  • Step — отдельная команда, выполняемая в контейнере
  • Task — набор Steps, выполняемых последовательно в одном Pod
  • Pipeline — набор Tasks, выполняемых параллельно или последовательно
  • PipelineRun — конкретный запуск Pipeline с параметрами
  • Trigger — автоматический запуск Pipeline по событию (webhook)
  • Workspace — общее хранилище данных между Tasks

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

  • Каждый шаг — отдельный контейнер с изоляцией
  • Декларативное описание пайплайнов в YAML
  • Масштабирование средствами Kubernetes
  • Каталог готовых Tasks (Tekton Hub)
  • Интеграция с любым Git-провайдером через Triggers

Установка Tekton в кластер Kubernetes

Tekton состоит из нескольких компонентов. Устанавливаем последовательно:

# Tekton Pipelines (ядро)
kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml

# Tekton Triggers (запуск по событиям)
kubectl apply --filename https://storage.googleapis.com/tekton-releases/triggers/latest/release.yaml
kubectl apply --filename https://storage.googleapis.com/tekton-releases/triggers/latest/interceptors.yaml

# Tekton Dashboard (веб-интерфейс)
kubectl apply --filename https://storage.googleapis.com/tekton-releases/dashboard/latest/release.yaml

Проверяем установку:

kubectl get pods -n tekton-pipelines
kubectl get pods -n tekton-pipelines-resolvers

Устанавливаем CLI-утилиту tkn:

# Linux
curl -LO https://github.com/tektoncd/cli/releases/latest/download/tkn_Linux_x86_64.tar.gz
tar xzf tkn_Linux_x86_64.tar.gz
sudo mv tkn /usr/local/bin/

# Проверка
tkn version

Открываем Dashboard:

kubectl port-forward -n tekton-pipelines svc/tekton-dashboard 9097:9097
# Доступен по http://localhost:9097

Создание Tasks: базовые строительные блоки

Task — основная единица работы в Tekton. Каждая Task выполняется в отдельном Pod. Создадим Task для клонирования Git-репозитория:

apiVersion: tekton.dev/v1
kind: Task
metadata:
  name: git-clone
  namespace: ci
spec:
  params:
    - name: repo-url
      type: string
      description: URL Git-репозитория
    - name: revision
      type: string
      default: main
  workspaces:
    - name: source
      description: Workspace для исходного кода
  steps:
    - name: clone
      image: alpine/git:2.43.0
      script: |
        git clone $(params.repo-url) $(workspaces.source.path)/repo
        cd $(workspaces.source.path)/repo
        git checkout $(params.revision)
        echo "Cloned $(params.repo-url) at $(git rev-parse HEAD)"

Task для сборки Docker-образа с Kaniko (без Docker daemon):

apiVersion: tekton.dev/v1
kind: Task
metadata:
  name: kaniko-build
  namespace: ci
spec:
  params:
    - name: image
      type: string
      description: Полное имя образа с тегом
    - name: dockerfile
      type: string
      default: Dockerfile
  workspaces:
    - name: source
    - name: docker-config
      description: Docker registry credentials
  steps:
    - name: build-push
      image: gcr.io/kaniko-project/executor:latest
      args:
        - --dockerfile=$(params.dockerfile)
        - --context=$(workspaces.source.path)/repo
        - --destination=$(params.image)
        - --cache=true
        - --cache-ttl=24h
      volumeMounts:
        - name: docker-config
          mountPath: /kaniko/.docker/

Task для запуска тестов:

apiVersion: tekton.dev/v1
kind: Task
metadata:
  name: run-tests
  namespace: ci
spec:
  workspaces:
    - name: source
  steps:
    - name: unit-tests
      image: golang:1.22
      workingDir: $(workspaces.source.path)/repo
      script: |
        go test ./... -v -coverprofile=coverage.out
        go tool cover -func=coverage.out
    - name: lint
      image: golangci/golangci-lint:latest
      workingDir: $(workspaces.source.path)/repo
      script: |
        golangci-lint run ./...

Сборка Pipeline из Tasks

Pipeline объединяет Tasks в последовательность с зависимостями. Создаём полный CI/CD пайплайн:

apiVersion: tekton.dev/v1
kind: Pipeline
metadata:
  name: build-deploy
  namespace: ci
spec:
  params:
    - name: repo-url
      type: string
    - name: revision
      type: string
      default: main
    - name: image
      type: string
    - name: namespace
      type: string
      default: production
  workspaces:
    - name: shared-workspace
    - name: docker-credentials
  tasks:
    # 1. Клонирование
    - name: fetch-source
      taskRef:
        name: git-clone
      params:
        - name: repo-url
          value: $(params.repo-url)
        - name: revision
          value: $(params.revision)
      workspaces:
        - name: source
          workspace: shared-workspace

    # 2. Тесты (после клонирования)
    - name: test
      taskRef:
        name: run-tests
      runAfter:
        - fetch-source
      workspaces:
        - name: source
          workspace: shared-workspace

    # 3. Сборка образа (после тестов)
    - name: build-image
      taskRef:
        name: kaniko-build
      runAfter:
        - test
      params:
        - name: image
          value: $(params.image)
      workspaces:
        - name: source
          workspace: shared-workspace
        - name: docker-config
          workspace: docker-credentials

    # 4. Деплой (после сборки)
    - name: deploy
      taskRef:
        name: kubectl-deploy
      runAfter:
        - build-image
      params:
        - name: image
          value: $(params.image)
        - name: namespace
          value: $(params.namespace)

Task для деплоя в Kubernetes:

apiVersion: tekton.dev/v1
kind: Task
metadata:
  name: kubectl-deploy
  namespace: ci
spec:
  params:
    - name: image
      type: string
    - name: namespace
      type: string
  steps:
    - name: deploy
      image: bitnami/kubectl:latest
      script: |
        kubectl set image deployment/myapp \
          myapp=$(params.image) \
          -n $(params.namespace)
        kubectl rollout status deployment/myapp \
          -n $(params.namespace) \
          --timeout=300s

Запуск Pipeline: PipelineRun и Workspaces

PipelineRun — это конкретный запуск Pipeline с заданными параметрами и Workspaces.

apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
  generateName: build-deploy-run-
  namespace: ci
spec:
  pipelineRef:
    name: build-deploy
  params:
    - name: repo-url
      value: https://github.com/company/myapp.git
    - name: revision
      value: main
    - name: image
      value: registry.company.ru/myapp:v1.2.3
    - name: namespace
      value: production
  workspaces:
    - name: shared-workspace
      volumeClaimTemplate:
        spec:
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: 1Gi
          storageClassName: fast-ssd
    - name: docker-credentials
      secret:
        secretName: docker-registry-creds

Создаём секрет для Docker registry:

kubectl create secret docker-registry docker-registry-creds \
  --docker-server=registry.company.ru \
  --docker-username=ci-bot \
  --docker-password='P@ssw0rd' \
  -n ci

Запуск и отслеживание через CLI:

# Запуск
kubectl create -f pipelinerun.yaml

# Или через tkn
tkn pipeline start build-deploy \
  -p repo-url=https://github.com/company/myapp.git \
  -p image=registry.company.ru/myapp:latest \
  -w name=shared-workspace,claimName=ci-workspace \
  -w name=docker-credentials,secret=docker-registry-creds \
  --showlog

# Просмотр логов
tkn pipelinerun logs build-deploy-run-xyz -f

# Список запусков
tkn pipelinerun list

Tekton Triggers: автоматический запуск по webhook

Triggers позволяют автоматически запускать Pipeline при получении webhook от GitHub, GitLab, Bitbucket.

# EventListener — принимает webhook
apiVersion: triggers.tekton.dev/v1beta1
kind: EventListener
metadata:
  name: github-listener
  namespace: ci
spec:
  serviceAccountName: tekton-triggers-sa
  triggers:
    - name: github-push
      interceptors:
        - ref:
            name: github
          params:
            - name: secretRef
              value:
                secretName: github-webhook-secret
                secretKey: token
            - name: eventTypes
              value: ["push"]
      bindings:
        - ref: github-push-binding
      template:
        ref: build-deploy-template

TriggerBinding извлекает данные из webhook:

apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerBinding
metadata:
  name: github-push-binding
  namespace: ci
spec:
  params:
    - name: repo-url
      value: $(body.repository.clone_url)
    - name: revision
      value: $(body.after)
    - name: image
      value: "registry.company.ru/myapp:$(body.after)"

TriggerTemplate создаёт PipelineRun:

apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerTemplate
metadata:
  name: build-deploy-template
  namespace: ci
spec:
  params:
    - name: repo-url
    - name: revision
    - name: image
  resourcetemplates:
    - apiVersion: tekton.dev/v1
      kind: PipelineRun
      metadata:
        generateName: triggered-run-
      spec:
        pipelineRef:
          name: build-deploy
        params:
          - name: repo-url
            value: $(tt.params.repo-url)
          - name: revision
            value: $(tt.params.revision)
          - name: image
            value: $(tt.params.image)
        workspaces:
          - name: shared-workspace
            volumeClaimTemplate:
              spec:
                accessModes: [ReadWriteOnce]
                resources:
                  requests:
                    storage: 1Gi
          - name: docker-credentials
            secret:
              secretName: docker-registry-creds

Expose EventListener через Ingress или LoadBalancer и настройте webhook в GitHub.

Мониторинг и обслуживание

Управление пайплайнами через CLI tkn и очистка старых запусков:

# Статус текущих запусков
tkn pipelinerun list -n ci
tkn taskrun list -n ci

# Логи конкретного запуска
tkn pipelinerun logs build-deploy-run-abc -n ci

# Удаление старых PipelineRun (старше 7 дней)
tkn pipelinerun delete --keep 10 -n ci

# Или через CronJob для автоочистки
apiVersion: batch/v1
kind: CronJob
metadata:
  name: tekton-cleanup
  namespace: ci
spec:
  schedule: "0 3 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          serviceAccountName: tekton-cleanup-sa
          containers:
            - name: cleanup
              image: bitnami/kubectl:latest
              command:
                - /bin/sh
                - -c
                - |
                  kubectl get pipelinerun -n ci \
                    --sort-by=.metadata.creationTimestamp \
                    -o name | head -n -20 | xargs -r kubectl delete -n ci
          restartPolicy: OnFailure

Для мониторинга Tekton экспортирует метрики Prometheus на порту 9090 контроллера. Добавьте ServiceMonitor для автоматического сбора метрик:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: tekton-pipelines
  namespace: tekton-pipelines
spec:
  selector:
    matchLabels:
      app.kubernetes.io/component: controller
  endpoints:
    - port: metrics
      interval: 30s

Часто задаваемые вопросы

Tekton и ArgoCD решают разные задачи. Tekton — это CI/CD-фреймворк для сборки, тестирования и деплоя (CI+CD). ArgoCD — GitOps-контроллер для непрерывной доставки (CD). Идеальная комбинация: Tekton для CI (сборка, тесты, push образа) и ArgoCD для CD (синхронизация манифестов из Git в кластер).

Используйте Kubernetes Secrets, подключаемые как Workspaces или volumeMounts. Для более безопасного хранения интегрируйте HashiCorp Vault через External Secrets Operator или Vault Agent Injector. Никогда не храните секреты в параметрах Pipeline — они видны в логах.

Нет, Tekton работает исключительно в Kubernetes, так как использует CRD и контроллеры Kubernetes для оркестрации. Если Kubernetes недоступен, рассмотрите Jenkins, GitLab CI или GitHub Actions как альтернативы.

В каждом Step можно указать resources.requests и resources.limits. Также используйте LimitRange и ResourceQuota в namespace для глобальных ограничений. Для предотвращения зависания добавляйте timeout на уровне Task и Pipeline: spec.timeouts.pipeline: 1h.

Используйте Tekton Hub — каталог готовых Tasks (git-clone, kaniko, helm-upgrade и другие). Также можно создать собственный каталог в Git-репозитории и подключать Tasks через Tekton Resolvers: taskRef: resolver: git с указанием URL репозитория и пути к Task.

Нужна помощь с настройкой?

Специалисты АйТи Фреш помогут с внедрением и настройкой — 15+ лет опыта, обслуживание от 15 000 ₽/мес

📞 Связаться с нами
#Tekton#CI/CD#Kubernetes#пайплайн#cloud-native#DevOps#автоматизация деплоя#Tekton Pipelines
Комментарии 0

Оставить комментарий

загрузка...