Pod 模板

Pod 模板是 TaskRunPipelineRun 规范中的配置字段,允许您自定义 Tekton 工作负载的 Pod 配置。它们定义了 Tekton 用于配置执行 TasksPipelines 的 Pod 的 PodSpec 的一部分。此配置使您能够在不修改核心 Task 或 Pipeline 定义的情况下,定制执行环境。

NOTE

重要: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 模板配置时:

  1. Tekton 验证 Pod 模板配置
  2. 配置与任何全局 Pod 模板配置合并
  3. 对于 PipelineRuns,配置应用于所有 TaskRuns,除非被 taskRunSpecs 覆盖
  4. 对于 TaskRuns,配置直接应用于 Pod
  5. Tekton 使用合并后的配置创建 Pod
  6. Pod 使用指定配置执行 Task 或 Pipeline 步骤

配置合并策略

Pod 模板配置遵循特定合并规则并具有明确的优先级层次:

优先级顺序

Pod 模板配置按以下优先级顺序合并(从高到低):

  1. PipelineRun 的 taskRunSpecs podTemplate(最高优先级)——在 PipelineRun 中为特定任务指定的 Pod 模板配置
  2. PipelineRun podTemplate(中等优先级)——在 PipelineRun 级别指定的 Pod 模板配置
  3. 全局 default-pod-template(最低优先级)——在 ConfigMap 或 TektonConfig 中定义的全局 Pod 模板配置

当同一字段存在多个配置时,优先级更高的配置将覆盖优先级较低的配置。

合并规则

  • 环境变量(env:按数组元素中的名称合并。如果名称相同,则使用 TaskRun 或 PipelineRun 中的项
  • 卷(volumes:按数组元素中的名称合并。如果名称相同,则使用 TaskRun 或 PipelineRun 中的项
  • 其他字段:如果字段在多个配置中存在,优先级更高的配置优先

配置示例

TaskRun 的基础 Pod 模板配置

apiVersion: tekton.dev/v1
kind: TaskRun
metadata:
  name: build-with-pod-template
spec:
  taskRef:
    name: build-task
  podTemplate:
    nodeSelector:
      disktype: ssd
    tolerations:
    - key: "dedicated"
      operator: "Equal"
      value: "build"
      effect: "NoSchedule"
    securityContext:
      runAsUser: 1000
      runAsGroup: 1000
      fsGroup: 1000
    volumes:
    - name: cache-volume
      emptyDir: {}

PipelineRun 的 Pod 模板配置

apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
  name: build-deploy-with-pod-template
spec:
  pipelineRef:
    name: build-deploy-pipeline
  podTemplate:
    nodeSelector:
      environment: production
    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/os
              operator: In
              values:
              - linux
    securityContext:
      runAsNonRoot: true
      runAsUser: 1000
    imagePullSecrets:
    - name: registry-secret
    env:
    - name: BUILD_ENV
      value: "production"

全局 Pod 模板配置

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-defaults
  namespace: tekton-pipelines
data:
  default-pod-template: |
    nodeSelector:
      workload: tekton
    tolerations:
    - key: "workload"
      operator: "Equal"
      value: "tekton"
      effect: "NoSchedule"
    securityContext:
      fsGroup: 65532
      fsGroupChangePolicy: "OnRootMismatch"
    imagePullSecrets:
    - name: default-registry-secret
NOTE

如果需要持久化此全局配置,建议使用 TektonConfig 替代 ConfigMap

apiVersion: operator.tekton.dev/v1alpha1
kind: TektonConfig
metadata:
  name: config
spec:
  pipeline:
    default-pod-template: |
      securityContext:
        fsGroup: 65532
        fsGroupChangePolicy: "OnRootMismatch"

带 Pod 模板配置的 TaskRunSpecs

Pod 模板配置可以通过 TaskRunSpecs 应用于 PipelineRun 中的特定 Tasks。

apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
  name: build-deploy-with-specific-templates
spec:
  pipelineRef:
    name: build-deploy-pipeline
  podTemplate:
    # 针对流水线中所有任务的全局 pod 模板配置
    # 除非被 taskRunSpecs 覆盖,否则此配置将应用于所有任务
    nodeSelector:
      environment: production
    securityContext:
      runAsUser: 0
  taskRunSpecs:
  - pipelineTaskName: build
    podTemplate:
      # 任务特定的 pod 模板配置
      # 此配置覆盖 'build' 任务的全局 podTemplate
      nodeSelector:
        disktype: ssd
      tolerations:
      - key: "dedicated"
        operator: "Equal"
        value: "build"
        effect: "NoSchedule"
  - pipelineTaskName: deploy
    podTemplate:
      # 任务特定的 pod 模板配置
      # 此配置覆盖 'deploy' 任务的全局 podTemplate
      nodeSelector:
        environment: production
      securityContext:
        runAsNonRoot: true
        runAsUser: 1000

重要参数

支持的字段

Pod 模板配置支持下表列出的字段。

字段描述
env在 TaskRun 和 PipelineRun 级别 Pod 模板中定义的环境变量优先于 steps 和 stepTemplate 中定义的环境变量
nodeSelector必须满足 Pod 能够调度到节点的条件
tolerations允许(但不要求)Pods 调度到带有匹配污点的节点
affinity允许基于节点标签限制 Pod 可调度的节点集合
securityContext指定 Pod 级别的安全属性和常见容器设置,如 runAsUser 和 selinux
volumes指定 Pod 内容器可挂载的卷列表,允许为 Task 中的每个 volumeMount 指定卷类型
runtimeClassName指定 Pod 的 runtime class
automountServiceAccountToken默认值: true。决定 Tekton 是否自动为 Pod 使用的服务账户在容器内预定义路径提供令牌
dnsPolicy默认值: ClusterFirst。指定 Pod 的 DNS 策略。合法值为 ClusterFirst、Default 和 None。不支持 ClusterFirstWithHostNet,因为 Tekton Pods 不能使用主机网络运行。
dnsConfig指定 Pod 的 额外 DNS 配置,如名称服务器和搜索域
enableServiceLinks默认值: true。决定是否将 Pod 命名空间中的服务以环境变量形式暴露给 Pod,类似于 Docker 的服务链接
priorityClassName指定 Pod 的 优先级类,允许选择性启用对低优先级工作负载的抢占
schedulerName指定调度 Pod 时使用的 调度器。可为不同类型的工作负载指定不同调度器,如机器学习工作负载使用 volcano.sh
imagePullSecrets指定拉取容器镜像时使用的 Secret
hostNetwork默认值: false。决定是否使用主机网络命名空间
hostAliases向 Pod 的 /etc/hosts 添加条目,实现 Pod 级别的主机名覆盖。详情见 Kubernetes 该字段文档
topologySpreadConstraints指定 Pod 在集群中如何在拓扑域间分布

节点选择与调度

nodeSelector

指定 Pod 调度时必须存在的节点标签。

使用场景

  • 确保 Pod 运行在特定节点类型(SSD、GPU 等)
  • 将工作负载路由到专用基础设施
  • 优化资源利用率

配置示例

podTemplate:
  nodeSelector:
    disktype: ssd
    environment: production

affinity

基于节点标签对 Pod 调度进行细粒度控制。

使用场景

  • 优先选择特定节点特性
  • 避免某些节点类型
  • 平衡工作负载分布

配置示例

podTemplate:
  affinity:
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: kubernetes.io/arch
            operator: In
            values:
            - amd64

tolerations

允许 Pod 调度到带有匹配污点的节点。

使用场景

  • 调度 Pod 到专用或特殊节点
  • 处理节点维护场景
  • 优化资源分配

配置示例

podTemplate:
  tolerations:
  - key: "dedicated"
    operator: "Equal"
    value: "build"
    effect: "NoSchedule"

安全配置

securityContext

指定 Pod 级别的安全属性和常见容器设置。

使用场景

  • 以非 root 用户身份运行容器
  • 设置文件系统组所有权
  • 配置 SELinux 设置
  • 应用安全策略

配置示例

podTemplate:
  securityContext:
    runAsNonRoot: true
    runAsUser: 1000
    runAsGroup: 1000
    fsGroup: 1000
    seccompProfile:
      type: RuntimeDefault

资源与卷管理

volumes

指定 Pod 内容器可挂载的卷。

使用场景

  • 在步骤间共享数据
  • 挂载配置文件
  • 提供持久存储
  • 访问 Secret 和 ConfigMap

配置示例

podTemplate:
  volumes:
  - name: shared-data
    emptyDir: {}
  - name: config-volume
    configMap:
      name: app-config
  - name: secret-volume
    secret:
      secretName: app-secrets

网络配置

dnsPolicy

指定 Pod 的 DNS 策略。

使用场景

  • 配置自定义 DNS 解析
  • 处理网络隔离需求
  • 优化网络性能

配置示例

podTemplate:
  dnsPolicy: ClusterFirst
  dnsConfig:
    nameservers:
    - 8.8.8.8
    - 8.8.4.4
    searches:
    - default.svc.cluster.local
    - svc.cluster.local

决定是否将 Pod 命名空间中的服务以环境变量形式暴露。

使用场景

  • 控制服务发现行为
  • 优化环境变量使用
  • 处理遗留应用需求

配置示例

podTemplate:
  enableServiceLinks: false

镜像访问配置

imagePullSecrets

指定拉取容器镜像时使用的 Secret。

使用场景

  • 访问私有容器镜像仓库
  • 处理仓库认证
  • 支持企业镜像仓库配置

配置示例

podTemplate:
  imagePullSecrets:
  - name: private-registry-secret
  - name: enterprise-registry-secret

注意:当配置了 imagePullSecrets 且 Task 中未指定命令时,Tekton 会使用配置的密钥自动查找镜像的入口点。

环境变量

env

指定 Pod 的环境变量。

使用场景

  • 设置构建环境变量
  • 配置应用设置
  • 向容器传递配置信息

配置示例

podTemplate:
  env:
  - name: BUILD_ENV
    value: "production"
  - name: DEBUG_LEVEL
    value: "info"
  - name: API_ENDPOINT
    valueFrom:
      configMapKeyRef:
        name: app-config
        key: api-endpoint

最佳实践

配置组织

  • 全局配置:用于所有执行的通用配置
  • 执行特定配置:用于唯一需求或覆盖
  • 任务特定配置:使用 TaskRunSpecs 实现细粒度控制

安全注意事项

  • 尽可能以非 root 用户身份运行容器
  • 使用合适的安全上下文
  • 为私有仓库配置镜像拉取密钥
  • 应用最小权限原则

资源优化

  • 使用节点选择器将工作负载路由到合适节点
  • 配置容忍度以支持专用基础设施
  • 设置合适的资源限制和请求
  • 优化卷配置以提升性能

维护

  • 保持配置简洁聚焦
  • 记录配置目的和需求
  • 版本控制配置
  • 在非生产环境测试配置变更

参考资料