고급 부하 분산 최적화 Codelab

1. 소개

고급 부하 분산 최적화 Codelab에 오신 것을 환영합니다.

이 Codelab에서는 전역 외부 애플리케이션 부하 분산기에 고급 부하 분산 옵션을 구성하는 방법을 알아봅니다. 시작하기 전에 먼저 Cloud Load Balancing에 관한 문서 ( https://cloud.google.com/load-balancing/docs/load-balancing-overview)를 확인하세요.

c3fb1d3f027e8640.png

그림 1. 전역 외부 애플리케이션 부하 분산기를 사용하여 대상 엔드포인트를 선택하는 워크플로

Codelab 토폴로지 및 사용 사례

2f7368df335d3de9.png

그림 2. HTTP 부하 분산기 라우팅 토폴로지

이 Codelab에서는 관리형 인스턴스 그룹 2개를 설정합니다. 전역 외부 HTTPS 부하 분산기를 만듭니다. 부하 분산기는 envoy 기반 부하 분산기에서 지원하는 고급 기능 목록의 여러 기능을 활용합니다. 배포 후에는 시뮬레이션 부하를 생성하고 설정한 구성이 적절하게 작동하는지 확인합니다.

학습할 내용

  • 부하 분산기를 미세 조정하도록 ServiceLbPolicy를 구성하는 방법

필요한 항목

2. 시작하기 전에

Cloud Shell 내에서 프로젝트 ID가 설정되어 있는지 확인합니다.

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
prodproject=YOUR-PROJECT-NAME
echo $prodproject

API 사용 설정

필요한 모든 서비스 사용 설정

gcloud services enable compute.googleapis.com
gcloud services enable logging.googleapis.com
gcloud services enable monitoring.googleapis.com
gcloud services enable networkservices.googleapis.com

3. VPC 네트워크 만들기

VPC 네트워크 만들기

Cloud Shell 사용

gcloud compute networks create httplbs --subnet-mode=auto

출력

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/httplbs].
NAME     SUBNET_MODE  BGP_ROUTING_MODE  IPV4_RANGE  GATEWAY_IPV4
httplbs  AUTO         REGIONAL

VPC 방화벽 규칙 만들기

VPC를 만든 후 방화벽 규칙을 만듭니다. 이 방화벽 규칙은 모든 IP가 http 트래픽을 위해 포트 80의 테스트 애플리케이션 웹사이트 외부 IP에 액세스하도록 허용하는 데 사용됩니다.

Cloud Shell 사용

gcloud compute firewall-rules create httplb-allow-http-rule \
--allow tcp:80 \
--network httplbs \
--source-ranges 0.0.0.0/0 \
--priority 700

출력

Creating firewall...working..Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/httplb-allow-http-rule].
Creating firewall...done.
NAME                    NETWORK  DIRECTION  PRIORITY  ALLOW   DENY  DISABLED
httplb-allow-http-rule  httplbs  INGRESS    700       tcp:80        False

이 Codelab에서는 VM의 상태를 조정해 보겠습니다. 따라서 SSH를 허용하는 방화벽 규칙도 만듭니다.

Cloud Shell 사용

gcloud compute firewall-rules create fw-allow-ssh \
    --network=httplbs \
    --action=allow \
    --direction=ingress \
    --target-tags=allow-ssh \
    --rules=tcp:22

출력

Creating firewall...working..Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/fw-allow-ssh].
Creating firewall...done.
NAME          NETWORK  DIRECTION  PRIORITY  ALLOW   DENY  DISABLED
fw-allow-ssh  httplbs  INGRESS    1000      tcp:22        False

4. 관리형 인스턴스 그룹 설정

HTTP 부하 분산기에서 사용하는 백엔드 리소스의 패턴이 포함된 관리형 인스턴스 그룹을 설정해야 합니다. 먼저 각 리전에 생성할 VM의 구성을 정의하는 인스턴스 템플릿을 만듭니다. 다음으로 각 리전의 백엔드에 인스턴스 템플릿을 참조하는 관리형 인스턴스 그룹을 만듭니다.

관리형 인스턴스 그룹은 범위 내 영역 또는 리전일 수 있습니다. 이 실습에서는 영역 관리형 인스턴스 그룹을 만듭니다.

이 섹션에서는 인스턴스 생성 시 참조할 미리 만들어진 시작 스크립트를 확인할 수 있습니다. 이 시작 스크립트는 웹 애플리케이션을 시뮬레이션하는 데 사용할 웹 서버 기능을 설치하고 사용 설정합니다. 이 스크립트를 자유롭게 살펴보세요.

인스턴스 템플릿 만들기

첫 번째 단계는 인스턴스 템플릿을 만드는 것입니다.

Cloud Shell 사용

gcloud compute instance-templates create test-template \
   --network=httplbs \
   --tags=allow-ssh,http-server \
   --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'

출력

NAME           MACHINE_TYPE   PREEMPTIBLE  CREATION_TIMESTAMP
test-template  n1-standard-1               2021-11-09T09:24:35.275-08:00

이제 다음 gcloud 명령어를 사용해 인스턴스 템플릿이 성공적으로 생성되었는지 확인할 수 있습니다.

Cloud Shell 사용

gcloud compute instance-templates list

출력

NAME                  MACHINE_TYPE   PREEMPTIBLE  CREATION_TIMESTAMP
test-template         n1-standard-1         2021-11-09T09:24:35.275-08:00

인스턴스 그룹 만들기

이제 앞에서 만든 인스턴스 템플릿에서 관리형 인스턴스 그룹을 만들어야 합니다.

Cloud Shell 사용

gcloud compute instance-groups managed create us-east1-a-mig \
--size=1 \
--template=test-template \
--zone=us-east1-a

출력

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-a/instanceGroupManagers/us-east1-a-mig].
NAME            LOCATION    SCOPE  BASE_INSTANCE_NAME   SIZE  TARGET_SIZE  INSTANCE_TEMPLATE  AUTOSCALED
us-east1-a-mig  us-east1-a  zone   us-east1-a-mig       0     1            test-template      no

Cloud Shell 사용

gcloud compute instance-groups managed create us-east1-b-mig \
--size=5 \
--template=test-template \
--zone=us-east1-b

출력

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-b/instanceGroupManagers/us-east1-b-mig].
NAME            LOCATION    SCOPE  BASE_INSTANCE_NAME   SIZE  TARGET_SIZE  INSTANCE_TEMPLATE  AUTOSCALED
us-east1-b-mig  us-east1-b  zone   us-east1-b-mig       0     5            test-template      no

다음 gcloud 명령어를 사용하여 인스턴스 그룹이 성공적으로 생성되었는지 확인할 수 있습니다.

Cloud Shell 사용

gcloud compute instance-groups list

출력

NAME                  LOCATION      SCOPE   NETWORK         MANAGED INSTANCES
us-east1-a-mig        us-east1-a    zone    httplbs          Yes      1
us-east1-b-mig        us-east1-b    zone    httplbs          Yes      5

웹 서버 기능 확인

각 인스턴스는 아래와 같이 렌더링하는 간단한 PHP 스크립트로 Apache 웹 서버를 실행하도록 구성됩니다.

페이지 제공 소스: us-east1-a-mig-ww2h

웹 서버가 올바르게 작동하는지 확인하려면 Compute Engine -> VM 인스턴스로 이동합니다. 새 인스턴스 (예: us-east1-a-mig-xxx)가 인스턴스 그룹 정의에 따라 생성되었는지 확인합니다.

이제 브라우저에서 웹 요청을 실행하여 웹 서버가 실행 중인지 확인합니다 (시작하는 데 1분 정도 걸릴 수 있음). Compute Engine의 VM 인스턴스 페이지에서 인스턴스 그룹에서 만든 인스턴스를 선택하고 외부 (공용) IP를 클릭합니다.

또는 브라우저에서 http://<IP_Address>로 이동합니다.

5. 부하 분산기 설정

상태 확인 만들기

먼저 서비스가 제대로 작동되는지 확인하기 위해 기본 상태 점검을 만들어야 합니다. 기본 상태 확인을 만들 예정이며, 더 많은 고급 맞춤설정을 사용할 수 있습니다.

Cloud Shell 사용

gcloud compute health-checks create http http-basic-check \
    --port 80

출력

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/healthChecks/http-basic-check].
NAME              PROTOCOL
http-basic-check  HTTP

외부 IP 주소 예약

이 단계에서는 나중에 부하 분산기에 연결할 전 세계에서 사용 가능한 고정 IP 주소를 예약해야 합니다.

Cloud Shell 사용

gcloud compute addresses create lb-ipv4-2 \
    --ip-version=IPV4 \
    --global

출력

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/addresses/lb-ipv4-2].

예약된 IP 주소를 확인합니다.

gcloud compute addresses describe lb-ipv4-2 \
    --format="get(address)" \
    --global

백엔드 서비스 만들기

이제 이전에 만든 관리형 인스턴스 그룹의 백엔드 서비스를 만들어야 합니다.

Cloud Shell 사용

gcloud compute backend-services create east-backend-service \
    --load-balancing-scheme=EXTERNAL_MANAGED \
    --protocol=HTTP \
    --port-name=http \
    --health-checks=http-basic-check \
    --global

출력

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/east-backend-service].
NAME                  BACKENDS  PROTOCOL
east-backend-service            HTTP

백엔드 서비스에 MIG 추가

이제 백엔드 서비스를 만들었으므로 앞에서 만든 관리형 인스턴스 그룹을 각 백엔드 서비스에 추가해야 합니다.

Cloud Shell 사용

gcloud compute backend-services add-backend east-backend-service --instance-group us-east1-a-mig --instance-group-zone us-east1-a --global

Cloud Shell 사용

gcloud compute backend-services add-backend east-backend-service --instance-group us-east1-b-mig --instance-group-zone us-east1-b --global

다음 명령어를 실행하여 백엔드가 추가되었는지 확인할 수 있습니다.

Cloud Shell 사용

gcloud compute backend-services list

출력

NAME                  BACKENDS                                                                                               PROTOCOL
east-backend-service  us-east1-a/instanceGroups/us-east1-a-mig,us-east1-b/instanceGroups/us-east1-b-mig  HTTP

URL 맵 만들기

이제 URL 맵을 만들어 보겠습니다.

gcloud compute url-maps create web-map-http \
    --default-service=east-backend-service \
    --global

출력

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http].
NAME          DEFAULT_SERVICE
web-map-http  backendServices/east-backend-service

HTTP 프런트엔드 만들기

부하 분산기 만들기의 마지막 단계는 프런트엔드를 만드는 것입니다. 이렇게 하면 앞에서 예약한 IP 주소가 만든 부하 분산기 URL 맵에 매핑됩니다.

Cloud Shell 사용

gcloud compute target-http-proxies create http-lb-proxy-adv \
    --url-map=web-map-http

출력

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/targetHttpProxies/http-lb-proxy-adv].
NAME               URL_MAP
http-lb-proxy-adv  web-map-http

다음으로, 앞서 예약된 IP 주소를 HTTP 프록시에 매핑하는 전역 전달 규칙을 만들어야 합니다.

Cloud Shell 사용

gcloud compute forwarding-rules create http-content-rule \
    --load-balancing-scheme EXTERNAL_MANAGED \
    --address=lb-ipv4-2 \
    --global \
    --target-http-proxy=http-lb-proxy-adv \
    --ports=80

이 시점에서 앞서 기록한 IP 주소로 부하 분산기가 작동하는지 확인할 수 있습니다.

6. 부하 분산기가 작동하는지 확인

부하 분산 기능이 작동하는지 확인하려면 부하를 생성해야 합니다. 이를 위해 부하를 시뮬레이션할 새 VM을 만듭니다.

Siege-vm 만들기

이제 부하를 생성하는 데 사용할 siege-vm을 만듭니다.

Cloud Shell 사용

gcloud compute instances create siege-vm \
    --network=httplbs \
    --zone=us-east1-a \
    --machine-type=e2-medium \
    --tags=allow-ssh,http-server \
    --metadata=startup-script='sudo apt-get -y install siege'

출력

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-a/instances/siege-vm].
NAME      ZONE             MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
siege-vm  us-central1-ir1  e2-medium                  10.132.0.15  34.143.20.68  RUNNING

이제 만든 VM에 SSH로 연결할 수 있습니다. 생성되면 SSH를 클릭하여 터미널을 실행하고 연결합니다.

연결되면 다음 명령어를 실행하여 부하를 생성합니다. 이전에 외부 HTTP 부하 분산기에 예약한 IP 주소를 사용합니다.

Cloud Shell 사용

siege -c 20 http://$lb-ipv4-2

출력

New configuration template added to /home/cloudcurriculumdeveloper/.siege
Run siege -C to view the current settings in that file

부하 분산 확인

이제 Siege가 실행 중이므로 트래픽이 두 개의 관리형 인스턴스 그룹에 균등하게 분산되는지 확인해야 합니다.

Siege를 중지합니다.

고급 트래픽 분할이 작동하고 있는 것을 확인했으므로 이제 포위를 중단할 때입니다. 이렇게 하려면 siege-vm의 SSH 터미널로 돌아가서 CTRL+C를 눌러 siege 실행을 중지합니다.

7. 서비스 Lb 정책 구성

서비스 LB 정책 만들기

이제 기본 설정이 완료되었으므로 서비스 Lb 정책을 만들고 고급 기능을 사용해 보겠습니다. 예를 들어 일부 고급 부하 분산 설정을 사용하도록 서비스를 구성해 보겠습니다. 이 예에서는 자동 용량 드레이닝 기능을 실행하는 정책을 만들 것입니다. 하지만 다른 기능도 사용해 보세요.

Cloud Shell 사용

gcloud beta network-services service-lb-policies create http-policy \
    --auto-capacity-drain --location=global

다음 gcloud 명령어로 정책이 성공적으로 생성되었는지 확인할 수 있습니다.

Cloud Shell 사용

gcloud beta network-services service-lb-policies list --location=global

출력

NAME
http-policy

백엔드 서비스에 서비스 LB 정책 연결

이제 새 정책을 위의 기존 백엔드 서비스에 연결합니다.

Cloud Shell 사용

gcloud beta compute backend-services update east-backend-service \
    --service-lb-policy=http-policy --global

8. 백엔드 상태 조정

이제 새 서비스 lb 정책이 백엔드 서비스에 적용되었습니다. 따라서 기술적으로는 정리로 바로 이동할 수 있습니다. 하지만 이 Codelab의 일환으로 새 정책의 작동 방식을 보여주기 위해 프로덕션에서 몇 가지 변경사항을 추가로 적용할 예정입니다.

자동 용량 드레이닝 기능은 정상적인 백엔드의 총 수가 특정 기준점 (25%) 미만으로 떨어지면 부하 분산기에서 백엔드 MIG를 자동으로 삭제합니다. 이 기능을 테스트하기 위해 us-east1-b-mig의 VM에 SSH로 연결하여 비정상 상태로 만듭니다. 임곗값이 25% 이면 4개의 VM에 SSH로 연결하고 Apache 서버를 종료해야 합니다.

이렇게 하려면 4개의 VM을 선택하고 SSH를 클릭하여 터미널을 실행하고 SSH를 통해 연결합니다. 그런 후 다음 명령어를 실행합니다.

sudo apachectl stop

이 시점에서 자동 용량 소모 기능이 트리거되고 us-east1-b-mig는 새 요청을 받지 않습니다.

9. 자동 용량 드레이닝 기능이 작동하는지 확인

공성 재시작

새 기능을 확인하기 위해 시즈 VM을 다시 사용합니다. 이전 단계에서 만든 VM에 SSH를 사용해 연결해 보겠습니다. 생성되면 SSH를 클릭하여 터미널을 실행하고 연결합니다.

연결되면 다음 명령어를 실행하여 부하를 생성합니다. 이전에 외부 HTTP 부하 분산기에 예약한 IP 주소를 사용합니다.

Cloud Shell 사용

siege -c 20 http://$lb-ipv4-2

출력

New configuration template added to /home/cloudcurriculumdeveloper/.siege
Run siege -C to view the current settings in that file

이 시점에서 모든 요청이 us-east1-a-mig로 전송되는 것을 확인할 수 있습니다.

Stop the Siege

이제 고급 트래픽 분할이 작동하는 것을 확인했으므로 포위 공격을 중지할 때입니다. 이렇게 하려면 siege-vm의 SSH 터미널로 돌아가서 CTRL+C를 눌러 siege 실행을 중지합니다.

10. 정리 단계

실습 환경이 끝났으므로 이제 해체할 차례입니다. 다음 명령어를 실행하여 테스트 환경을 삭제하세요.

Cloud Shell 사용

gcloud compute instances delete siege-vm --zone=us-east1-a

gcloud compute forwarding-rules delete http-content-rule --global
gcloud compute target-http-proxies delete http-lb-proxy-adv

gcloud compute url-maps delete web-map-http

gcloud compute backend-services delete east-backend-service --global

gcloud compute addresses delete lb-ipv4-2 --global
gcloud compute health-checks delete http-basic-check 

gcloud beta network-services service-lb-policies delete http-policy --location=global

gcloud compute instance-groups managed delete us-east1-a-mig --zone=us-east1-a
gcloud compute instance-groups managed delete us-east1-b-mig --zone=us-east1-b

gcloud compute instance-templates delete test-template 

gcloud compute firewall-rules delete httplb-allow-http-rule
gcloud compute firewall-rules delete fw-allow-ssh

gcloud compute networks delete httplbs 

11. 축하합니다.

축하합니다. Codelab을 완료했습니다.

학습한 내용

  • 서비스 lb 정책으로 외부 애플리케이션 부하 분산기 만들기
  • 자동 용량 드레이닝 기능으로 백엔드 서비스를 구성합니다.

다음 단계

  • 서비스 LB 정책에서 제공하는 다른 기능을 사용해 보세요.