K6를 이용한 트래픽 성능 테스트

2024. 1. 9. 16:11Technology[DevOps]

[ 이번 게시글에서 구현할 사항 ]

- 트래픽을 어느정도까지 버틸 수 있는 지 K6를 이용해 트래픽 성능 테스트를 합니다.

 

1. 테스트할 JS 파일을 작성합니다.

import http from 'k6/http';
import { check, group, sleep, fail } from 'k6';

export let options = {
  stages: [ // 테스트 단계, 아래에 설정된대로 테스트가 진행된다.  
    { duration: '1m', target: 100 }, // 먼저 1분 동안 VUser 1에서 100까지 서서히 올린다.
    { duration: '3m',target: 100 }, // Vuser 100에서 3분간 유지한다.
    { duration: '1m', target: 200 }, // 다시 1분간 100에서 200까지 서서히 올린다.
    { duration: '3m',target: 200 }, // Vuser 200에서 3분간 유지한다.
    { duration: '1m', target: 300 }, // 다시 1분간 200에서 300까지 서서히 올린다.
    { duration: '3m',target: 300 }, // Vuser 300에서 3분간 유지한다.
    { duration: '1m', target: 400 }, // 다시 1분간 300에서 400까지 서서히 올린다.
    { duration: '3m',target: 400 }, // Vuser 400에서 3분간 유지한다.
    { duration: '1m', target: 500 }, // 다시 1분간 400에서 500까지 서서히 올린다.
    { duration: '3m',target: 500 }, // Vuser 500에서 3분간 유지한다.
    { duration: '1m', target: 0 }, //1분 동안 Vuser 0으로 내려온다.
  ],

  thresholds: { // 부하 테스트가 언제 성공했다고 할 수 있는지
    http_req_duration: ['p(95)<138'], // 전체 요청의 95%가 138ms 안에 들어오면 성공
  },
};

const BASE_URL = '[테스트할 서버의 URL]';

function getPath(){
  let pathRes = http.get(`${BASE_URL}/test`); // get요청을 진행하고 결과를 리턴

  check(pathRes, { // 결과를 체크
    'success to get response': (res) => res.status === 200,//응답 상태코드가 200이면 성공
  });
}

export default function ()  {//이 default 함수만 테스트동안 계속 실행, 나머지는 1번만
  getPath(); // 경로 검색 페이지를 Get요청하고
};

 

2. K6 다운로드 ( Ubuntu )

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69

echo "deb https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list

sudo apt-get update

sudo apt-get install k6

 

3. K6 실행

k6 run load.js

 

4. Autoscaling

TARGETS의 부하가 증가하고 pod의 Scale Out이 이루어짐을 확인
이후 TARGETS의 부하가 감소하자 pod의 Scale In이 이루어짐을 확인

 

5. 로드밸런싱이 되는지 확인합니다.

Postman으로 POST요청을 보내고 Body값에 requestID를 1 ~ 4 로 4번 요청했을 때

@PostMapping(value = "/", consumes = MediaType.APPLICATION_JSON_VALUE)
public String test2(@RequestBody RequestPayload requestPayload) {
    // 원하는 처리 수행
    System.out.println("requestPayload.getRequestID() : " + requestPayload.getRequestID());
    return "test2 is running";
}

Spring에서 요청받은 requestID를 로그에 출력하게끔 설정하고나서

kubectl logs [확인할 pod의 NAME] -n ingress-nginx

위 명령어로 pod의 로그를 확인하면

request_1, 3은 1번 pod에서 request를 처리했고
request_2, 4는 2번 pod에서 request를 처리했음을 알 수 있습니다.

위 사진처럼 정상적으로 request를 pod간 분산처리하고 있음을 확인할 수 있습니다.

 

[ 참고자료 ]

성능 테스트 가이드 (velog.io)