Что такое Tekton?

Tekton — это open-source, cloud-native фреймворк для создания CI/CD систем в Kubernetes. Он предоставляет Kubernetes-native ресурсы для декларативного описания пайплайнов сборки, тестирования и развертывания.

Основные компоненты Tekton

  • Tasks — отдельные шаги пайплайна
  • Pipelines — последовательности задач
  • TaskRuns — исполнения отдельных задач
  • PipelineRuns — исполнения пайплайнов
  • Triggers — автоматический запуск пайплайнов
  • Results — передача данных между задачами
  • Workspaces — общие файловые системы

Установка Tekton

 1# Установка Tekton Pipelines
 2kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml
 3
 4# Установка Tekton Triggers
 5kubectl apply --filename https://storage.googleapis.com/tekton-releases/triggers/latest/release.yaml
 6
 7# Установка Tekton Dashboard
 8kubectl apply --filename https://storage.googleapis.com/tekton-releases/dashboard/latest/tekton-dashboard-release.yaml
 9
10# Проверка установки
11kubectl get pods --namespace tekton-pipelines
12
13# Port forwarding для доступа к Dashboard
14kubectl port-forward -n tekton-pipelines service/tekton-dashboard 9097:9097

Создание Task

 1# python-test-task.yaml
 2apiVersion: tekton.dev/v1beta1
 3kind: Task
 4metadata:
 5  name: python-test
 6spec:
 7  params:
 8    - name: python-version
 9      description: Python version to use
10      default: "3.9"
11    - name: requirements-file
12      description: Requirements file path
13      default: "requirements.txt"
14  workspaces:
15    - name: source
16      description: Source code workspace
17  steps:
18    - name: install-dependencies
19      image: python:$(params.python-version)
20      workingDir: $(workspaces.source.path)
21      script: |
22        #!/usr/bin/env bash
23        pip install --upgrade pip
24        pip install -r $(params.requirements-file)
25        # poetry install (если используется Poetry)
26        
27    - name: run-tests
28      image: python:$(params.python-version)
29      workingDir: $(workspaces.source.path)
30      script: |
31        #!/usr/bin/env bash
32        pytest tests/ --junitxml=test-results.xml --cov=app --cov-report=xml
33      
34    - name: publish-results
35      image: python:$(params.python-version)
36      workingDir: $(workspaces.source.path)
37      script: |
38        #!/usr/bin/env bash
39        echo "Tests completed successfully"
40        # Здесь можно добавить публикацию результатов

Создание Pipeline

 1# python-pipeline.yaml
 2apiVersion: tekton.dev/v1beta1
 3kind: Pipeline
 4metadata:
 5  name: python-ci-pipeline
 6spec:
 7  params:
 8    - name: git-url
 9      description: Git repository URL
10    - name: git-revision
11      description: Git revision
12      default: main
13    - name: image-name
14      description: Docker image name
15  workspaces:
16    - name: shared-data
17      description: Shared workspace
18  tasks:
19    - name: fetch-source
20      taskRef:
21        name: git-clone
22      workspaces:
23        - name: output
24          workspace: shared-data
25      params:
26        - name: url
27          value: $(params.git-url)
28        - name: revision
29          value: $(params.git-revision)
30          
31    - name: run-tests
32      taskRef:
33        name: python-test
34      runAfter:
35        - fetch-source
36      workspaces:
37        - name: source
38          workspace: shared-data
39          
40    - name: build-image
41      taskRef:
42        name: buildah
43      runAfter:
44        - run-tests
45      workspaces:
46        - name: source
47          workspace: shared-data
48      params:
49        - name: IMAGE
50          value: $(params.image-name):$(params.git-revision)
51          
52    - name: deploy
53      taskRef:
54        name: kubernetes-actions
55      runAfter:
56        - build-image
57      params:
58        - name: script
59          value: |
60            kubectl set image deployment/myapp myapp=$(params.image-name):$(params.git-revision)
61            kubectl rollout status deployment/myapp

Запуск PipelineRun

 1# pipelinerun.yaml
 2apiVersion: tekton.dev/v1beta1
 3kind: PipelineRun
 4metadata:
 5  name: python-pipeline-run
 6spec:
 7  pipelineRef:
 8    name: python-ci-pipeline
 9  params:
10    - name: git-url
11      value: https://github.com/user/repo.git
12    - name: git-revision
13      value: main
14    - name: image-name
15      value: myregistry/myapp
16  workspaces:
17    - name: shared-data
18      volumeClaimTemplate:
19        spec:
20          accessModes:
21            - ReadWriteOnce
22          resources:
23            requests:
24              storage: 1Gi

Tekton Triggers для автоматизации

 1# eventlistener.yaml
 2apiVersion: triggers.tekton.dev/v1beta1
 3kind: EventListener
 4metadata:
 5  name: github-listener
 6spec:
 7  serviceAccountName: tekton-triggers-sa
 8  triggers:
 9    - name: github-push
10      interceptors:
11        - github:
12            secretRef:
13              secretName: github-secret
14              secretKey: secretToken
15            eventTypes:
16              - push
17      bindings:
18        - ref: github-push-binding
19      template:
20        ref: github-push-template
21
22---
23apiVersion: triggers.tekton.dev/v1beta1
24kind: TriggerBinding
25metadata:
26  name: github-push-binding
27spec:
28  params:
29    - name: git-url
30      value: $(body.repository.clone_url)
31    - name: git-revision
32      value: $(body.head_commit.id)
33
34---
35apiVersion: triggers.tekton.dev/v1beta1
36kind: TriggerTemplate
37metadata:
38  name: github-push-template
39spec:
40  params:
41    - name: git-url
42    - name: git-revision
43  resourcetemplates:
44    - apiVersion: tekton.dev/v1beta1
45      kind: PipelineRun
46      metadata:
47        generateName: python-pipeline-run-
48      spec:
49        pipelineRef:
50          name: python-ci-pipeline
51        params:
52          - name: git-url
53            value: $(tt.params.git-url)
54          - name: git-revision
55            value: $(tt.params.git-revision)

Когда использовать Tekton

  • Работаешь в Kubernetes окружении
  • Нужна cloud-native CI/CD система
  • Важна стандартизация и переносимость
  • Команда предпочитает Kubernetes-native подход
  • Требуется интеграция с Kubernetes экосистемой
  • Нужна гибкость в создании custom пайплайнов

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

  • Kubernetes-native — полная интеграция с Kubernetes
  • Vendor agnostic — не привязан к конкретному провайдеру
  • Reusable — переиспользуемые задачи и пайплайны
  • Declarative — декларативное описание пайплайнов
  • Extensible — легко расширяется custom задачами
  • Open Source — полностью открытый исходный код

Альтернативы Tekton

  • Argo Workflows — другой Kubernetes-native инструмент
  • Jenkins X — GitOps для Jenkins
  • GitLab CI/CD — с Kubernetes executor
  • GitHub Actions — с self-hosted runners в K8s
  • Flux — для GitOps подхода

Best Practices

  • Создавай переиспользуемые Task'и
  • Используй Workspaces для передачи данных
  • Настрой proper RBAC для безопасности
  • Мониторь ресурсы Kubernetes
  • Используй Triggers для автоматизации
  • Версионируй свои Task'и и Pipeline'ы

FAQ

Подходит ли Tekton для продакшена?

Да, Tekton используется в production многими компаниями. Это проект CNCF с активным развитием и поддержкой сообщества.

Какие требования к инфраструктуре?

Tekton требует Kubernetes кластер версии 1.24+. Ресурсы зависят от нагрузки, но минимально нужно несколько сотен MB RAM.

Сложно ли мигрировать на Tekton?

Миграция требует переписывания пайплайнов в Kubernetes-native формат, но есть инструменты для автоматизации миграции с других платформ.