如何用Bash脚本创建多Pod运行测试用例并管理其生命周期
批量测试Pod的Bash管理方案
一、批量启动Pod(推荐用Job替代裸Pod)
Job天然适配一次性测试任务的生命周期管理(失败重试、任务状态追踪),比裸Pod更省心,不用手动处理Pod异常退出的情况。
- 先写Job模板文件
test-job-template.yaml:
apiVersion: batch/v1 kind: Job metadata: name: test-job-${TEST_CASE_ID} labels: test-batch: "${BATCH_TAG}" # 统一标签用于后续批量操作 spec: template: spec: containers: - name: test-runner image: your-test-image:latest command: ["/bin/bash", "-c"] args: ["${TEST_COMMANDS}"] # 填测试用例的多条命令 restartPolicy: OnFailure # 失败时自动重启容器,按需调整 backoffLimit: 1 # 任务重试次数,根据测试需求设置
- 批量启动脚本
start-tests.sh:
#!/bin/bash # 定义批次标签,确保唯一,比如用时间戳 BATCH_TAG="test-batch-$(date +%Y%m%d-%H%M%S)" # 生成1000个测试用例ID,也可以从测试用例文件读取 TEST_CASE_IDS=$(seq 1 1000) # 用GNU parallel并行创建Job,-j控制并发数,避免打满集群API echo "$TEST_CASE_IDS" | parallel -j 30 \ TEST_CASE_ID={} \ BATCH_TAG=$BATCH_TAG \ TEST_COMMANDS="echo Starting test {}; sleep 5; echo Test {} finished" \ envsubst < test-job-template.yaml | kubectl create -f -
- 用
envsubst直接替换模板变量,不用生成1000个独立YAML文件 - 并发数
-j 30可根据集群资源调整,避免瞬间占用过多资源
二、批量监控任务状态
- 实时查看所有测试Pod/Job状态:
# 监控Pod运行状态 kubectl get pods -l test-batch=${BATCH_TAG} --watch # 查看Job整体完成情况(成功/失败数) kubectl get jobs -l test-batch=${BATCH_TAG}
- 等待所有测试任务完成:
# 等待所有Job执行完成(无论成功/失败),超时时间按需设置 kubectl wait --for=condition=complete --timeout=3600s jobs -l test-batch=${BATCH_TAG} # 仅等待所有Job成功完成,失败会触发超时 kubectl wait --for=condition=successful --timeout=3600s jobs -l test-batch=${BATCH_TAG}
- 批量收集测试日志:
mkdir -p test-logs/${BATCH_TAG} # 遍历所有测试Pod,导出日志到本地目录 for pod in $(kubectl get pods -l test-batch=${BATCH_TAG} -o name); do pod_name=$(echo $pod | cut -d/ -f2) kubectl logs $pod > test-logs/${BATCH_TAG}/${pod_name}.log done
三、批量终止/清理任务
- 直接删除所有测试Job(会自动清理对应的Pod):
kubectl delete jobs -l test-batch=${BATCH_TAG}
- 强制终止仍在运行的裸Pod(如果没用Job的情况):
kubectl delete pods -l test-batch=${BATCH_TAG} --force --grace-period=0
四、核心优化点
- 统一标签是关键:所有测试资源加唯一批次标签,后续启动、监控、清理全靠标签过滤,不用记忆具体Pod/Job名称
- 优先用Job:Job会自动处理Pod重启、状态上报,避免裸Pod意外退出后无追踪依据
- 控制并发数:启动时通过
parallel -j N或Job的parallelism参数限制并发Pod数,防止集群资源耗尽 - 脚本复用:把启动、监控、清理逻辑封装成函数,比如:
function cleanup_batch() { local batch_tag=$1 kubectl delete jobs -l test-batch=$batch_tag --ignore-not-found }
内容的提问来源于stack exchange,提问作者Frank Xie
相关产品推荐
相关产品推荐

