Unable to Use Multiple PVC Workspaces in Tekton

目录

问题描述

当在 Tekton 中运行带有多个 PersistentVolumeClaim (PVC) 基础的 workspacesPipelineRunTaskRun 时,执行会失败,报错类似于“more than one PersistentVolumeClaim is bound”。

即使所有 PVC 都有效且声明正确,也会出现此问题。

错误表现

  1. TaskRun 执行失败,状态为 False,原因是 TaskRunValidationFailed

    $ kubectl get taskruns -n ${namespace} ${taskrun_name}
    NAME                     SUCCEEDED   REASON                       STARTTIME   COMPLETIONTIME
    demo-hbfhd-foo           False       TaskRunValidationFailed      59s         59s
  2. TaskRun 事件显示错误信息:

    [User error] more than one PersistentVolumeClaim is bound

根因分析

默认情况下,Tekton 启用了Affinity Assistant 功能,帮助将 TaskRun pod 与其 PVC 共同调度到同一节点上。这对于访问模式为 ReadWriteOnce 的卷尤其有用。

但是,当启用 Affinity Assistant 时:

  • 每个 TaskRun 仅限于使用单个基于 PVC 的工作区
  • 绑定多个 PVC 会触发校验错误,导致 TaskRun 无法运行。

此限制是为了避免复杂的调度问题和节点亲和冲突。

故障排查

若要允许 TaskRunPipelineRun 使用多个基于 PVC 的工作区,必须通过更新 Tekton 功能标志禁用 Affinity Assistant

建议按如下步骤排查:

  1. 编辑 TektonConfig 资源,设置 spec.pipeline.disable-affinity-assistant,示例如下:
apiVersion: operator.tekton.dev/v1alpha1
kind: TektonConfig
spec:
  pipeline:
    disable-affinity-assistant: true

提示:disable-affinity-assistant 功能标志即将被移除,Affinity Assistant 模式将仅由 coschedule 功能标志控制。

  1. feature-flags ConfigMap 会自动更新。
apiVersion: v1
kind: ConfigMap
metadata:
  name: feature-flags
  namespace: tekton-pipelines
data:
  disable-affinity-assistant: "true"
  1. 无需手动重启组件,变更会自动生效。

相关内容