# 시나리오는 아래와 같다.
# 현재 상황
EC2로 서비스 하고 있는 쇼핑몰이 있다고 치자. 근데 이 쇼핑몰은 분기별 재고를 처리하기 위해 분기별로 대폭 할인 이벤트를 약 5일간 실시한다. 근데 문제는 이벤트를 할때마다 사용자가 몰려서 매번 다운이 된다.
(물론 현재 대기자가 몇명 입니다... 라는 안내메세지를 출력하여 부하를 줄일수는 있다.)
현재 해결책으로는 CloudWatch의 로그를 분석하여 이벤트가 발생하기 하루전에 인스턴스를 추가로 생성하거나 타입을 고사양으로 올리는 작업을 수동으로 진행중이다.
AG를 물론 걸어 놓았지만 일시적 트래픽이 증가하는 구간에는 서비스 단절이 발생하므로, 서비스가 중지가 되는건 어쩔수 없는 상태이다. 이를 어떻게 극복할 수 있을까?
- 현재 상황을 설명
# 개선을 해보까?
일단 나같은 모지리가 생각할때는 ELB와 TG를 활용해서 부하를 일단 나눠주는 작업을 해주면 어떨까 싶은 생각이 들었다.
음... 테스트를 해봐야 알겠지만, 아래와 같은 그림으로 구성을 해볼까 한다.
- 개선 아키텍처를 그려보면 아래와 같다.
부하가 퐉~ 발생하면 일단 0.2대 0.8의 비율로 EC2와 EKS로 나눠서 로드밸런싱을 한다.
EKS 같은 경우에 CA를 설정하게 되면 인스턴스 생성 속도는 초단위로 가능하므로, 부하를 견디는데 최적화 되어 있다.
그리고 AG와 HPA같은 설정도 적절히 잘 설정해 놓으면 부하를 대응하는 입장에서 매우 효율적인 방법이 될거 같다.
그리고 또한 부하가 발생하지 않는 비수기일 경우 EKS는 Terraform과 같은 iac 도구를 활용해서 삭제해 놓고 있다가, 이벤트 발생 전에 생성을 해서 연결만 해주는 방식으로 세팅을 하면 비용 효율적 측면에서도 유용할거 같다.(물론 비추, 노드 그룹을 컨트롤 하여 노드만 삭제하는걸 추천)
그러니까 결론은 평소에는 EC2로 서비스하다가 부하가 발생할때 EKS로 구성된 타겟그룹을 연결하여 서비스를 하면 된다? 그렇다면 굳이 이렇게 할 필요가 있냐? 이벤트 발생할때만 수동으로 자원을 늘려주면 되지 않냐? 라는 질문을 할 수 있는데... 관리포인트가 늘어난다던지? 여러가지 문제를 고려해 볼 수 있는데 일단 테스트 시나리오이기 때문에 그리고 타겟그룹에 EKS 인스턴그 그룹을 연결하여 구성을 해본다는데에 의의를 두면 어떨까 싶다. (그러니까 아무도 안해본거니까 한번 해보자?)
일단은 가장 중요한 비용부분 먼저 생각해보면, EKS 클러스터만 1달에 80불정도 한다. 거기에 노드그룹에 EC2 들 t3.medium 같은 경우는 한달 1대에 24불정도 (eks에서 사용하는 인스턴스는 일반 인스턴스보다 비용이 저렴 하므로 24불 보다 싸다.) 어쨌든 eks 클러스터 + t3medium 인스턴스 3대 = 152불정도 발생한다. +-50불 정도 했을때 100~200불정도의 요금이 발생한다고 보면 된다. 게다가 CloudWatch 스케줄링을 통해 eks 인스턴스의 노드들이 놀고 있다면 3개에서 1개로 줄여버릴수 있다. 그러면 비용은 더 절약될 것이다. 그러니까 비용적 측면을 고려해보면 뭐 조직이나 서비스의 성향에 따라 다를수 있겠지만 공수 측면에서 수동으로 일일이 세팅하는것보다 한번 세팅해놓고 자유자제로 늘었다 줄었다 하면서 트래픽을 견디는게 더 좋지 않을까? 그리고 사람은 잠은 자야 하므로, 우리나라 새벽 2시30분에 갑자기 외국에서 사람들이 개떼처럼 몰려들면... 갑작스런 트래픽 증가에 대한 대응또한 떨어지게 되므로, 그냥 돈좀 쓰더라도 맘 편하게 세팅해놓고 밤에 잠 잘자는게 정신건강에 좋다고 생각한다. 물론 여기까지는 가정된 시나리오이다.
말이 길어졌는데, 테스트 환경을 구성 해보면서 일일이 검증을 해보자.