深入理解 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 通过以下方式提供了全面的解决方案:
- 卸载数据存储:将已完成的 CI/CD 执行数据从 etcd 移动到专用的优化数据库
- 建立关系:通过 Result/Record 数据模型创建相关 CI/CD 活动之间的显式关系
- 集中日志存储:将日志与其相关的 TaskRuns/PipelineRuns 一同存储
- 提供数据生命周期管理:实施保留策略以自动管理数据
- 启用高级查询:提供超出 Kubernetes API 所能实现的强大过滤和查询能力
优势
- 提升集群性能:减少 Kubernetes API 服务器和 etcd 的负载,通过卸载已完成的 CI/CD 数据
- 增强数据组织:将相关的 CI/CD 活动聚合在一起,以提高可视化和管理效果
- 更长的数据保留:在不影响集群资源的情况下,支持执行历史的长期存储
- 强大的查询能力:为 CI/CD 数据提供高级过滤和搜索能力
- 集成日志管理:将日志与执行数据一起存储,以获得完整的管道历史
- 自动清理:通过可配置的保留策略管理数据生命周期
适用场景
Tekton Results 在以下场景中特别有价值:
- 高容量 CI/CD 环境:运行多个生成大量执行数据的管道的组织
- 合规要求:需要维护执行历史以满足审计或合规目的的环境
- 资源有限的集群:etcd 资源有限并需要优化的集群
- 高级分析:想对 CI/CD 执行模式进行分析和报告的团队
- 多团队环境:多个团队共享 Tekton 基础设施且需要隔离其 CI/CD 数据的组织
架构和原则
Tekton Results 遵循微服务架构,具有三个主要组件共同协作以提供完整解决方案:
API 服务器架构
API 服务器是核心组件,负责:
- 提供数据访问:公开 gRPC 和 REST 端点用于存储和检索结果及记录
- 管理身份验证:使用 Kubernetes 风格的身份验证(服务帐户、令牌)
- 实施授权:对结果资源实现基于 RBAC 的访问控制
- 处理数据持久性:与底层数据库(PostgreSQL)接口
- 支持过滤:实现 CEL(通用表达式语言)以进行强大的查询过滤
API 服务器使用父子层次关系,其中:
- 命名空间/工作区是结果的父级
- 结果是记录的父级
- 记录包含实际的执行数据
观察者架构
观察者作为 Kubernetes 控制器运行,其职责包括:
- 监控资源:监听集群中的 TaskRun 和 PipelineRun 事件
- 确定分组:使用注释、标签和拥有者引用对相关资源进行分组
- 创建/更新记录:通过 API 服务器将执行数据存储在 Results 数据库中
- 注释资源:为原始 Kubernetes 资源添加结果标识符
- 管理删除:根据需要删除存储在数据库中的已完成资源
观察者使用多种策略对相关资源进行分组:
results.tekton.dev/result
注释
triggers.tekton.dev/triggers-eventid
标签
- 与 PipelineRuns 的拥有者引用
- 当未找到分组信息时自动生成新的结果名称
保留策略代理架构
保留策略代理负责:
- 调度清理:根据配置的计划运行修剪作业
- 实施保留:删除超出配置保留期的数据
- 管理数据库大小:防止 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 进行访问控制:
- 身份验证:使用服务帐户令牌、用户模拟和其他 Kubernetes 身份验证方法
- 授权:对资源(
results
,records
)及动词(get
,list
,create
,update
,delete
)实施 RBAC
- 命名空间隔离:在多租户环境中按命名空间范围限制权限
示例 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 天) | 保留数据的持续时间 |
参考文献