앱 스케일링하기

앱 스케일링하기 (Scale Your App)

출처: 문서

본문

목표 (Objectives)

  • kubectl로 기존 앱을 수동으로 스케일링한다.

시작하기 전에

이 튜토리얼의 셸 명령은 대부분의 Linux·macOS 시스템의 기본 셸(예: bash, zsh, sh)이 지원하는 POSIX 셸 구문을 사용해요. Windows 사용자는 명령을 그대로 실행하려면 Windows Subsystem for Linux (WSL)이나 Git Bash 같은 POSIX 호환 셸을 사용해야 합니다. export, $() 같은 구조를 사용하는 명령은 PowerShell이나 Windows Command Prompt와 호환되지 않습니다.

애플리케이션 스케일링

kubectl create deployment 명령의 --replicas 파라미터를 사용해 처음부터 여러 인스턴스의 Deployment를 만들 수 있다.

앞서 우리는 Deployment를 만들고 Service를 통해 공개적으로 노출했어요. Deployment는 우리 애플리케이션을 실행하는 파드를 하나만 만들었습니다. 트래픽이 증가하면 사용자 수요를 따라잡기 위해 애플리케이션을 스케일링해야 할 것입니다.

이전 섹션을 진행하지 않았다면 minikube로 클러스터 만들기부터 시작하세요.

_스케일링_은 Deployment의 레플리카 수를 변경함으로써 이루어집니다.

이전 섹션 다음에 이 작업을 시도한다면 만든 서비스를 삭제했거나 type: NodePort의 Service를 만들었을 수 있어요. 이 섹션에서는 kubernetes-bootcamp Deployment를 위해 type: LoadBalancer의 서비스가 생성된다고 가정합니다.

이전 섹션에서 만든 Service를 삭제하지 않았다면, 먼저 그 Service를 삭제한 뒤 다음 명령을 실행해 typeLoadBalancer인 새 Service를 만드세요:

kubectl expose deployment/kubernetes-bootcamp --type="LoadBalancer" --port 8080

스케일링 개요

스케일링은 Deployment의 레플리카 수를 변경함으로써 이루어진다.

Deployment를 확장하면 새 파드가 생성되어 사용 가능한 리소스가 있는 노드에 스케줄됩니다. 스케일링은 파드 수를 새 원하는 상태로 늘립니다. 쿠버네티스는 또한 파드의 자동 스케일링을 지원하지만, 이는 이 튜토리얼의 범위 밖입니다. 0으로 스케일링하는 것도 가능하며, 그러면 지정된 Deployment의 모든 파드가 종료됩니다.

애플리케이션의 여러 인스턴스를 실행하려면 그들 모두에 트래픽을 분산할 방법이 필요해요. Service는 노출된 Deployment의 모든 파드에 네트워크 트래픽을 분산할 통합 로드 밸런서를 가집니다. Service는 엔드포인트를 사용해 실행 중인 파드를 지속적으로 모니터링해, 트래픽이 사용 가능한 파드에만 보내지도록 보장합니다.

애플리케이션의 여러 인스턴스가 실행되면 다운타임 없이 롤링 업데이트를 할 수 있게 됩니다. 이는 튜토리얼의 다음 섹션에서 다룰 거예요. 이제 터미널로 가서 애플리케이션을 스케일링해봅시다.

Deployment 스케일링

Deployment를 나열하려면 get deployments 하위 명령을 사용해요:

kubectl get deployments

출력은 다음과 비슷해야 합니다:

NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   1/1     1            1           11m

파드가 1개 있어야 해요. 없다면 명령을 다시 실행하세요. 이것은 다음을 보여줍니다:

  • _NAME_은 클러스터의 Deployment 이름을 나열한다.
  • _READY_는 CURRENT/DESIRED 레플리카의 비율을 보여준다.
  • _UP-TO-DATE_는 원하는 상태를 달성하기 위해 업데이트된 레플리카 수를 표시한다.
  • _AVAILABLE_은 사용자에게 사용 가능한 애플리케이션 레플리카 수를 표시한다.
  • _AGE_는 애플리케이션이 실행된 시간을 표시한다.

Deployment가 만든 ReplicaSet을 보려면 다음을 실행해요:

kubectl get rs

ReplicaSet의 이름이 항상 [DEPLOYMENT-NAME]-[RANDOM-STRING] 형식임을 주목하세요. 무작위 문자열은 랜덤 생성되며 pod-template-hash를 시드로 사용합니다.

이 출력의 두 가지 중요한 열은:

  • _DESIRED_는 Deployment를 만들 때 정의한 애플리케이션의 원하는 레플리카 수를 표시한다. 이것이 원하는 상태이다.
  • _CURRENT_는 현재 실행 중인 레플리카 수를 표시한다.

이제 Deployment를 4개의 레플리카로 스케일링해봅시다. kubectl scale 명령에 Deployment 유형, 이름, 원하는 인스턴스 수를 이어서 사용할 거예요:

kubectl scale deployments/kubernetes-bootcamp --replicas=4

get deployments로 Deployment를 다시 나열해요:

kubectl get deployments

변경이 적용되었고 애플리케이션의 4개 인스턴스가 사용 가능합니다. 이제 파드 수가 변경되었는지 확인해봅시다:

kubectl get pods -o wide

이제 서로 다른 IP 주소를 가진 파드가 4개 있습니다. 변경은 Deployment 이벤트 로그에 기록되었습니다. 확인하려면 describe 하위 명령을 사용해요:

kubectl describe deployments/kubernetes-bootcamp

이 명령의 출력에서도 이제 레플리카가 4개임을 볼 수 있습니다.

로드 밸런싱

Service가 트래픽을 로드 밸런싱하는지 확인해봅시다. 노출된 IP와 Port를 찾으려면 튜토리얼 이전 부분에서 배운 대로 describe service를 사용할 수 있어요:

kubectl describe services/kubernetes-bootcamp

Node 포트를 값으로 하는 NODE_PORT라는 환경 변수를 만들어요:

export NODE_PORT="$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')"
echo NODE_PORT=$NODE_PORT

다음으로 노출된 IP 주소와 포트에 curl을 실행할 거예요. 명령을 여러 번 실행해보세요:

curl http://"$(minikube ip):$NODE_PORT"

매 요청마다 다른 파드에 도달합니다. 이는 로드 밸런싱이 동작하고 있음을 보여줍니다.

출력은 다음과 비슷해야 합니다:

Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-644c5687f4-wp67j | v=1
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-644c5687f4-hs9dj | v=1
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-644c5687f4-4hjvf | v=1
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-644c5687f4-wp67j | v=1
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-644c5687f4-4hjvf | v=1

컨테이너 드라이버로 Docker Desktop과 함께 minikube를 실행 중이라면 minikube 터널이 필요해요. Docker Desktop 안의 컨테이너가 호스트 컴퓨터와 격리되어 있기 때문입니다.

별도의 터미널 창에서 다음을 실행해요:

minikube service kubernetes-bootcamp --url

출력은 다음과 같습니다:

http://127.0.0.1:51082
!  Because you are using a Docker driver on darwin, the terminal needs to be open to run it.

그런 다음 주어진 URL을 사용해 앱에 접근해요:

curl 127.0.0.1:51082

스케일 다운

Deployment를 2개 레플리카로 스케일 다운하려면 scale 하위 명령을 다시 실행해요:

kubectl scale deployments/kubernetes-bootcamp --replicas=2

get deployments 하위 명령으로 변경이 적용되었는지 확인하기 위해 Deployment를 나열해요:

kubectl get deployments

레플리카 수가 2로 줄었습니다. get pods로 파드 수를 나열해요:

kubectl get pods -o wide

이것은 파드 2개가 종료되었음을 확인해줍니다.

더 알아보기 (Learn more)