Posts [GSP007] CH5. Set Up Network and HTTP Load Balancers
Post
Cancel

[GSP007] CH5. Set Up Network and HTTP Load Balancers

[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. 여러 웹 서버 인스턴스 만들기

  1. 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"
        
  2. VM 인스턴스에 대한 외부 트래픽을 허용하는 방화벽 규칙을 만든다.
    1
    2
    
     gcloud compute firewall-rules create www-firewall-network-lb \
         --target-tags network-lb-tag --allow tcp:80
    
  3. 인스턴스를 나열해보기
    • EXTERNAL_IP 열에 IP 주소가 표시된다.
      1
      
       gcloud compute instances list
      
  4. 각 인스턴스가 실행 중인지 확인(curl 사용해보기)
    • [IP_ADDRESS] 를 각 VM의 (external) IP 주소로 변경해서 확인하기
      1
      
      curl http://[IP_ADDRESS]
      

Task3. 부하 분산 서비스 구성

  • 로드 밸런싱 서비스를 구성할 때, VM 인스턴스는 구성한 고정 External IP 주소로 향하는 패킷을 수신한다.
  • Compute Engine 이미지로 만든 인스턴스는 이 IP 주소를 처리하도록 자동으로 구성된다.
  1. 로드 밸런서에 대한 고정 외부 IP 주소를 생성
    1
    2
    
       gcloud compute addresses create network-lb-ip-1 \
       --region us-central1
    
  2. 기존 HTTP 상태 확인 리소스를 추가
    1
    
       gcloud compute http-health-checks create basic-check
    
  3. 인스턴스와 동일한 지역에 대상 풀을 추가
    • 서비스가 작동하도록 target 풀을 만들고, health check를 사용한다.
      1
      2
      
       gcloud compute target-pools create www-pool \
       --region us-central1 --http-health-check basic-check
      
  4. 풀에 인스턴스를 추가
    1
    2
    
       gcloud compute target-pools add-instances www-pool \
       --instances www1,www2,www3
    
  5. 전달 규칙(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. 로드 밸런서 템플릿을 생성
    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'
    
  2. 템플릿을 기반으로 관리형 인스턴스 그룹 생성
    1
    2
    
       gcloud compute instance-groups managed create lb-backend-group \
         --template=lb-backend-template --size=2 --zone=us-central1-a
    
  3. 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가 된다.
  4. 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
      
  5. 로드 밸런서에 대한 healthcheck을 생성
    1
    2
    
         gcloud compute health-checks create http http-basic-check \
             --port 80
    
  6. 백엔드 서비스 생성
    1
    2
    3
    4
    5
    
         gcloud compute backend-services create web-backend-service \
             --protocol=HTTP \
             --port-name=http \
             --health-checks=http-basic-check \
             --global
    
  7. 백엔드 서비스에 백엔드로 인스턴스 그룹을 추가
    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
    
  8. 들어오는 요청을 기본 백엔드 서비스로 라우팅하는 URL map을 만든다.
    1
    2
    3
    
         gcloud compute url-maps create web-map-http \
             --default-service web-backend-service
    
    
  9. URL map으로 요청을 라우팅할 대상 HTTP 프록시를 만든다.
    1
    2
    
         gcloud compute target-http-proxies create http-lb-proxy \
             --url-map web-map-http
    
  10. 들어오는 요청을 프록시로 라우팅하는 전역 전달 규칙(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) 로드 밸런서의 차이에 대해 알아보기
  • 단순히 어느 계층에서 로드 밸런서를 만들었는지에 대한 차이인지, 정확한 동작 원리를 알아보자
  • 프록시, 인스턴스 그룹, 풀, … 아주 완벽히 이해하지 못한 용어들에 대해 더 알아보자
This post is licensed under CC BY 4.0 by the author.