Pod 模板
Pod 模板是 TaskRun 和 PipelineRun 规范中的配置字段,允许您自定义 Tekton 工作负载的 Pod 配置。它们定义了 Tekton 用于配置执行 Tasks 和 Pipelines 的 Pod 的 PodSpec 的一部分。此配置使您能够在不修改核心 Task 或 Pipeline 定义的情况下,自定义执行环境。
重要:Pod 模板不是独立的 Kubernetes 资源。它们是 TaskRun 和 PipelineRun 规范中的配置字段。
目录
为什么需要 Pod 模板
Pod 配置挑战
基于 Kubernetes 的 CI/CD 系统面临多个 Pod 配置挑战:
- 环境一致性:确保 Tasks 之间执行环境的一致性
- 资源管理:指定计算资源、节点选择器和调度偏好
- 安全性:应用安全上下文和访问控制
- 网络与存储:配置 DNS 策略、卷和镜像访问
Tekton 的解决方案
Tekton Pod 模板通过提供以下功能来应对这些挑战:
- 可重用性:为多个 TaskRuns 和 PipelineRuns 定义通用配置
- 定制化:无需修改 Task/Pipeline 定义即可自定义执行环境
- 灵活性:支持全局和每次执行的配置
优势
- 一致性:确保 Pipeline 执行间执行环境的一致性
- 灵活性:针对特定用例覆盖默认 Pod 配置
- 可重用性:定义一次配置,应用于多次执行
- 安全性:在 Pod 级别应用安全策略和访问控制
- 资源管理:优化资源分配和调度
适用场景
Pod 模板适用于多种场景,包括:
- 资源密集型工作负载:为构建/测试 Tasks 配置计算资源
- 安全敏感应用:应用安全上下文和访问控制
- 多节点集群:使用节点选择器和亲和规则实现最佳调度
- 私有镜像仓库访问:配置镜像拉取密钥
- 网络需求:自定义 DNS 策略和网络配置
- 存储需求:定义卷和存储配置
约束与限制
- Pod 模板配置仅影响 Pod 配置,不影响 Task 或 Pipeline 逻辑
- 某些字段可能被 Tekton 内部需求覆盖
- 全局配置与执行特定配置会合并
- 亲和助手 Pods 仅支持 Pod 模板配置字段的子集
- Pod 模板配置不能修改 Tekton 的核心功能或行为
原则
Pod 模板处理流程
当指定 Pod 模板配置时:
- Tekton 验证 Pod 模板配置
- 配置与任何全局 Pod 模板配置合并
- 对于 PipelineRuns,配置应用于所有 TaskRuns,除非被 taskRunSpecs 覆盖
- 对于 TaskRuns,配置直接应用于 Pod
- Tekton 使用合并后的配置创建 Pod
- Pod 使用指定配置执行 Task 或 Pipeline 步骤
配置合并策略
Pod 模板配置遵循特定合并规则并具有明确的优先级层级:
优先级顺序
Pod 模板配置按以下优先级合并(从高到低):
- PipelineRun 的 taskRunSpecs podTemplate(最高优先级)——在 PipelineRun 中为特定任务指定的 Pod 模板配置
- PipelineRun podTemplate(中等优先级)——在 PipelineRun 级别指定的 Pod 模板配置
- 全局 default-pod-template(最低优先级)——在 ConfigMap 或 TektonConfig 中定义的全局 Pod 模板配置
当同一字段存在多个配置时,优先级较高的配置将覆盖优先级较低的配置。
合并规则
- 环境变量(
env):按数组元素中的名称合并。如果名称相同,使用 TaskRun 或 PipelineRun 中的条目 - 卷(
volumes):按数组元素中的名称合并。如果名称相同,使用 TaskRun 或 PipelineRun 中的条目 - 其他字段:如果字段在多个配置中存在,优先级较高的配置优先
配置示例
TaskRun 的基本 Pod 模板配置
PipelineRun 的 Pod 模板配置
全局 Pod 模板配置
如果需要持久化此全局配置,建议使用 TektonConfig 替代 ConfigMap。
带 Pod 模板配置的 TaskRunSpecs
可以通过 TaskRunSpecs 将 Pod 模板配置应用于 PipelineRun 中的特定 Tasks。
重要参数
支持的字段
Pod 模板配置支持下表列出的字段。
节点选择与调度
nodeSelector
指定必须存在的节点标签以供 Pod 调度。
使用场景
- 确保 Pods 运行在特定节点类型(SSD、GPU 等)
- 将工作负载路由到专用基础设施
- 优化资源利用率
配置示例
affinity
允许基于节点标签对 Pod 调度进行细粒度控制。
使用场景
- 优先选择特定节点特性
- 避免某些节点类型
- 平衡工作负载分布
配置示例
tolerations
允许 Pods 调度到带有匹配污点的节点。
使用场景
- 在专用或特殊节点上调度 Pods
- 处理节点维护场景
- 优化资源分配
配置示例
安全配置
securityContext
指定 Pod 级别的安全属性和常见容器设置。
使用场景
- 以非 root 用户身份运行容器
- 设置文件系统组所有权
- 配置 SELinux 设置
- 应用安全策略
配置示例
资源与卷管理
volumes
指定 Pod 内容器可挂载的卷。
使用场景
- 在步骤间共享数据
- 挂载配置文件
- 提供持久存储
- 访问 Secret 和 ConfigMap
配置示例
网络配置
dnsPolicy
指定 Pod 的 DNS 策略。
使用场景
- 配置自定义 DNS 解析
- 处理网络隔离需求
- 优化网络性能
配置示例
enableServiceLinks
决定是否将 Pod 命名空间中的服务暴露为环境变量。
使用场景
- 控制服务发现行为
- 优化环境变量使用
- 处理遗留应用需求
配置示例
镜像访问配置
imagePullSecrets
指定拉取容器镜像时使用的 Secret。
使用场景
- 访问私有容器镜像仓库
- 处理仓库认证
- 支持企业镜像仓库配置
配置示例
注意:当配置了 imagePullSecrets 且 Task 中未指定命令时,Tekton 会自动使用配置的密钥查找镜像的入口点。
环境变量
env
指定 Pod 的环境变量。
使用场景
- 设置构建环境变量
- 配置应用设置
- 向容器传递配置信息
配置示例
最佳实践
配置组织
- 全局配置:用于所有执行的通用配置
- 执行特定配置:用于唯一需求或覆盖
- 任务特定配置:使用 TaskRunSpecs 进行细粒度控制
安全注意事项
- 尽可能以非 root 用户运行容器
- 使用合适的安全上下文
- 为私有仓库配置镜像拉取密钥
- 应用最小权限原则
资源优化
- 使用节点选择器将工作负载路由到合适节点
- 配置容忍度以支持专用基础设施
- 设置合适的资源限制和请求
- 优化卷配置以提升性能
维护
- 保持配置简洁聚焦
- 记录配置目的和需求
- 版本控制配置
- 在非生产环境测试配置变更