Locust部署GKE后Worker连Master失败及webport参数无效问题求助
Locust负载测试部署问题排查
我正在为某个端点搭建Locust负载测试,已完成Dockerfile、run.sh脚本、Locust测试脚本及配置文件的编写,也在GKE上创建了集群并部署了Locust Master与Worker实例,同时暴露了对应端口。但访问locust-web时出现**「Worker unable to connect to the master and invalid args in webport」**错误,请求协助排查解决。
相关配置文件
Dockerfile
FROM python:3.8 # Add the external tasks directory into /tasks WORKDIR /src ADD requirements.txt . RUN pip install --no-cache-dir --upgrade locust==2.10.1 ADD run.sh . ADD load_test.py . ADD load_test.conf . # Expose the required Locust ports EXPOSE 5557 5558 8089 # Set script to be executable RUN chmod 755 run.sh # Start Locust using LOCUS_OPTS environment variable CMD ["bash", "run.sh"]
run.sh脚本
#!/bin/bash LOCUST="locust" LOCUS_OPTS="--config=load_test.conf" LOCUST_MODE=${LOCUST_MODE:-standalone} if [[ "$LOCUST_MODE" = "master" ]]; then LOCUS_OPTS="$LOCUS_OPTS --master" elif [[ "$LOCUST_MODE" = "worker" ]]; then LOCUS_OPTS="$LOCUS_OPTS --worker --master-host=$LOCUST_MASTER_HOST" fi echo "${LOCUST} ${LOCUS_OPTS}" $LOCUST $LOCUS_OPTS
Locust测试脚本
import json from locust import HttpUser, constant, task class CategorizationUser(HttpUser): wait_time = constant(1) @task def predict(self): payload = json.dumps( { "text": "Face and Body Paint washable Rubies Halloween item 91#385" } ) _ = self.client.post("/predict", data=payload)
配置文件(load_test.conf)
locustfile = load_test.py headless = false users = 1000 spawn-rate = 1 run-time = 5m host = IP html = locust_report.html
deployment.yaml
--- kind: Deployment apiVersion: apps/v1 metadata: namespace: default name: locust-master-deployment labels: name: locust role: master spec: replicas: 1 selector: matchLabels: name: locust role: master template: metadata: labels: name: locust role: master spec: containers: - name: locust image: gcr.io/PROJECT_ID/IMAGE_URI imagePullPolicy: Always env: - name: LOCUST_MODE value: master - name: LOCUST_LOG_LEVEL value: DEBUG ports: - name: loc-master-web containerPort: 8089 protocol: TCP - name: loc-master-p1 containerPort: 5557 protocol: TCP - name: loc-master-p2 containerPort: 5558 protocol: TCP --- kind: Deployment apiVersion: apps/v1 metadata: namespace: default name: locust-worker-deployment labels: name: locust role: worker spec: replicas: 2 selector: matchLabels: name: locust role: worker template: metadata: labels: name: locust role: worker spec: containers: - name: locust image: gcr.io/PROJECT_ID/IMAGE_URI imagePullPolicy: Always env: - name: LOCUST_MODE value: worker - name: LOCUST_MASTER value: locust-master-service - name: LOCUST_LOG_LEVEL value: DEBUG
端口暴露命令
kubectl expose pod locust-master-deployment-f9d4c4f59-8q6wk \ --type NodePort \ --port 5558 \ --target-port 5558 \ --name locust-5558 kubectl expose pod locust-master-deployment-f9d4c4f59-8q6wk \ --type NodePort \ --port 5557 \ --target-port 5557 \ --name locust-5557 kubectl expose pod locust-master-deployment-f9d4c4f59-8q6wk \ --type LoadBalancer \ --port 80 \ --target-port 8089 \ --name locust-web
问题排查与修复方案
1. Worker连接Master的环境变量不匹配
run.sh中Worker模式依赖LOCUST_MASTER_HOST环境变量,但Worker Deployment配置里设置的是LOCUST_MASTER,变量名不匹配导致Worker无法获取Master地址。
修复:
修改Worker Deployment的环境变量:
env: - name: LOCUST_MODE value: worker - name: LOCUST_MASTER_HOST # 修正变量名 value: locust-master-service - name: LOCUST_LOG_LEVEL value: DEBUG
2. 缺少Master内部Service
Worker配置中指定的locust-master-service不存在,导致无法通过DNS解析Master实例。
修复:
创建Master的ClusterIP Service(供集群内部Worker访问):
kubectl create service clusterip locust-master-service \ --tcp=5557:5557 --tcp=5558:5558 --tcp=8089:8089 \ --selector=name=locust,role=master
3. 配置文件缺失Web端口参数
"invalid args in webport"错误通常是因为配置文件未指定Web端口,或参数冲突。
修复:
在load_test.conf中添加端口配置:
web-port = 8089
4. 优化端口暴露方式
直接暴露单个Pod的端口会导致Pod重建后服务失效,建议改为暴露Deployment对应的Service:
# 暴露Master Web端口为LoadBalancer kubectl expose deployment locust-master-deployment \ --type LoadBalancer \ --port 80 \ --target-port 8089 \ --name locust-web # 暴露Master Worker通信端口(仅当需要外部Worker连接时执行) kubectl expose deployment locust-master-deployment \ --type NodePort \ --port 5557 \ --target-port 5557 \ --name locust-5557 kubectl expose deployment locust-master-deployment \ --type NodePort \ --port 5558 \ --target-port 5558 \ --name locust-5558
内容的提问来源于stack exchange,提问作者S. P
相关产品推荐
相关产品推荐

