[CH5] Set Up Network and HTTP Load Balancers
- Compute Engine 가상 머신에서 실행되는 애플리케이션에 대해 네트워크 로드 밸런서와 HTTP 로드 밸런서를 모두 설정하는 방법을 배움
- 이 실습에서는 네트워크 부하 분산기와 HTTP 부하 분산기의 차이점과 Compute Engine 가상 머신(VM)에서 실행되는 애플리케이션에 대해 설정하는 방법을 알아본다.
- GCP에서 부하를 분산하는 여러 방법
- 네트워크 로드 밸런서
- HTTP(s) 로드 밸런서
- 실습내용
- 네트워크 부하 분산 장치를 설정
- HTTP 부하 분산 장치를 설정
- 네트워크 로드 밸런서와 HTTP 로드 밸런서의 차이점을 배우기
실습
- Google Console > Cloud Shell 활성화
1 2 3
> gcloud config set project [Project ID] > gcloud auth list > gcloud config list project
Task1. 모든 리소스에 대한 zone/region 설정
1
2
> gcloud config set compute/zone us-central1-a
> gcloud config set compute/region us-central1
Task2. 여러 웹 서버 인스턴스 만들기
- 3개의 Compute Engine VM 인스턴스를 만들고, 여기에 Apache를 설치한 다음, HTTP 트래픽이 인스턴스에 도달하도록 허용하는 방화벽 규칙을 추가한다.
- 기본 영역에 3개의 새 가상 머신을 만들고 모두 동일한 태그를 지정한다.
- zone:
us-central1-a
- tag:
network-lb-tag
- 태그 필드를 설정하면 방화벽 규칙과 같이 이러한 인스턴스를 한 번에 참조할 수 있다.
- 각 인스턴스에 Apache를 설치하고, 각 인스턴스에 고유한 홈페이지를 제공한다.
1 2 3 4 5 6 7 8 9 10
gcloud compute instances create www1 \ --image-family debian-9 \ --image-project debian-cloud \ --zone us-central1-a \ --tags network-lb-tag \ --metadata startup-script="#! /bin/bash sudo apt-get update sudo apt-get install apache2 -y sudo service apache2 restart echo '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html"
1 2 3 4 5 6 7 8 9 10
gcloud compute instances create www2 \ --image-family debian-9 \ --image-project debian-cloud \ --zone us-central1-a \ --tags network-lb-tag \ --metadata startup-script="#! /bin/bash sudo apt-get update sudo apt-get install apache2 -y sudo service apache2 restart echo '<!doctype html><html><body><h1>www2</h1></body></html>' | tee /var/www/html/index.html"
1 2 3 4 5 6 7 8 9 10
gcloud compute instances create www3 \ --image-family debian-9 \ --image-project debian-cloud \ --zone us-central1-a \ --tags network-lb-tag \ --metadata startup-script="#! /bin/bash sudo apt-get update sudo apt-get install apache2 -y sudo service apache2 restart echo '<!doctype html><html><body><h1>www3</h1></body></html>' | tee /var/www/html/index.html"
- VM 인스턴스에 대한 외부 트래픽을 허용하는 방화벽 규칙을 만든다.
1 2
gcloud compute firewall-rules create www-firewall-network-lb \ --target-tags network-lb-tag --allow tcp:80
- 인스턴스를 나열해보기
EXTERNAL_IP
열에 IP 주소가 표시된다.1
gcloud compute instances list
- 각 인스턴스가 실행 중인지 확인(curl 사용해보기)
- [IP_ADDRESS] 를 각 VM의 (external) IP 주소로 변경해서 확인하기
1
curl http://[IP_ADDRESS]
- [IP_ADDRESS] 를 각 VM의 (external) IP 주소로 변경해서 확인하기
Task3. 부하 분산 서비스 구성
- 로드 밸런싱 서비스를 구성할 때, VM 인스턴스는 구성한 고정 External IP 주소로 향하는 패킷을 수신한다.
- Compute Engine 이미지로 만든 인스턴스는 이 IP 주소를 처리하도록 자동으로 구성된다.
- 로드 밸런서에 대한 고정 외부 IP 주소를 생성
1 2
gcloud compute addresses create network-lb-ip-1 \ --region us-central1
- 기존 HTTP 상태 확인 리소스를 추가
1
gcloud compute http-health-checks create basic-check
- 인스턴스와 동일한 지역에 대상 풀을 추가
- 서비스가 작동하도록 target 풀을 만들고,
health check
를 사용한다.1 2
gcloud compute target-pools create www-pool \ --region us-central1 --http-health-check basic-check
- 서비스가 작동하도록 target 풀을 만들고,
- 풀에 인스턴스를 추가
1 2
gcloud compute target-pools add-instances www-pool \ --instances www1,www2,www3
- 전달 규칙(forwarding rule) 추가:
1 2 3 4 5
gcloud compute forwarding-rules create www-rule \ --region us-central1 \ --ports 80 \ --address network-lb-ip-1 \ --target-pool www-pool
웹 서버를 가리키는 L4 네트워크 부하 분산 장치가 생성되었다!
Task4. 인스턴스로 트래픽 보내기
- 지금까지, 로드 밸런싱 서비스가 구성되었다.
- 이제, 트래픽을 전달 규칙으로 보내기 시작하고, 트래픽이 다른 인스턴스로 분산되는 것을 볼 수 있다.
- 로드 밸런서에서 사용하는 www-rule 전달 규칙의 External IP 주소 보기
gcloud compute forwarding-rules describe www-rule --region us-central1
- curl 명령을 사용하여, 이전 명령의 외부 IP 주소로 교체하여 외부 IP 주소에 액세스
while true; do curl -m1 [IP_ADDRESS1] [IP_ADDRESS2] [IP_ADDRESS3]; done
- curl 명령의 응답은 세 인스턴스 간에 무작위로 번갈아 나타난다.
Ctrl + c
를 사용하여 명령어 실행을 중단할 수 있다.
Task5. HTTP 로드 밸런서 생성
- HTTP(S) 부하 분산은 Google 프런트 엔드(GFE)에서 구현된다.
- GFE는 전 세계적으로 배포되며 Google의 글로벌 네트워크 및 제어 평면을 사용하여 함께 작동한다.
- 일부 URL을 한 인스턴스 세트로 라우팅하고 다른 URL을 다른 인스턴스로 라우팅하도록 URL 규칙을 구성할 수 있다.
- 해당 그룹의 용량이 충분하고 요청에 적합한 경우 요청은 항상 사용자와 가장 가까운 인스턴스 그룹으로 라우팅된다.
- 가장 가까운 그룹이 충분한 용량이없는 경우, 요청은 가장 가까운 그룹으로 전송된다.
- Compute Engine 백엔드로 부하 분산기를 설정하려면 VM이 인스턴스 그룹에 있어야 한다.
- 관리형 인스턴스 그룹은 External HTTP Load Balancer의 백엔드 서버를 실행하는 VM을 제공한다.
- 이 실습에서 백엔드는 자신만의 hostname을 제공한다.
- 로드 밸런서 템플릿을 생성
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
gcloud compute instance-templates create lb-backend-template \ --region=us-central1 \ --network=default \ --subnet=default \ --tags=allow-health-check \ --image-family=debian-9 \ --image-project=debian-cloud \ --metadata=startup-script='#! /bin/bash apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html systemctl restart apache2'
- 템플릿을 기반으로 관리형 인스턴스 그룹 생성
1 2
gcloud compute instance-groups managed create lb-backend-group \ --template=lb-backend-template --size=2 --zone=us-central1-a
fw-allow-health-check
방화벽 규칙을 생성- 이 규칙은 Google 클라우드 상태 점검 시스템(130.211.0.0/22 및 35.191.0.0/16)의 트래픽을 허용하는 수신 규칙이다.
- 이 실습에서는 target tag
allow-health-check
를 사용하여 VM을 식별한다.1 2 3 4 5 6 7
gcloud compute firewall-rules create fw-allow-health-check \ --network=default \ --action=allow \ --direction=ingress \ --source-ranges=130.211.0.0/22,35.191.0.0/16 \ --target-tags=allow-health-check \ --rules=tcp:80
- → 이제 인스턴스가 시작되어 running state가 된다.
- client가 로드 밸런서에 연결하는데 사용되는,
전역 고정 External IP 주소
를 설정1 2 3
gcloud compute addresses create lb-ipv4-1 \ --ip-version=IPV4 \ --global
- 예약된 IPv4 주소를 확인
1 2 3
gcloud compute addresses describe lb-ipv4-1 \ --format="get(address)" \ --global
- 예약된 IPv4 주소를 확인
- 로드 밸런서에 대한
healthcheck
을 생성1 2
gcloud compute health-checks create http http-basic-check \ --port 80
- 백엔드 서비스 생성
1 2 3 4 5
gcloud compute backend-services create web-backend-service \ --protocol=HTTP \ --port-name=http \ --health-checks=http-basic-check \ --global
- 백엔드 서비스에 백엔드로 인스턴스 그룹을 추가
1 2 3 4
gcloud compute backend-services add-backend web-backend-service \ --instance-group=lb-backend-group \ --instance-group-zone=us-central1-a \ --global
- 들어오는 요청을 기본 백엔드 서비스로 라우팅하는 URL map을 만든다.
1 2 3
gcloud compute url-maps create web-map-http \ --default-service web-backend-service
- URL map으로 요청을 라우팅할 대상 HTTP 프록시를 만든다.
1 2
gcloud compute target-http-proxies create http-lb-proxy \ --url-map web-map-http
- 들어오는 요청을 프록시로 라우팅하는 전역 전달 규칙(forwarding rule)을 만든다.
1 2 3 4 5
gcloud compute forwarding-rules create http-content-rule \ --address=lb-ipv4-1\ --global \ --target-http-proxy=http-lb-proxy \ --ports=80
L7 HTTP(S) 로드 밸런서가 생성되었다!
Task6. 작업 6: 인스턴스로 전송되는 트래픽 테스트
- Cloud Console 탐색 메뉴 > Network Services > Load balancing
- 방금 생성한 로드 밸런서를 클릭(web-map-http)
- 백엔드 섹션에서 백엔드 이름을 클릭하고 VM이 정상인지 확인
- VM이 정상이면, 웹 브라우저를 사용하여(
http://IP_ADDRESS/
) 로드 밸런서를 테스트 - example output:
Page served from: lb-backend-group-xxxx)
와 함께, 페이지를 제공한 인스턴스의 이름이 포함된 페이지를 렌더링해야 한다.
- 쉽지 않군 :(
네트워크 로드 밸런서
와HTTP(s) 로드 밸런서
의 차이에 대해 알아보기- 단순히 어느 계층에서 로드 밸런서를 만들었는지에 대한 차이인지, 정확한 동작 원리를 알아보자
- 프록시, 인스턴스 그룹, 풀, … 아주 완벽히 이해하지 못한 용어들에 대해 더 알아보자