이 튜토리얼에서는 외부 애플리케이션 부하 분산기를 사용하여 여러 리전에 프로비저닝된 Compute Engine VM에서 실행되는 Microsoft 인터넷 정보 서비스(IIS) 웹 서버에 트래픽을 분산하는 방법을 설명합니다.
목표
이 튜토리얼에서는 www.example.com
사이트의 트래픽 부하를 분산하는 방법을 확인하고 다음을 확인합니다.
- 들어오는 요청이 가장 가까운 리전으로 라우팅되는가
- 인스턴스가 실패하거나 용량에 도달하면 같은 리전 또는 다른 리전의 다른 응답적인 인스턴스로 부하 분산기가 요청을 라우팅하는가
이 시나리오 구성에는 단일 전역 IP 주소를 통해 요청을 수행하는 외부 애플리케이션 부하 분산기가 사용됩니다. 이 IP 주소는 각 수신 요청을 연결 유형, 즉 HTTP 또는 HTTPS인지에 따라 라우팅할 수 있습니다. HTTPS 요청의 경우에는 부하 분산기가 요청을 전송하는 클라이언트와 부하 분산기 간에 SSL/TLS 암호화를 구현합니다.
다음 다이어그램은 부하 분산기 아키텍처를 보여줍니다.
부하 분산기에는 구성 가능성을 최대한 지원하기 위해 여러 가지 구성요소가 포함됩니다. 각 구성 요소의 기능에 대한 설명은 외부 애플리케이션 부하 분산기 개요를 참조하세요.
이 튜토리얼에서는 목표를 달성하기 위해 다음 작업을 완료하는 방법을 보여줍니다.
- 백엔드 인스턴스 설정하기
- 부하 분산 서비스를 만들고 구성하기
- 백엔드로 트래픽 전송하기
- 백엔드에 대한 액세스 제한하기
- 중단 시뮬레이션하기
비용
이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.
- Compute Engine virtual machine (VM) instances
- Compute Engine persistent disks
- Optional: Google-managed SSL certificate
- Windows Server 2016 machine images
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.
시작하기 전에
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Compute Engine, BigQuery, and Cloud Firestore APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Compute Engine, BigQuery, and Cloud Firestore APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- 원격 데스크톱 프로토콜(RDP) 클라이언트를 설치합니다. 자세한 내용은 Microsoft 원격 데스크톱 클라이언트를 참조하세요. 이미 RDP 클라이언트가 설치되어 있으면 이 태스크를 건너뛰어도 됩니다.
- 리소스를 프로비저닝할 영역과 리전을 결정합니다. 아키텍처 다이어그램에서는 미국 리전과 EU 리전의 여러 영역에 배포된 리소스를 보여줍니다. 이는 참조용입니다. 원하는 리전/영역에 리소스를 배포할 수 있습니다.
- 선택사항: 외부 애플리케이션 부하 분산기 개요를 읽고 숙지하세요.
백엔드 인스턴스 설정
이 섹션에서는 서로 다른 리전에 두 백엔드 서비스를 만듭니다. 각 백엔드 서비스에는 백엔드 인스턴스 2개가 포함되며, 각 인스턴스는 Windows Server 2016에서 Microsoft IIS 웹 서버를 실행합니다. 각각의 서버를 힘들게 구성할 필요 없이 한 서버 인스턴스에서 디스크 이미지를 만든 후 이 이미지를 사용해 다른 서버 인스턴스를 만들면 됩니다.
Compute Engine 인스턴스 만들기 및 구성
소스 이미지로 사용할 인스턴스를 만들려면 다음 안내를 따르세요.
Google Cloud Marketplace에서 원하는 영역의 Compute Engine에서 Microsoft IIS를 실행하는 Windows Server 2016 인스턴스를 시작하고 소스 이미지에 외부 HTTP, HTTPS, RDP 트래픽을 허용하도록 방화벽 규칙을 설정하세요.
Google Cloud 콘솔에서 ASP.NET Framework Cloud Marketplace 페이지로 이동합니다.
실행을 클릭합니다.
배포 이름 필드에 src-img를 입력합니다.
영역 필드에서 이미지를 배포할 영역을 선택합니다.
Windows Server OS 버전 필드에서 2016을 선택합니다.
네트워킹 - 방화벽 섹션에서 다음 옵션만 선택합니다.
- HTTP 트래픽 허용
- HTTPS 트래픽 허용
- RDP 트래픽 허용
서비스 약관에 동의한 후 배포를 클릭합니다.
Compute Engine 인스턴스가 생성될 때까지 기다립니다.
소스 이미지 인스턴스 구성
새 소스 이미지 인스턴스를 구성하려면 소스 이미지 인스턴스에 새 Windows 사용자를 만들고 RDP 연결을 설정합니다.
Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.
소스 이미지 인스턴스의 이름을 클릭합니다(
src-img
).Windows 비밀번호 설정을 클릭합니다.
새 Windows 비밀번호 설정 대화상자에서 사용자 이름을 추가하고 설정을 클릭해 인스턴스에 사용자 계정을 만듭니다.
제공된 비밀번호를 복사하고 대화상자를 닫습니다.
RDP 드롭다운을 클릭하고 RDP 옵션을 선택하여 인스턴스용 RDP 파일을 다운로드합니다. 이 파일을 사용하여 RDP 클라이언트를 사용하는 인스턴스에 연결합니다. 자세한 내용은 Microsoft 원격 데스크톱 클라이언트를 참조하세요.
소스 이미지 인스턴스를 사용하여 RDP 연결을 설정한 후 IIS 기본 웹 디렉터리에 기본 홈페이지를 추가합니다.
소스 이미지 인스턴스에서 PowerShell을 관리자 권한으로 엽니다.
기본 IIS 웹 디렉터리
C:\inetpub\wwwroot
에 새 홈페이지를 만듭니다.Echo '<!doctype html><html><body><h1>Hello World!</h1></body></html>' > C:\inetpub\wwwroot\index.html
소스 이미지 인스턴스에서 콘텐츠를 제공할 수 있는지 확인
Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.
인스턴스의 외부 IP 주소를 클릭하여 앞서 만든 홈페이지를 제공하는지 확인합니다.
소스 이미지 인스턴스에서 재사용 가능한 Windows Server 2016 이미지 만들기
소스 이미지 인스턴스가 제대로 구성되었고 콘텐츠를 제공할 수 있는지 확인한 후 인스턴스의 루트 영구 디스크에서 재사용 가능한 디스크 이미지를 만듭니다.
- 소스 이미지 인스턴스에서 PowerShell을 관리자 권한으로 엽니다.
다음 명령어를 실행해 시스템의 복제를 준비합니다.
GCESysprep
GCESysprep
작업이 완료되면 RDP 세션에서 연결이 자동으로 끊어집니다.로컬 머신에서 다음 명령어를 실행하여 루트 영구 디스크는 보존한 상태로 소스 인스턴스를 삭제합니다.
gcloud compute instances delete src-img \ --keep-disks=boot \ --zone=INSTANCE_ZONE
INSTANCE_ZONE
을 소스 인스턴스 영역으로 바꿉니다.인스턴스를 삭제한 후 유지된 루트 영구 디스크에서 새 이미지를 만듭니다.
gcloud compute images create win-be-img \ --source-disk=src-img \ --source-disk-zone=IMAGE_ZONE
IMAGE_ZONE
을 소스 이미지를 만들 영역으로 바꿉니다.
소스 이미지를 사용해 인스턴스 템플릿 만들기
구성된 Windows 서버에서 디스크 이미지를 인스턴스 템플릿의 소스 이미지로 사용합니다. 나중에 새 인스턴스에 이 템플릿을 사용하도록 관리형 인스턴스 그룹 2개를 구성합니다.
로컬 머신에서 다음 명령어를 실행하여 win-be-img
를 소스 이미지로 사용하고 rdp-tag
및 www-tag
를 인스턴스 태그로 사용하는 인스턴스 템플릿을 만듭니다.
gcloud compute instance-templates create win-be-tmpl \ --tags=rdp-tag,www-tag \ --image=win-be-img
각 리전의 관리형 인스턴스 그룹 만들기
각 리전에서 관리형 인스턴스 그룹을 만듭니다. 각 인스턴스 그룹을 만든 후 앞에서 정의한 인스턴스 템플릿을 기준으로 2개의 동일한 인스턴스가 그룹에 자동으로 채워집니다. 나중에 이러한 인스턴스 그룹을 백엔드 대상으로 취급하도록 부하 분산기를 구성합니다.
관리형 인스턴스 그룹을 만드는 방법은 다음과 같습니다.
로컬 머신에서 다음 명령어를 실행하여 이미지를 만든 영역에 새 관리형 인스턴스 그룹을 만듭니다. 그러면 같은 인스턴스 두 개가 자동으로 채워집니다.
gcloud compute instance-groups managed create MANAGED_INSTANCE_GROUP_NAME_1 \ --base-instance-name=BASE_INSTANCE_NAME_1 \ --size=2 \ --zone=ZONE_1 \ --template=win-be-tmpl
다음을 바꿉니다.
MANAGED_INSTANCE_GROUP_NAME_1
: 관리형 인스턴스 이름BASE_INSTANCE_NAME_1
: 기본 인스턴스 이름ZONE_1
: 관리형 인스턴스를 배포할 영역
두 번째 영역에 관리형 인스턴스 그룹을 만드세요.
gcloud compute instance-groups managed create MANAGED_INSTANCE_GROUP_NAME_2 \ --base-instance-name=BASE_INSTANCE_NAME_2 \ --size=2 \ --zone=ZONE_2 \ --template=win-be-tmpl
다음을 바꿉니다.
MANAGED_INSTANCE_GROUP_NAME_2
: 관리형 인스턴스 이름BASE_INSTANCE_NAME_2
: 기본 인스턴스 이름ZONE_2
: 관리형 인스턴스를 배포할 영역
백엔드 인스턴스의 실행 상태 확인
Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.
각 백엔드의 외부 IP 주소를 클릭해 백엔드에서 앞서 만든 홈페이지를 제공하는지 확인합니다.
부하 분산 서비스 만들기 및 구성
Compute Engine 부하 분산 서비스에는 여러 가지 구성요소가 포함됩니다. 이 섹션에서는 이러한 구성요소를 만들고 이를 서로 연결합니다.
로컬 머신에서 다음 명령어를 실행하여 새 상태 확인을 만듭니다. 부하 분산기는 이 상태 점검을 사용하여 백엔드 인스턴스의 응답성을 확인합니다.
gcloud compute http-health-checks create basic-check
백엔드 서비스를 만듭니다.
gcloud compute backend-services create BACKEND_SERVICE_NAME \ --protocol=HTTP \ --http-health-checks=basic-check \ --global
BACKEND_SERVICE_NAME
을 백엔드 서비스 이름으로 바꿉니다.인스턴스 그룹을 백엔드 서비스의 백엔드 대상으로 추가합니다.
gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --instance-group=MANAGED_INSTANCE_GROUP_NAME_1 \ --instance-group-zone=ZONE_1 gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --instance-group=MANAGED_INSTANCE_GROUP_NAME_2 \ --instance-group-zone=ZONE_2
수신되는 모든 요청을 내 모든 인스턴스로 전달하는 기본 URL 맵을 만듭니다.
gcloud compute url-maps create lb-map \ --default-service=BACKEND_SERVICE_NAME
SSL 인증서 리소스를 만듭니다. 부하 분산기가 이 리소스를 사용하여 트래픽을 암호화하고 복호화합니다.
비공개 키와 인증 기관의 SSL 인증서가 이미 있으면 이를 사용해서 다음 명령어를 실행하여 새
SSLCertificate
리소스를 만들 수 있습니다. 그렇지 않으면 테스트를 위해 Google 관리 SSL 인증서 또는 자체 서명 인증서를 만들어 사용할 수 있습니다. 자세한 내용은 SSL 인증서를 참조하세요.SSL 인증서 리소스를 만들려면 다음 명령어를 실행합니다.
gcloud compute ssl-certificates create www-cert \ --certificate CRT_FILE_PATH \ --private-key KEY_FILE_PATH
다음을 바꿉니다.
CRT_FILE_PATH
: 인증서의 로컬 파일 경로KEY_FILE_PATH
: 비공개 키의 파일 경로
대상 HTTP 및 HTTPS 프록시를 만들어 URL 맵에 요청을 라우팅합니다. 프록시는 HTTPS 부하 분산을 위해 SSL 인증서를 포함하는 부하 분산기의 일부분이므로 이 단계에서 인증서도 로드합니다.
gcloud compute target-http-proxies create http-lb-proxy \ --url-map=lb-map gcloud compute target-https-proxies create https-lb-proxy \ --url-map lb-map \ --ssl-certificate SSL_CERT
다음을 기준으로 SSL_CERT를 바꿉니다.
- SSL 인증서 및 비공개 키를 사용하여 SSLCertificate 리소스를 만든 경우
SSL_CERT
를 www-cert로 바꿉니다. - Google 관리형 또는 자체 서명 SSL 인증서를 사용하는 경우
SSL_CERT
를 인증서 이름으로 바꿉니다.
- SSL 인증서 및 비공개 키를 사용하여 SSLCertificate 리소스를 만든 경우
부하 분산기가 트래픽을 안정적으로 수신할 수 있도록 전역 고정 IP 주소를 부하 분산기의 전역 전달 규칙에 할당해야 합니다.
전역 고정 IP 주소 리소스를 만들려면 다음 명령어를 실행합니다.
gcloud compute addresses create lb-ip \ --global \ --network-tier=PREMIUM
IP 주소를 메모해 둡니다.
수신되는 HTTP 및 HTTPS 요청을 처리하는 전역 전달 규칙 2개를 만듭니다. 각 전달 규칙은 지정된 IP 주소, IP 프로토콜, 포트에 따라 생성된 대상 프록시 중 하나로 트래픽을 전송합니다.
-
전역 외부 애플리케이션 부하 분산기의 경우 gcloud CLI 명령어를
load-balancing-scheme=EXTERNAL_MANAGED
와 함께 사용합니다. 이 설정은 고급 트래픽 관리 기능을 제공합니다. - 기본 애플리케이션 부하 분산기의 경우
load-balancing-scheme=EXTERNAL
을 사용합니다.
gcloud compute forwarding-rules create http-fwd-rule \ --load-balancing-scheme=LOAD_BALANCING_SCHEME \ --network-tier=PREMIUM \ --address=lb-ip \ --global \ --target-http-proxy=http-lb-proxy \ --ports=80 gcloud compute forwarding-rules create https-fwd-rule \ --load-balancing-scheme=LOAD_BALANCING_SCHEME \ --network-tier=PREMIUM \ --address=lb-ip \ --global \ --target-https-proxy=https-lb-proxy \ --ports=443
-
전역 외부 애플리케이션 부하 분산기의 경우 gcloud CLI 명령어를
전역 전달 규칙을 만든 후 구성을 적용하기까지 몇 분이 걸릴 수 있습니다. 적용 진행 상황을 확인하려면 Google Cloud 콘솔에서 구성을 모니터링하거나 로컬 머신에서 다음 명령어를 실행합니다.
gcloud compute backend-services get-health BACKEND_SERVICE_NAME
백엔드로 트래픽 전송
부하 분산 서비스를 구성했으므로 이제 전달 규칙으로 트래픽을 전송하고 다른 인스턴스로 분산되는 트래픽을 살펴볼 수 있습니다.
다음과 같이 트래픽을 백엔드로 전송합니다.
Google Cloud 콘솔에서 부하 분산 페이지로 이동합니다.
프런트엔드 탭을 선택합니다.
기본 홈페이지를 보려면 주소 열에서 IP 주소를 클릭합니다.
백엔드 액세스 제한
모든 것이 제대로 작동하는지 확인한 후 HTTP 또는 HTTPS 트래픽이 부하 분산 서비스에서만 들어올 수 있도록 방화벽 규칙을 수정합니다.
Google Cloud 콘솔에서 방화벽 페이지로 이동합니다.
포트
tcp:80
에 대한 외부 액세스를 허용하는 방화벽 규칙의 이름을 클릭합니다.수정을 클릭하여 방화벽 규칙을 수정합니다.
소스 IPv4 범위 필드에서
0.0.0.0/0
값을 삭제하고 130.211.0.0/22를 입력합니다. 이렇게 하면 방화벽 규칙에서 허용하는 소스 IP는 HTTPS 부하 분산 상태 점검 IP 범위인130.211.0.0/22
범위로 제한됩니다.저장을 클릭합니다.
Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.
각 인스턴스의 외부 IP 주소를 클릭하여 지금 인스턴스에 액세스할 수 없는지 확인합니다.
중단 시뮬레이션
응답성 있는 인스턴스 간 부하 분산 방법을 확인하기 위해서는 한 리전의 하나 이상의 인스턴스에 대해 중단을 시뮬레이션할 수 있습니다.
인스턴스의 추가 요청 수신을 중지하는 방법은 다음과 같습니다.
- 인스턴스로의 RDP 연결을 설정합니다.
- 인스턴스에서 PowerShell을 관리자 권한으로 엽니다.
다음 명령어를 실행하여 인스턴스에 새 방화벽 규칙을 만듭니다. 이 명령어는 상태 검사기의 상태 확인 트래픽을 차단하고 부하 분산기에서 인스턴스로 향하는 새 HTTP 연결을 모두 막습니다.
netsh advfirewall firewall add rule name="Outage Test" protocol=tcp dir=in localport=80 action=block remoteip=130.211.0.0/22
로컬 머신에서 다음 명령어를 실행해 인스턴스가
UNHEALTHY
상태를 보고하는지 확인합니다.gcloud compute backend-services get-health BACKEND_SERVICE_NAME
인스턴스가
UNHEALTHY
상태를 보고하기 시작하면 부하 분산기에 요청을 전송합니다. 응답성 있는 인스턴스만 응답해야 합니다.중단 시뮬레이션을 완료한 후 방화벽 규칙을 삭제해 인스턴스 연결을 복원하면 됩니다. 비응답성 인스턴스에서 PowerShell을 관리자 권한으로 열었다면 다음 명령어를 실행하여 규칙을 삭제합니다.
netsh advfirewall firewall delete rule name="Outage Test"
삭제
튜토리얼을 완료한 후에는 만든 리소스를 삭제하여 할당량 사용을 중지하고 요금이 청구되지 않도록 할 수 있습니다. 다음 섹션은 이러한 리소스를 삭제하거나 사용 중지하는 방법을 설명합니다.
프로젝트 삭제
비용이 청구되지 않도록 하는 가장 쉬운 방법은 가이드에서 만든 프로젝트를 삭제하는 것입니다.
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
개별 리소스 삭제
프로젝트에 생성된 모든 리소스(이미지, 인스턴스 템플릿, 인스턴스 그룹, 상태 확인, 백엔드 서비스, URL 맵, HTTP 프록시, 주소, 전달 규칙)를 개별적으로 삭제해야 합니다. 다음 명령어를 실행하기 전에는 VM 인스턴스를 삭제할 수 없습니다.
로컬 머신에서 다음 명령어를 실행하여 튜토리얼용으로 만든 리소스를 삭제하세요.
- HTTP/S 전달 규칙을 삭제합니다.
gcloud compute forwarding-rules delete https-fwd-rule --global
gcloud compute forwarding-rules delete http-fwd-rule --global
- 전역 고정 IP 주소를 삭제합니다.
gcloud compute addresses delete lb-ip --global
- HTTP/S 프록시를 삭제합니다.
gcloud compute target-https-proxies delete https-lb-proxy
gcloud compute target-http-proxies delete http-lb-proxy
- SSL 인증서를 삭제합니다.
gcloud compute ssl-certificates delete SSL_CERT
- URL 맵을 삭제합니다.
gcloud compute url-maps delete lb-map
- 백엔드 서비스를 삭제합니다.
gcloud compute backend-services delete BACKEND_SERVICE_NAME --global
- HTTP 상태 점검을 삭제합니다.
gcloud compute http-health-checks delete basic-check
- 관리형 인스턴스 그룹을 삭제합니다.
gcloud compute instance-groups managed delete MANAGED_INSTANCE_GROUP_NAME_1 --zone=ZONE_1
gcloud compute instance-groups managed delete MANAGED_INSTANCE_GROUP_NAME_2 --zone=ZONE_2
- 인스턴스 템플릿을 삭제합니다.
gcloud compute instance-templates delete win-be-tmpl
-
이미지 삭제:
gcloud compute images delete IMAGE_NAME
-
디스크를 삭제합니다.
gcloud compute disks delete DISK_NAME
다음 단계
- 부하 분산 IIS 웹 서버 배포 튜토리얼 진행하기
- Google Cloud 아키텍처 프레임워크에서 권장사항 검토하기
- Google Cloud에 대한 참조 아키텍처, 다이어그램, 권장사항 살펴보기 Cloud 아키텍처 센터를 살펴보세요.