시작하기 전에…

지난 포스트[Nginx 서버 배포하기]에서 우리는 앱스(Apps) 서비스를 활용하여 손쉽게 Nginx 구동하고 서비스할 수 있도록 구성 해 보았습니다.

또한 [Nginx에 볼륨 연결하기] 포스트를 통하여 데이터 볼륨을 구성해 보았으며, [Nginx 서버 배포하기 고급(2) – 인그레스 사용] 포스트를 통하여 외부에서 들어온 트래픽을 클러스터 내의 서비스로 라우팅 해 보았습니다.

이번 포스트는 지난 포스트에 이어 이렇듯 클러스터 내의 서비스로  라우팅되는 트래픽양 증가 시 에 Auto scaler를 통하여 자동으로 트래픽을 분산하고 확장할 수 있도록 구성 해 보겠습니다.

Nginx 서버 구동 및 오토스케일링 설정

(지난 포스트 [Nginx 서버 배포하기]를 참조하시면 워크로드 구성에 대해 좀 더 상세한 내용을 확인 하실 수 있습니다.)

이번 포스트에서는 간단히 Nginx 서버를 구성을 따라하면서, 추가로 수평적 확장을 위한 오토스케일링 구성을 진행 해 보겠습니다.

1. Nginx 서버 구성

우선 지난 포스트에서 확인했던 대로 워크로드를 생성해 줍니다. 수평적 확장을 위해서는 아래 그림과 같이 Multi Instance를 선택해 주어야 합니다.

앱스 워크로드 생성 시 Multi Instance 선택

아래와 같이 워크로드 생성 화면에서 워크로드 이름 과 Nginx 컨테이너 정보를 입력 한 이후에 추가적으로, 박스 표시된 오토스케일링 설정 버튼을 클릭하여 수평적 확장이 지원되도록 오토 스케일링 설정을 추가할 수 있습니다.

앱스 워크로드에서 오토스케일링 설정 추가

오토스케일링 설정을 위한 팝업 레이어에서 아래와 같이 CPU와 Memory에 대한 임계치 설정이 가능하고, 최대 몇 개까지 인스턴스를 확장할지 정의할 수 있습니다.

저는 테스트를 위해 CPU와 Memory를 모두 50% 정도로 설정하였고, 최대 인스턴스 갯수는 7개로 설정하였습니다.

앱스 워크로드 오토스케일링 정책 설정 시, CPU와 Memory 임계치 및 최대 복제 수 설정

입력이 완료되면 “적용” 버튼을 클릭하여 아래와 같이 설정된 값이 반영된 것을 확인할 수 있습니다.

앱스 워크로드 오토스케일링 정책 설정 확인

2. 구동중인 Nginx 서버 확인

이제 이미 우리가 알고 있는대로 상단의 “생성” 버튼을 클릭하면 아래와 같이 서버가 구동되는 과정을 확인하실 수 있고, 최종적으로 초록색 Running 상태가 활성화되어 워크로드가 구동중임을 알 수 있습니다.

앱스 Nginx 워크로드 Running 상태 확인

3. Nginx 서비스를 외부로 노출

이제 실제로 Nginx 서비스가 구동중인지 접속하여 확인 해 보겠습니다.

Nginx 접속을 위해 위 그림과 같이 상단 서비스 탭 클릭하여 Nginx 워크로드를 외부로 노출할 수 있도록 서비스 메뉴로 이동해 보겠습니다.

아래 그림은 서비스 메뉴로 이동한 후 서비스 “추가” 버튼을 클릭하여 서비스를 구성중인 화면입니다.

서비스의 유형은 외부 노출을 위해 “Node Port”로 선택 해 주었고, 서비스 명은 nginx-svc로 지정 하였습니다.

( Web Application 구동시 Session 유지를 위한 Sticky Session 설정도 가능하지만 이번 주제와는 관련이 없어 체크 해 주지 않았습니다. )

대상 워크로드중에서 방금 생성한 nginx 워크로드를 선택해 주었고, 포트 추가 버튼을 클릭하여 포트에 대한 설정을 입력 해 주었습니다.

앱스 Nginx 워크로드 NodePort 방식으로 서비스를 외부에 오픈

적용 버튼을 클릭하여 서비스를 생성하여 주면 아래와 같이 호스트에서 사용 가능한 노드포트중 임의의 포트를 할당하여 서비스가 오픈됩니다.

(노드포트를 고정하여 사용하고 싶다면 위 서비스 구성시 노드 포트를 지정하여 입력 해 주면 됩니다.)

앱스 Nginx 워크로드의 서비스 설정 정보 확인

4. Nginx 서비스에 접속하여 정상 동작 확인

위 오픈된 서비스 주소를 클릭하면 아래와 같이 Nginx가 정상 구동중임을 확인하실 수 있습니다.

앱스 브라우저를 통한 Nginx 서비스 접속 화면

다음 섹션에서는 Nginx에 부하를 증가시키고, 멈추는 동작을 반복하여 인스턴스가 자동으로 수평 확장되었다가 줄어드는 모습을 확인하도록 하겠습니다.

부하 증가 및 중지를 통한 인스턴스 수평 확장 및 축소 검증

이제부터 위에서 설정한 Nginx의 오토스케일링 구성이 실제로 올바르게 동작하는지 검증하기 위해 부하를 증가시켜보고 이에 따라 어떻게 반응하는지 살펴보도록 하겠습니다.

저는 MacOS용 Jmeter를 사용하여 부하를 증가시켜보려고 합니다.

아시다시피 이 외에도 다양한 부하 테스트 방법이 있으니 익숙한 방법으로 테스트를 진행하면 되겠습니다.

1. MacOS용 JMeter 설치

MacOS용 JMeter는 아래와 같이 HomeBrew를 통하여 손쉽게 설치가 가능합니다.

Copy to Clipboard

2. MacOS용 JMeter 실행

설치가 완료된 후 아래와 같이 실행 해 주시면 바로 JMeter를 통하여 Stress Test를 시작할 수 있습니다.

Copy to Clipboard

실행이 정상적으로 완료되면 아래와 같이 JMeter가 실행된 화면을 볼 수 있습니다.

Nginx 서비스 성능의 측정을 위한 JMeter 실행 화면

3. 부하 증가

본 포스트는 JMeter 활용법에 대한 내용을 설명하기 위함이 아니므로, JMeter를 활용한 Web Request에 대한 Test Plan은 JMeter 공식 홈페이지의 [Building a Web Test Plan] 섹션을 참고하세요.

저는 1명의 User에서 500명의 user가 될때까지 1초마다 1명씩 User를 증가시키는 플랜으로 Stress Test를 실행 하였습니다.

Test를 시작하고 1분 정도 경과 후 아래 그림과같이 리소스 사용량이 증가하면서 순차적으로 Nginx 인스턴스의 Scale out이 진행되는 모습을 확인하실 수 있습니다.

앱스 Nginx 서비스의 성능 시험 시 Nginx 인스턴스의 Scale out 진행 확인 화면

[참고 : 인스턴스 갯수를 안정화 시키는데 몇 분이 걸릴 수 있으며, 부하의 양은 환경에 따라 다르기 때문에, 최종 인스턴스 개수는 포스트와 다를 수 있습니다.]

4. 부하 중지

JMeter의 Stress Test를 종료하고 워크로드의 상태를 지켜보면 몇 분 후 아래와 같이 확장되었던 인스턴스가 자동으로 축소되어 원래대로 돌아가는 것을 확인할 수 있습니다.

앱스 Nginx 서비스의 성능 시험 종료 시 Nginx 인스턴스의 자동 축소 확인 화면

계속 지켜보면 잠깐의 Pending 상태를 거쳐 아래와 같이 인스턴스가 완전히 종료되는 것을 확인하실 수 있습니다.

앱스 Nginx 서비스의 성능 시험 종료 시 Nginx 인스턴스의 완전 종료 확인 화면

포스트를 마치며…

지금까지 앱스(Apps)를 활용하여 손쉽게 오토스케일링 설정을 해보고, 실제로 서비스의 수평적 확장이 가능한 것을 확인할 수 있었습니다.

AWS와 같은 Public Cloud 서비스에서도 이미 Autoscaling 기능을 제공하고 있고, 이용이 가능합니다.

하지만 이러한 Autoscaling을 이용하기 위해서는 Scale out 이 이루어질때 인스턴스가 사용할 AMI의 스냅샷을 먼저 저장하고, Autoscaling 설정을 해 주어야 하는등의 복잡한 절차가 필요합니다. 이러한 절차로 인하여 CI/CD환경에서 Autoscaling을 운영하는 일은 생각보다 번거로움이 많이 있습니다.

또한, 하나하나의 인스턴스를 구동하는데에는 생각보다 많은 시간이 소요됩니다.

앱스(Apps)는 멀티 클러스터 관리가 가능한 컨테이너 기반의 DevOps 서비스 입니다.

앱스(Apps)에서는 어플리케이션 빌드시 생성되는 컨테이너 이미지를 이용하여 간단히, 그리고 빠른 속도로 배포가 이루어지므로 AMI 복제등의 복잡한 절차 없이 오토스케일링 설정만으로 손쉽게 서비스를 확장/축소 관리할 수 있습니다.

앱스(Apps)는 배포 절차를 자동화 하여, CI/CD 환경에서 개발자가 개발에만 집중할 수 있도록 지속적으로 DevOps 기능을 확장하고 있습니다.

다음에 작성 예정인 포스트중 하나는 [앱스(Apps)에서 컨테이너 기반 빌드 환경을 구성 및 Pipeline 배포] 입니다.

해당 포스트 에서 좀 더 자세한 설명으로 만나뵙겠습니다.