본문 바로가기
dev/kubernetes

nGrinder on K8S

by igooo 2024. 7. 25.
728x90

개요

nGrinder를 다시 설치해야 하는 일이 생겨서 찾아보다가 K8S에 설치하여 사용할 수 없는지 찾아보다가 Docker HUB에 이미지가 업로드되어 있는 것을 보고 K8S에 설치하여 사용했다.

 

Install

Docker Image

docker hub에 공식 이미지가 있어서 바로 설치하여 사용가능하다.

https://hub.docker.com/r/ngrinder/controller

K8S

K8S에서 위 Docker 이미지를 구동을 위해서는 Deployment 파일을 작성하여 Controller와 Agent 인스턴스 실행이 필요한데 이것도 이미 작성해 주신 분이 있다. 

참고 : https://github.com/KesavanKing/ngrinder-k8s

Deployment 파일들은 받아서 resource: {} 부분에 limit, request 리소스 설정만 변경해 줬고, VM에서 실행할 때는 JVM 옵션도 추가해서 사용했었는데 ngrinder 컨트롤러 이미지를 보면 내부적으로 "/scripts/run.sh"를 실행하고 있는데 별도로 JVM 옵션을 추가할 수 있는 방법은 없어 보인다. 

작성일(2024-07-25) 기준 최신 이미지는 3.5.9인데 해당 해당 버전은 test script 검증 시 오류가 발생하여 3.4.x 버전으로 낮춰서 설치했다.

 

agent-deployment.yaml

spec.replicas : agent 인스턴스 개수를 설정할 수 있는데 본인의 설정에 맞게 변경하여 사용한다.

spec.template.spec.containers.resources : limit, request를 설정한다. 간혹 부하가 많은 테스트의 경우 Agent Pod에 사용량이 많아 서비스중인 다른 Pod에 처리량이 낮아지는 경우가 있어서 적절한 값을 설정하여 사용하는 것을 추천한다.

 

 

Test Script

nGrinder를 설치한 이유가 파일 업로드 API에 이슈가 있어서 성능 테스트를 위해서 설치했다. 간단한 파일 업로드 Test 스크립트도 공유한다. 파일은 MultiPart, Stream 두 가지 방법으로 업로드가 가능하여 두 가지 방법으로 모두 테스트를 하는 스크립트다.

@Test
public void multipart() {
    Random rand = new Random();

    NVPair[] params = [];
    NVPair[] headers = [new NVPair("Content-Type", "multipart/form-data")];
    NVPair[] files = [new NVPair("file", uploadFiles[rand.next(uploadFiles.length)])];
    
    def data = Codecs.mpFormDataEncode(params, files, headers);
    request.setHeader(headers);
    
    HttpResponse result = request.POST("upload url", data);
    
    if(result.statusCode ==301 || result.statusCode == 302) {
    	grinder.logger.warn("Waring. ....");
    } else {
    	assertThat(result.statusCode, is(200));
    }
}


@Test
public void stream() {
    Random rand = new Random();
    
    NVPair[] params = [];
    byte[] file = Files.readAllBytes(uploadFiles[rand.next(uploadFiles.length)])]);
    
    def data = Codecs.cunkedEncode(fils, params, true);    
    
    HttpResponse result = request.POST("upload url", data);
    
    if(result.statusCode ==301 || result.statusCode == 302) {
    	grinder.logger.warn("Waring. ....");
    } else {
    	assertThat(result.statusCode, is(200));
    }
}

 

 

참고

'dev > kubernetes' 카테고리의 다른 글

Kubernetes - Pods  (0) 2024.07.04
Kubernetes - Service  (0) 2024.07.02