深入理解 Tekton Results

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

术语表

术语定义
结果一种顶级资源,聚合相关记录,代表一个逻辑工作单元
记录属于某个结果的单个数据实例(TaskRun、PipelineRun、Log)
观察者一个 Kubernetes 控制器,监控 TaskRuns 和 PipelineRuns 并将其存储在 Results 数据库中
API 服务器提供存储结果和记录的访问的 gRPC/REST 服务器
保留策略确定数据在 Results 数据库中保留多长时间的规则

我们为什么需要 Tekton Results

CI/CD 数据管理的挑战

在传统的基于 Kubernetes 的 CI/CD 系统(如 Tekton Pipelines)中,所有执行数据都存储在 Kubernetes API 服务器的 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 所能实现的强大过滤和查询能力

优势

  • 提升集群性能:减少 Kubernetes API 服务器和 etcd 的负载,通过卸载已完成的 CI/CD 数据
  • 增强数据组织:将相关的 CI/CD 活动聚合在一起,以提高可视化和管理效果
  • 更长的数据保留:在不影响集群资源的情况下,支持执行历史的长期存储
  • 强大的查询能力:为 CI/CD 数据提供高级过滤和搜索能力
  • 集成日志管理:将日志与执行数据一起存储,以获得完整的管道历史
  • 自动清理:通过可配置的保留策略管理数据生命周期

适用场景

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

  1. 高容量 CI/CD 环境:运行多个生成大量执行数据的管道的组织
  2. 合规要求:需要维护执行历史以满足审计或合规目的的环境
  3. 资源有限的集群:etcd 资源有限并需要优化的集群
  4. 高级分析:想对 CI/CD 执行模式进行分析和报告的团队
  5. 多团队环境:多个团队共享 Tekton 基础设施且需要隔离其 CI/CD 数据的组织

架构和原则

Tekton Results 遵循微服务架构,具有三个主要组件共同协作以提供完整解决方案:

API 服务器架构

API 服务器是核心组件,负责:

  1. 提供数据访问:公开 gRPC 和 REST 端点用于存储和检索结果及记录
  2. 管理身份验证:使用 Kubernetes 风格的身份验证(服务帐户、令牌)
  3. 实施授权:对结果资源实现基于 RBAC 的访问控制
  4. 处理数据持久性:与底层数据库(PostgreSQL)接口
  5. 支持过滤:实现 CEL(通用表达式语言)以进行强大的查询过滤

API 服务器使用父子层次关系,其中:

  • 命名空间/工作区是结果的父级
  • 结果是记录的父级
  • 记录包含实际的执行数据

观察者架构

观察者作为 Kubernetes 控制器运行,其职责包括:

  1. 监控资源:监听集群中的 TaskRun 和 PipelineRun 事件
  2. 确定分组:使用注释、标签和拥有者引用对相关资源进行分组
  3. 创建/更新记录:通过 API 服务器将执行数据存储在 Results 数据库中
  4. 注释资源:为原始 Kubernetes 资源添加结果标识符
  5. 管理删除:根据需要删除存储在数据库中的已完成资源

观察者使用多种策略对相关资源进行分组:

  • results.tekton.dev/result 注释
  • triggers.tekton.dev/triggers-eventid 标签
  • 与 PipelineRuns 的拥有者引用
  • 当未找到分组信息时自动生成新的结果名称

保留策略代理架构

保留策略代理负责:

  1. 调度清理:根据配置的计划运行修剪作业
  2. 实施保留:删除超出配置保留期的数据
  3. 管理数据库大小:防止 Results 数据库无限增长

数据模型深入

结果结构

结果包含:

Result ├── metadata │ ├── name │ ├── uid │ ├── createTime │ ├── updateTime │ └── annotations (键值对) └── summary ├── type (例如,PIPELINE_RUN,TASK_RUN) ├── status (成功,失败,超时,已取消,未知) ├── startTime ├── endTime └── annotations (键值对)

记录结构

记录包含:

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. 授权:对资源(resultsrecords)及动词(getlistcreateupdatedelete)实施 RBAC
  3. 命名空间隔离:在多租户环境中按命名空间范围限制权限

示例 RBAC 角色:

  • tekton-results-readonly:对结果和记录的只读访问
  • tekton-results-readwrite:对结果和记录的读写访问
  • tekton-results-admin:完全访问,包括删除结果和记录

高级过滤

Tekton Results 使用 CEL(通用表达式语言)实现强大的过滤能力:

# 按结果状态过滤 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') # 根据数据类型过滤记录 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')

重要参数

观察者参数

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

API 服务器参数

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

保留策略参数

参数描述默认用法
runAt何时运行保留策略作业0 0 * * *(每日)用于调度清理的 Cron 表达式
maxRetention保留数据的最长时间720h(30 天)保留数据的持续时间

参考文献