locust를kubernetes로 설계하여 부하 테스트를 실시하다

개시하다


kubernetes에서locust에 대한 디버깅을 실시하고 부하 테스트를 실시하는 방법을 조사했기 때문에 프로그램을 총괄하고 싶습니다.또한 이번에는 로컬docker-desktop에서 테스트를 실시합니다.

시나리오


이번locust를 사용하여 부하 테스트를 실시하는 구성은 다음과 같다.locust를 사용하여 부하를 가하는 Pod는 Master/worker로 구성되어 있으며 각각 경로/hello를 통해 Pod로 개발된 테스트 대상 응용 서버에 대한 요청을 수행합니다.

이루어지다


코드 구조


부하 테스트를 실행하는 코드는 다음과 같다.또한 구성에 관해서는 여기.를 참고했다.
$ tree .
.
├── image
│   ├── Dockerfile
│   └── test
│       ├── requirements.txt
│       ├── run.sh
│       └── test.py
└── manifest.yaml
image 디렉토리는 로드 테스트를 수행하는 Docker Image를 만드는 데 사용되는 디렉토리입니다.또한manifest.yaml에는 마스터/worker를 구성하는 설정과 부하 방면의 Pod가 테스트 대상인 Pod에 요청하는 서비스의 설정이 포함되어 있다.

Docker Image 만들기

image 디렉토리에 포함된 파일의 내용은 다음과 같습니다.
FROM python:3.7.2
ADD test /test
RUN python -m pip install -r /test/requirements.txt
RUN chmod 755 /test/run.sh

ENTRYPOINT ["/test/run.sh"] 
locust == 1.6.0
에 사용된 라이브러리는 locust뿐이다.
run.sh
#!/bin/bash

LOCUST="/usr/local/bin/locust"
LOCUS_OPTS="-f /test/test.py --host=$TARGET_HOST"

if [[ "$LOCUST_MODE" = "master" ]]; then
    LOCUS_OPTS="$LOCUS_OPTS --master"
elif [[ "$LOCUST_MODE" = "worker" ]]; then
    LOCUS_OPTS="$LOCUS_OPTS --worker --master-host=$LOCUST_MASTER"
fi

$LOCUST $LOCUS_OPTS
마스터나 워크맨을 통해 실행할 때 지정한 옵션을 변경합니다.
test/test.py
from locust import HttpUser, task, between

class TestUser(HttpUser):

    @task
    def hello(self):
        self.client.get("/hello")
테스트와 관련해서는 스키마 항목에 언급된 것처럼 하중 객체의 API에 대해서만 경로/hello를 통해 GET 요청을 수행합니다.
마지막으로 docker 명령으로 그림을 만듭니다.
$ docker build -t locust:latest ./image

manifest.내용 소개


manifest.yaml의 내용은 다음과 같습니다.
manifest.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: locust-service
  name: locust-service
spec:
  ports:
  - name: master-web
    nodePort: 30060
    port: 8089
    protocol: TCP
    targetPort: master-web
  - name: master-p1
    nodePort: 30061
    port: 5557
    protocol: TCP
    targetPort: master-p1
  - name: master-p2
    nodePort: 30062
    port: 5558
    protocol: TCP
    targetPort: master-p2
  selector:
    app: locust-master
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    name: locust-master
  name: locust-master
spec:
  replicas: 1
  selector:
    matchLabels:
      app: locust-master
  template:
    metadata:
      labels:
        app: locust-master
    spec:
      containers:
      - env:
        - name: LOCUST_MODE
          value: master
        - name: TARGET_HOST
          value: http://knowledge-service
        image: locust:latest
        imagePullPolicy: IfNotPresent
        name: locust-master
        ports:
        - containerPort: 8089
          name: master-web
          protocol: TCP
        - containerPort: 5557
          name: master-p1
          protocol: TCP
        - containerPort: 5558
          name: master-p2
          protocol: TCP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    name: locust-worker
  name: locust-worker
spec:
  replicas: 4
  selector:
    matchLabels:
      app: locust-worker
  template:
    metadata:
      labels:
        app: locust-worker
    spec:
      containers:
      - env:
        - name: LOCUST_MODE
          value: worker
        - name: LOCUST_MASTER
          value: locust-master
        - name: TARGET_HOST
          value: http://knowledge-service
        image: locust:latest
        imagePullPolicy: IfNotPresent
        name: locust-worker
locust-master에 관하여 마스터/worker로 부하 테스트를 실시하면 5557558 포트를 사용합니다.8089번 포트는 웹 UI에 액세스하기 위한 포트입니다.또한 이번 테스트 대상의 Pod에서 요구를 집행하기 위해 knowledge-service의 서비스는 별도로 설계될 예정이다.
마지막으로 manifest.yaml에 대한 디버깅을 진행합니다.
$ kubectl apply -f manifest.yaml

동작 확인


브라우저 액세스localhost:30060를 사용하면 웹 UI가 표시됩니다.테스트를 실행하기 위해 적당한 설정을 하다.

테스트 실행 중인'Statistics'항목에서 요청 수와 요청 평균 초, RPS 등의 실측값 등을 실시간으로 확인할 수 있다.

Charts는 차트를 통해 RPS의 실제 측정 값, 1초 실패 요청 수 등을 확인할 수 있습니다.

좋은 웹페이지 즐겨찾기