无法在 Tekton 中使用多个 PVC workspaces

问题描述

在 Tekton 中运行带有 多个基于 PersistentVolumeClaim (PVC) 的 workspaces 的 PipelineRun 或 TaskRun 时,执行会失败,并出现类似 “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 的 workspace。
  • 绑定多个 PVC 会触发 验证错误,从而阻止 TaskRun 运行。

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

故障排查

要允许 TaskRun 或 PipelineRun 使用 多个基于 PVC 的 workspaces,必须通过更新 Tekton feature flags 来 禁用 Affinity Assistant。

建议按以下步骤进行排查:

  1. 按如下方式编辑 TektonConfig 资源,设置 spec.pipeline.coschedule:

    apiVersion: operator.tekton.dev/v1alpha1
    kind: TektonConfig
    spec:
      pipeline:
        coschedule: disabled
  2. feature-flags ConfigMap 将自动更新。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: feature-flags
      namespace: tekton-pipelines
    data:
      coschedule: disabled
  3. 无需手动重启任何组件,变更将自动生效。

相关内容