Kubernetes 이야기

Locust를 사용하여 부하테스트 실행하기 본문

Kubernetes/모니터링

Locust를 사용하여 부하테스트 실행하기

kmaster 2022. 2. 18. 19:40
반응형

부하테스트 툴 중에 가장 많이 사용하는 것은 JMeter 일 것이다. 이번에는 Kubernetes에서 Locust 툴을 사용하여 웹 UI에서 부하를 테스트하는 방식을 알아보자

 

Locust 특징

  • Python 코드로 부하 테스트 조건을 쉽게 제작할 수 있다.
  • CLI 뿐만 아니라 WEB UI에서 시작 및 결과를 조회할 수 있다.
  • Jenkins와 유사하게 Master / Worker 로 구성되고 Kubernetes 에서 Worker가 부하발생 시 Autoscaling을 통해 부하기를 증가시킬 수 있다.

 

Locust 설치

우선 Helm 차트를 사용하여 설치해 보자 (https://github.com/deliveryhero/helm-charts/tree/master/stable/locust)

 

설치 전 아래의 작업을 먼저 선행한다.

main.py 작성하기

kind: ConfigMap
apiVersion: v1
metadata:
  name: my-loadtest-locustfile
  namespace: test
data:
  main.py: >
    from locust import HttpUser, task, between
    import random

    default_headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X
    10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100
    Safari/537.36'}

    class WebsiteUser(HttpUser):        

        def on_start(self):
            self.client.verify = False

        @task(1)
        def get_index(self):
            wait_time = random.randrange(1000,5000)
            url = "/sleep.jsp?sleep=" + str(wait_time)
            self.client.get(url, headers=default_headers)

위와 같이 configmap을 만들거나 아래와 같이 main.py만 만든경우 confimap을 kubectl 로 생성한다.

kubectl create configmap my-loadtest-locustfile --from-file main.py

 

helm 배포하기

helm repo add deliveryhero https://charts.deliveryhero.io/

helm install 전 values 를 환경에 맞게 수정한다.  

  locust_locustfilemain.py
  locust_locustfile_configmapmy-loadtest-locustfile
 
affinity: {}
extraConfigMaps: {}
extraLabels: {}
fullnameOverride: ''
image:
  pullPolicy: IfNotPresent
  repository: locustio/locust
  tag: 2.4.0
imagePullSecrets: []
ingress:
  annotations: {}
  className: ''
  enabled: false
  hosts:
    - host: chart-example.local
      path: /
      pathType: ImplementationSpecific
  tls: []
loadtest:
  environment: {}
  environment_external_secret: {}
  environment_secret: {}
  excludeTags: ''
  headless: false
  locustCmd: /usr/local/bin/locust
  locust_host: 'https://www.google.com'
  locust_lib_configmap: example-lib
  locust_locustfile: main.py
  locust_locustfile_configmap: my-loadtest-locustfile
  locust_locustfile_path: /mnt/locust
  mount_external_secret: {}
  name: example
  pip_packages: []
  tags: ''
master:
  args: []
  auth:
    enabled: false
    password: ''
    username: ''
  command:
    - sh
    - /config/docker-entrypoint.sh
  deploymentAnnotations: {}
  environment: {}
  envs_include_default: true
  image: ''
  logLevel: INFO
  pdb:
    enabled: false
  resources: {}
  restartPolicy: Always
  serviceAccountAnnotations: {}
  strategy:
    type: RollingUpdate
nameOverride: ''
nodeSelector: {}
podSecurityContext: {}
securityContext: {}
service:
  annotations: {}
  extraLabels: {}
  type: ClusterIP
tolerations: []
worker:
  args: []
  command:
    - sh
    - /config/docker-entrypoint.sh
  deploymentAnnotations: {}
  environment: {}
  envs_include_default: true
  hpa:
    enabled: false
    maxReplicas: 100
    minReplicas: 1
    targetCPUUtilizationPercentage: 40
  image: ''
  logLevel: INFO
  replicas: 1
  resources: {}
  restartPolicy: Always
  serviceAccountAnnotations: {}
  strategy:
    type: RollingUpdate
helm install locust deliveryhero/locust -f values.yaml
 
테스트하기
브라우저에서 NodePort 로 접속하면 아래와 같이 설정화면이 뜬다. ( 서비스 포트는 8089를 사용한다.)

실행하면 아래와 같이 모니터링이 가능하다.

반응형
Comments