使用Rsync从OCP Pod拷贝测试结果时出现Pod Not Found错误求助
根因分析
- OCP Pod自动回收机制触发:OpenShift的kubelet默认会清理
Completed状态的Pod,若测试完成后Jenkins任务调度延迟,还没执行Rsync,Pod就被垃圾回收,会出现"Pod Not Found"。 - 测试与Jenkins任务的时间差:RBF测试完成后,Jenkins任务可能因队列拥堵、调度延迟等未能及时触发,这段时间Pod可能因资源回收或重新调度被销毁。
- 静态Pod名称依赖:若Jenkins脚本硬编码测试Pod名称,Deployment/StatefulSet滚动更新后,旧Pod被销毁、新Pod带随机后缀,会导致匹配失败。
- Pod选择逻辑不严谨:如果Rsync前的Pod查询只匹配部分标签或前缀,当存在多个同前缀Pod、或Pod标签更新变化时,可能无法定位目标Pod。
解决方案
- 调整Pod保留策略:
- 若测试Pod是Job类型,设置
spec.ttlSecondsAfterFinished: 3600,让Completed状态的Pod保留1小时再回收; - 给测试Pod添加annotation
kubernetes.io/pod-termination-grace-period: "300",延长优雅终止时长,给Jenkins足够拉取时间。
- 若测试Pod是Job类型,设置
- 同步触发Jenkins任务:
- 在RBF测试完成的钩子脚本里,直接调用Jenkins API触发Rsync任务(比如
curl http://jenkins-url/job/rsync-test-result/build),消除测试完成与Jenkins执行的时间差; - 或者在测试Pod内部完成结果上传:测试结束后直接用Rsync把结果推到Jenkins服务器指定目录,无需Jenkins主动拉取。
- 在RBF测试完成的钩子脚本里,直接调用Jenkins API触发Rsync任务(比如
- 动态获取Pod名称:
- 修改Jenkins脚本,用OpenShift命令动态查询目标Pod,示例:
确保TEST_POD=$(oc get pods -l app=rbf-test-pod,status=running -o jsonpath='{.items[0].metadata.name}') oc rsync $TEST_POD:/test-results/ ./local-results/app=rbf-test-pod是测试Pod的唯一标识标签,避免匹配错误。
- 修改Jenkins脚本,用OpenShift命令动态查询目标Pod,示例:
- 持久化测试结果到PVC:
- 给测试Pod挂载PVC,将测试结果目录(如
/test-results)指向PVC挂载路径; - Jenkins任务直接从PVC拉取结果,或部署固定的"结果代理Pod"挂载该PVC,Rsync到这个固定Pod,彻底摆脱对测试Pod生命周期的依赖。
- 给测试Pod挂载PVC,将测试结果目录(如
- 添加重试逻辑:
- 在Jenkins的Rsync步骤中加入重试机制,示例shell脚本:
应对偶发的Pod调度延迟或临时不可用问题。MAX_RETRIES=3 RETRY_COUNT=0 until oc rsync $TEST_POD:/test-results/ ./local-results/; do RETRY_COUNT=$((RETRY_COUNT+1)) if [ $RETRY_COUNT -ge $MAX_RETRIES ]; then echo "Rsync failed after $MAX_RETRIES retries" exit 1 fi echo "Retrying Rsync... ($RETRY_COUNT/$MAX_RETRIES)" sleep 10 done
- 在Jenkins的Rsync步骤中加入重试机制,示例shell脚本:
内容的提问来源于stack exchange,提问作者sourabh kadyan
相关产品推荐
相关产品推荐

