쿠버네티스(k8s)

[k8s] 쿠버네티스 환경에서 k6로 부하 테스트 해보기 + 리소스 사용량 확인까지

curiousKidd 2025. 4. 3. 16:34
반응형

회사에서 서비스를 쿠버네티스에 띄워두고 있다 보니, 간단한 부하 테스트를 해보고 싶었다. 마침 팀원한테 이런 조언을 들었다.

“E2E 테스트의 request body 참고해서 부하 테스트 해보시면 좋을 것 같아요. 매트릭스 APM 연동도 하시고, 기존 운세DA랑 같은 리소스를 할당한 파드에서 시스템 리소스 사용률도 같이 확인해보시면 좋을 것 같습니다.”

처음 들으면 뭔가 말이 어려운데, 하나씩 정리해보면 생각보다 단순하다.


💡 요약

  1. E2E 테스트에서 쓰는 request body를 부하 테스트에도 활용하자.
  2. APM 연동해서 시스템 내부에서 뭐가 느려지는지도 같이 보자.
  3. 실제 서비스랑 동일한 리소스가 설정된 파드에서 테스트를 돌려서, CPU나 메모리 사용량 변화를 보자.

k6로 부하 테스트 하기

부하 테스트 도구는 여러 개가 있지만, 난 k6를 선택했다. 코드 기반이라 깔끔하고, 쿠버네티스 환경에도 잘 맞는다.

1. 테스트 스크립트 작성하기

기존 E2E 테스트에서 쓰던 요청 형식을 참고해서 아래처럼 script.js를 작성했다.

import http from 'k6/http';
import { check } from 'k6';

export let options = {
  vus: 1,
  iterations: 100,
};

export default function () {
  const requestId = `12345-${__ITER + 1}`; // 요청마다 고유한 ID

  const payload = JSON.stringify({
    intent: {
      id: "",
      name: "",
      extra: {
        reason: {
          code: 1,
          message: "OK"
        }
      }
    }
  });

  const params = {
    headers: {
      'Content-Type': 'application/json',
      'x-request-id': requestId,
    },
  };

  const res = http.post('https://your-api.com/endpoint', payload, params);

  check(res, {
    'status is 200': (r) => r.status === 200,
  });

  console.log(`Request ID: ${requestId}, Status: ${res.status}`);
}

2. 실행 결과에서 전체 소요 시간 확인하기

k6 run script.js

이렇게 실행하면 마지막에 다음처럼 결과가 나온다:

k6 run k6js.js

         /\      Grafana   /‾‾/  
    /\  /  \     |\  __   /  /   
   /  \/    \    | |/ /  /   ‾‾\ 
  /          \   |   (  |  (‾)  |
 / __________ \  |_|\_\  \_____/ 

     execution: local
        script: k6js.js
        output: -

     scenarios: (100.00%) 1 scenario, 20 max VUs, 10m30s max duration (incl. graceful stop):
              * default: 100 iterations shared among 20 VUs (maxDuration: 10m0s, gracefulStop: 30s)


@@@@@@@@@@@@@@@@@

running (00m06.1s), 00/20 VUs, 100 complete and 0 interrupted iterations
default ✓ [======================================] 20 VUs  00m06.1s/10m0s  100/100 shared iters

이게 바로 100건 요청을 처리하는 데 걸린 전체 시간이다. http_req_duration, http_reqs 같은 통계도 함께 확인하면 좋다.


쿠버네티스에서 리소스 사용량 확인하기

팀원이 말한 "리소스를 할당한 파드"라는 말이 처음엔 헷갈렸는데, 이건 파드에 명시적으로 CPU나 메모리 제한을 설정해놨다는 뜻이다.

예를 들어, 이런 식이다:

resources:
  requests:
    memory: "512Mi"
    cpu: "500m"
  limits:
    memory: "1Gi"
    cpu: "1"

그리고 부하 테스트를 돌릴 때는 이 설정이 적용된 파드에서 테스트하는 게 실제 상황을 반영하는 데 더 적절하다.

리소스 확인 명령어

kubectl describe pod <파드이름>

혹은 실시간 사용량은:

kubectl top pod <파드이름>

이걸 테스트 전후로 비교하면 CPU나 메모리가 얼마나 올라갔는지 볼 수 있다.


마무리하며

처음엔 부하 테스트가 좀 막막하게 느껴졌는데, 이렇게 하나하나 테스트 코드 짜고, k6로 요청 수 조절하고, 리소스 사용량도 같이 보니까 꽤 재밌었다. 서버 튜닝이나 병목 잡을 때도 꽤 유용할 것 같다.

혹시 이 과정을 자동화하거나, 쿠버네티스 내부에서 테스트 파드로 띄우는 방식까지 확장해보고 싶으면 Helm이나 CI/CD랑도 엮어보면 좋을 듯!

반응형