Tekton Results

Tekton Results 是一个高级系统,通过提供持久存储、查询和管理 CI/CD 执行数据的能力,扩展了 Tekton 的功能。本文档深入探讨了 Tekton Results 的工作原理、架构以及如何有效利用其特性。

术语表

术语定义
Result一个顶级资源,将相关的 Records 组合在一起,代表一个逻辑工作单元
Record属于某个 Result 的单个数据实例(TaskRun、PipelineRun、Log)
Watcher一个 Kubernetes 控制器,监控 TaskRuns 和 PipelineRuns 并将其存储到 Results 数据库中
API Server提供访问存储的 Results 和 Records 的 gRPC/REST 服务器
Retention Policy决定数据在 Results 数据库中保留时间的规则

为什么需要 Tekton Results

CI/CD 数据管理的挑战

在传统的基于 Kubernetes 的 CI/CD 系统如 Tekton Pipelines 中,所有执行数据都存储在 Kubernetes API server 的 etcd 数据库中。这种方式存在以下限制:

  • 存储容量有限:etcd 设计用于存储少量配置数据,而非大量执行历史和日志
  • 资源限制:随着 CI/CD 工作负载的积累,可能消耗大量 etcd 资源,影响集群性能
  • 数据分散:相关的 CI/CD 活动(TaskRuns、PipelineRuns)作为独立资源存储,缺乏明确关联
  • 日志管理:日志通常存储在容器运行时或外部日志系统,难以与特定流水线执行关联
  • 数据生命周期:没有内置机制管理已完成 CI/CD 数据的生命周期

随着 CI/CD 使用规模扩大,这些限制会导致性能问题和管理负担。

Tekton Results 如何解决这些挑战

Tekton Results 提供了全面的解决方案:

  1. 卸载数据存储:将已完成的 CI/CD 执行数据从 etcd 移动到专用数据库,针对该用途进行优化
  2. 建立关联关系:通过 Result/Record 数据模型创建相关 CI/CD 活动之间的显式关系
  3. 集中日志存储:将日志与对应的 TaskRuns/PipelineRuns 一起存储
  4. 提供数据生命周期管理:通过保留策略自动管理数据
  5. 支持高级查询:提供比 Kubernetes API 更强大的过滤和查询功能

优势

  • 提升集群性能:通过卸载已完成的 CI/CD 数据,减轻 Kubernetes API server 和 etcd 负载
  • 增强数据组织:将相关 CI/CD 活动分组,提升可视化和管理能力
  • 延长数据保留时间:支持长期存储执行历史,且不影响集群资源
  • 强大查询能力:提供高级过滤和搜索功能
  • 集成日志管理:将日志与执行数据一同存储,完整记录流水线历史
  • 自动清理:通过可配置的保留策略管理数据生命周期

适用场景

Tekton Results 在以下场景中特别有价值:

  1. 高负载 CI/CD 环境:运行大量流水线,产生大量执行数据的组织
  2. 合规需求:需要保留执行历史以满足审计或合规要求的环境
  3. 资源受限集群:etcd 资源有限,需要优化的集群
  4. 高级分析:希望对 CI/CD 执行模式进行分析和报告的团队
  5. 多团队环境:多个团队共享 Tekton 基础设施,需要隔离查看各自 CI/CD 数据的组织

架构与原则

Tekton Results 采用微服务架构,包含三个主要组件协同工作,提供完整解决方案:

API Server 架构

API Server 是核心组件,负责:

  1. 提供数据访问:暴露 gRPC 和 REST 接口,用于存储和检索 Results 和 Records
  2. 管理认证:采用 Kubernetes 风格的认证(服务账户、令牌)
  3. 执行授权:基于 RBAC 实现对 Results 资源的访问控制
  4. 处理数据持久化:与底层数据库(PostgreSQL)交互
  5. 支持过滤:实现 CEL(Common Expression Language)以支持强大查询过滤

API Server 采用父子层级结构:

  • Namespace/workspace 是 Result 的父级
  • Result 是 Record 的父级
  • Record 包含实际执行数据

Watcher 架构

Watcher 作为 Kubernetes 控制器,负责:

  1. 监控资源:监听集群中的 TaskRun 和 PipelineRun 事件
  2. 确定分组:通过注解、标签和所有者引用对相关资源进行分组
  3. 创建/更新 Records:通过 API Server 将执行数据存储到 Results 数据库
  4. 注释资源:向原始 Kubernetes 资源添加 Result 标识符
  5. 管理删除:可选地在数据存储后删除已完成资源

Watcher 使用多种策略分组相关资源:

  • results.tekton.dev/result 注解
  • triggers.tekton.dev/triggers-eventid 标签
  • PipelineRuns 的所有者引用
  • 无分组信息时自动生成新的 Result 名称

保留策略 Agent 架构

保留策略 Agent 负责:

  1. 调度清理:根据配置的计划执行修剪任务
  2. 执行保留策略:删除超过保留期限的数据
  3. 管理数据库大小:防止 Results 数据库无限增长

数据模型详解

Result 结构

一个 Result 包含:

Result
├── metadata
│   ├── name
│   ├── uid
│   ├── createTime
│   ├── updateTime
│   └── annotations (键值对)
└── summary
    ├── type (例如 PIPELINE_RUN、TASK_RUN)
    ├── status (SUCCESS、FAILURE、TIMEOUT、CANCELLED、UNKNOWN)
    ├── startTime
    ├── endTime
    └── annotations (键值对)

Record 结构

一个 Record 包含:

Record
├── name
├── data
│   ├── type (例如 tekton.dev/v1.TaskRun、tekton.dev/v1.PipelineRun、results.tekton.dev/v1alpha3.Log)
│   └── value (序列化数据)
└── createTime

认证与授权

Tekton Results 使用 Kubernetes 风格的认证和 RBAC 进行访问控制:

  1. 认证:使用服务账户令牌、用户模拟等 Kubernetes 认证方法
  2. 授权:基于 RBAC,针对资源(resultsrecords)和操作(getlistcreateupdatedelete)进行控制
  3. 命名空间隔离:针对多租户环境,权限按命名空间范围划分

示例 RBAC 角色:

  • tekton-results-readonly:对 Results 和 Records 的只读访问
  • tekton-results-readwrite:对 Results 和 Records 的读写访问
  • tekton-results-admin:完全访问权限,包括删除 Results 和 Records

高级过滤

Tekton Results 使用 CEL(Common Expression Language)实现强大过滤功能:

# 按 Result 状态过滤
results.tekton.dev/v1alpha2/parents/default/results?filter=summary.status==SUCCESS

# 按创建时间过滤
results.tekton.dev/v1alpha2/parents/default/results?filter=create_time>timestamp('2023-01-01T00:00:00Z')

# 按数据类型过滤 Records
results.tekton.dev/v1alpha2/parents/default/results/123/records?filter=data_type=='tekton.dev/v1.TaskRun'

# 复杂逻辑过滤
results.tekton.dev/v1alpha2/parents/default/results?filter=summary.status==SUCCESS&&create_time>timestamp('2023-01-01T00:00:00Z')

重要参数

Watcher 参数

参数描述默认值用法
completed_run_grace_period资源完成后等待多长时间再删除0(不删除)设置为持续时间(如 24h)以启用自动删除
check_owner删除前是否检查所有者引用false设置为 true 防止删除有所有者引用的资源
store_deadline存储资源的最大等待时间10m对于大型资源或数据库连接较慢时可增加

API Server 参数

参数描述默认值用法
AUTH_IMPERSONATE启用用户模拟false设置为 true 允许服务账户模拟用户
page_size每页最大结果数100根据查询性能和客户端需求调整

保留策略参数

参数描述默认值用法
runAt保留策略任务执行时间0 0 * * *(每日)用于调度清理的 Cron 表达式
maxRetention(已弃用)最大数据保留时间720h(30 天)(已弃用)数据删除前的保留时长
defaultRetention最大数据保留时间720h(30 天)数据删除前的保留时长

参考资料