회사에서 서비스를 쿠버네티스에 띄워두고 있다 보니, 간단한 부하 테스트를 해보고 싶었다. 마침 팀원한테 이런 조언을 들었다.
“E2E 테스트의 request body 참고해서 부하 테스트 해보시면 좋을 것 같아요. 매트릭스 APM 연동도 하시고, 기존 운세DA랑 같은 리소스를 할당한 파드에서 시스템 리소스 사용률도 같이 확인해보시면 좋을 것 같습니다.”
처음 들으면 뭔가 말이 어려운데, 하나씩 정리해보면 생각보다 단순하다.
💡 요약
- E2E 테스트에서 쓰는 request body를 부하 테스트에도 활용하자.
- APM 연동해서 시스템 내부에서 뭐가 느려지는지도 같이 보자.
- 실제 서비스랑 동일한 리소스가 설정된 파드에서 테스트를 돌려서, 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랑도 엮어보면 좋을 듯!
'쿠버네티스(k8s)' 카테고리의 다른 글
[k8s] Kubernetes Canary 사용시 주의사항 (1) | 2025.04.11 |
---|---|
[k8s] Kubernetes Canary 배포 삽질기 (0) | 2025.04.07 |
[k8s] Kubernetes canary 사용기 (0) | 2025.04.04 |
쿠버네티스에서 HPA와 VPA를 동시에 사용하면 안 되는 이유 (0) | 2024.08.14 |
쿠버네티스에서 QoS와 트래픽 손실 방지 방법 (0) | 2024.08.08 |