You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenShift Pipeline:如何限制同一时间仅运行一个PipelineRun?

OpenShift Pipeline 单实例运行与排队实现方案

官方原生解决方案:互斥运行控制

OpenShift Pipeline基于Tekton Pipelines,官方提供两种方式实现同一Pipeline的PipelineRun互斥:

1. Workspace独占访问校验

如果你的PVC采用ReadWriteOnce模式,可结合Pipeline的workspace定义实现互斥:

  • 在Pipeline的workspace声明中指定readOnly: false,确保Task以读写模式挂载PVC;
  • Tekton会自动校验PVC的占用状态,若已有Pod挂载该PVC,新的PipelineRun对应的Pod会处于Pending状态,直到前一个Pod释放PVC。这种方式仅适用于ReadWriteOnce类型的PVC,属于被动等待机制。

2. 前置Task状态检查

创建一个前置Task,主动查询当前是否有同Pipeline的PipelineRun处于运行状态:

  • Task通过oc或kubectl命令查询目标Pipeline下的PipelineRun状态;
  • 若存在运行中的实例,则持续等待;否则继续执行后续任务。

示例前置Task核心脚本:

#!/bin/sh
PIPELINE_NAME="your-target-pipeline"
while true; do
  # 查询处于运行中的PipelineRun数量
  RUNNING_COUNT=$(oc get pipelinerun -l tekton.dev/pipeline=$PIPELINE_NAME -o jsonpath='{.items[?(@.status.conditions[0].type=="Succeeded" && @.status.conditions[0].status=="Unknown")].metadata.name}' | wc -w)
  if [ $RUNNING_COUNT -eq 0 ]; then
    break
  fi
  echo "Waiting for running PipelineRun to finish..."
  sleep 30
done

排队机制实现(无开箱即用方案,标准Workaround)

OpenShift Pipeline本身没有原生排队功能,但可通过以下方式实现有序排队:

ConfigMap锁+循环等待

  1. 创建存储锁状态的ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
  name: pipeline-run-lock
data:
  active-run: ""
  1. 在Pipeline首Task中添加锁校验逻辑:
    • 读取ConfigMap中的active-run字段,若为空则写入当前PipelineRun名称;
    • 若不为空,查询该PipelineRun的状态,若已完成则更新锁为当前实例,否则等待重试;
  2. 在Pipeline末尾Task中清空ConfigMap的active-run字段,释放锁供下一个实例使用。

第三方工具/插件

Tekton社区有tekton-mutex等第三方工具可实现PipelineRun的互斥与排队,但这类工具未纳入OpenShift官方支持范围,需自行评估部署风险。

内容的提问来源于stack exchange,提问作者pitchblack408

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 22:58:24