Scale up (Vertical Scaling)

서버 한 대의 사양을 높이는 것을 말합니다. CPU 코어 수를 늘리거나, 메모리 용량을 확장하거나, GPU를 추가하는 방식입니다. 간단하게 한 대를 더 세게! 만드는 것입니다.
수직 확장은 확장 과정이 비교적 간단하다는 장점이 존재합니다. 하지만, 인간이 지금까지 만들어낸 단일 컴퓨팅 파워에는 한계가 존재하므로 수직 확장은 확장의 한계가 분명히 존재합니다. 또한, 요구되는 스펙 수준이 높아질수록 더 많은 비용을 지불해야합니다.
그리고 서버의 스펙을 업그레이드 할 때 발생하는 다운타임을 피할 수 없습니다. 중요한 것은 단일 서버로 서비스를 운영하기 때문에 하나의 서버로 부하가 집중되는 문제점입니다. 서비스가 하나의 서버로 운영되기 때문에 하나의 시스템에서 문제가 발생하면, 모든 시스템을 사용할 수 없게 됩니다. 즉, 장애에 치명적입니다.
따라서 일반적으로 수직 확장은 데이터 일관성, 무결성이 중요한 데이터베이스 서버에 적합한 방식입니다. 한 서버가 모든 트랜잭션을 관리하니 데이터 일관성과 무결성을 유지하기 쉽기 때문입니다.
Scale out (Horizontal Scaling)

운영중인 서버의 부품을 더 좋은 것으로 바꾸는 대신, 서버의 대수를 늘리는 방식입니다. 즉, 동일한 서비스를 여러 대 서버에 띄우고, 부하를 나누어 처리하는 것입니다.
수평 확장은 수직 확장과 다르게 여러 서버를 한 서버처럼 사용하기 위한 클러스터링 작업에 추가 비용이 발생합니다. 예를 들어 EC2 인스턴스를 여러 대 만들어서 같은 웹 서버를 돌리고 로드 밸런서를 통해 트래픽을 분산하는 방식이 있습니다. 이 방식은 이론적으로 확장에 제한이 없어 무한대로 확장할 수 있고, 서버 하나가 장애가 나더라도 서비스 전체는 살아있을 수 있습니다.
특히, 오늘날의 서비스들은 일반적으로 사용자 수를 예측하기가 어렵습니다. 또한 이벤트 페이지 등 특정 기간, 특정 시간대에만 유저 수요가 급격히 증가할 수도 있습니다. 이런 특성으로 대부분의 웹 서비스의 서버는 수평 확장을 사용합니다. 유저의 수요가 급증할 때 서버를 여러 대 확보하고, 유저 수요가 안정화된 이후에 서버 수를 줄이면 되기 때문입니다.
Why Do We Need Kubernetes?

이처럼 EC2 여러 개를 띄워서 로드밸런서로 트래픽을 분산하면 수평 확장이 가능합니다. 다만 문제는 관리입니다. 컨테이너를 띄우면 각 서버에 Docker를 설치하고, 버전을 맞추고 환경 변수를 세팅하고, 새 서버를 추가할 때 일일이 배포 스크립트를 돌려야합니다. 롤링 배포, 장애 자동 복구 등 같은 것도 직접 구현해야하고, 서버가 늘어나면 이런 관리 작업이 매우 복잡해집니다.
여기서 쿠버네티스(Kubernetes)가 필요해집니다. 쿠버네티스는 컨테이너 기반 애플리케이션의 수평 확장을 자동화하고, 배포와 운영을 표준화하는 플랫폼입니다.
쿠버네티스는 서버별로 사람이 직접 컨테이너를 띄우지 않아도 되도록 자동으로 배포하고 관리해줍니다. 새 서버가 클러스터에 추가되면 자동으로 등록하고, 기존과 동일한 환경으로 컨테이너를 배포합니다. 컨테이너를 Pod 라는 단위로 관리하고, 어떤 노드(서버)에 어떤 Pod를 배치할지 스케줄링 합니다. 즉, Pod를 적절한 노드에 자동 배치해서 자원을 효율적으로 쓰게 합니다. 또한 쿠버네티스는 서비스의 상태를 지속적으로 감시해 Pod가 실패하면 자동으로 재시작하거나 다른 노드로 옮겨서 장애 복구를 처리합니다. 롤링 업데이트도 지원해 무중단으로 안전하게 새 버전을 배포할 수 있습니다.
What is Auto Scaling?
또 중요한 기능은 바로 오토스케일링 기능입니다. 오토스케일링(Auto Scaling)이란, 애플리케이션의 부하나 사용량 변화에 따라 컨테이너(Pod) 수나 서버(노드) 수를 자동으로 늘리거나 줄여서 리소스를 효율적으로 사용하는 기능입니다. 쿠버네티스의 오토스케일링 기능은 대표적으로 두 가지가 있습니다.
첫째, Horizontal Pod Autoscaler(HPA)는 CPU 사용량이나 커스텀 메트릭을 기준으로 Pod 개수를 자동으로 늘리고 줄입니다. 예를 들어, 트래픽이 몰리면 Pod를 2개에서 10개로 늘려 처리량을 높입니다. 즉, Pod 수를 스케일링 하는 것입니다.
둘째, Cluster Autoscaler는 클러스터의 노드가 부족하면, 클라우드에서 새로운 노드를 자동으로 생성하고, 필요 없을 때는 제거합니다. 즉, 노드(서버) 수를 스케일링 하는 것입니다. 예를 들어, GPU 노드풀을 따로 만들어 AI 추론 Pod를 거기에만 배치하면 GPU 자원을 필요한 서비스에만 효율적으로 사용할 수 있습니다. 또한 오토스케일링을 통해 사용량이 늘어나면 GPU 노드를 자동으로 추가하고, 줄어들면 자동으로 줄여서 비용을 최적화할 수 있습니다.
Ref.
