Kubernetes分布式Locust测试完成后自动删除Deployment方案咨询
问题根因
你当前使用Deployment部署一次性压测任务触发了无限重启:Deployment是面向常驻服务的工作负载,默认会始终维持Pod副本处于运行状态,当Locust压测任务完成后容器正常退出,Deployment会判定Pod异常,自动触发重建,就出现了你看到的多次重启现象。
实现压测完成自动清理资源的方案
这里提供两种最常用的实现方式,按需选择即可:
方案1:使用Job + 内置TTL自动清理(K8s 1.23及以上版本适用,无需额外脚本)
将原有的Deployment替换为Job资源,开启任务完成后自动清理机制,全程由K8s原生能力管控:
- 修改
01-locust-master.yaml,把Deployment部分替换为Job配置,添加ttlSecondsAfterFinished字段,即可实现任务完成后自动删除Job及关联Pod:
# Service部分保持不变,仅替换原Deployment配置为以下内容 apiVersion: batch/v1 kind: Job metadata: name: locust-master spec: ttlSecondsAfterFinished: 300 # 任务完成后5分钟自动删除Job及关联资源 backoffLimit: 2 # 最多失败重试2次 template: metadata: labels: name: locust role: master spec: restartPolicy: OnFailure # 仅任务失败时才重启容器 containers: # 原有container配置保持不变,和你之前的配置完全一致
- 修改
02-locust-worker.yaml,同样把Deployment替换为Job配置:
apiVersion: batch/v1 kind: Job metadata: name: locust-worker spec: parallelism: 3 # 对应原来的replicas,同时运行3个worker completions: 3 # 等3个worker都跑完任务才算完成 backoffLimit: 2 template: metadata: labels: name: locust role: worker spec: restartPolicy: OnFailure containers: # 原有container配置保持不变
方案2:外部Shell脚本管控(兼容所有K8s版本,灵活性更高)
不用修改原有YAML配置,通过外部脚本先部署资源、等待任务完成再自动删除:
#!/bin/bash # 部署所有资源 kubectl apply -f 01-locust-master.yaml -f 02-locust-worker.yaml # 等待master Pod完成压测任务(可根据你的压测时长调整timeout值) echo "等待压测任务完成..." kubectl wait --for=jsonpath='{.status.phase}'=Succeeded pod -l role=master --timeout=10m # 压测完成后删除所有关联资源 echo "压测完成,正在清理资源..." kubectl delete -f 01-locust-master.yaml -f 02-locust-worker.yaml
如果单独要解决Pod无限重启的问题,只需要在两个Deployment的spec.template.spec下添加restartPolicy: Never即可,任务完成后容器不会再被重启。
内容的提问来源于stack exchange,提问作者George Fandango
相关产品推荐
相关产品推荐

