Compute Engine VM에 내부 HTTP(S) 부하 분산 설정

이 문서에서는 Compute Engine VM에서 실행되는 서비스에 대해 내부 HTTP 부하 분산을 구성하는 방법을 설명합니다.

시작하기 전에

이 가이드의 안내를 따르기 전에 먼저 다음 문서를 검토하세요.

VM 기반 서비스로 내부 HTTP(S) 부하 분산 구성

이 섹션에서는 Compute Engine VM에서 실행되는 서비스에 필요한 구성을 보여줍니다. 클라이언트 VM은 전달 규칙에서 구성한 IP 주소와 포트에 연결됩니다. 클라이언트 애플리케이션에서 이 IP 주소 및 포트로 트래픽을 전송할 때 내부 HTTP 부하 분산기의 URL 맵에 따라 요청이 가상 머신(VM)으로 전달됩니다.

이 페이지의 예시에서는 임시 내부 IP 주소 할당을 허용하는 대신 내부 HTTP(S) 부하 분산기의 전달 규칙에 예약된 내부 IP 주소를 명시적으로 설정합니다. 가능하다면 전달 규칙에 IP 주소를 예약하는 것이 가장 좋습니다.

관리형 인스턴스 그룹 만들기

이 섹션에서는 템플릿 및 관리형 인스턴스 그룹 생성 방법을 보여줍니다. 관리형 인스턴스 그룹은 내부 HTTP(S) 부하 분산기 예시의 백엔드 서버를 실행하는 VM 인스턴스를 제공합니다. 클라이언트에서 전송된 트래픽은 이러한 백엔드 서버로 부하 분산됩니다. 여기에서는 백엔드에서 데모용으로 자체 호스트 이름을 제공합니다.

Console

  1. GCP Console에서 인스턴스 그룹 페이지로 이동합니다.

    인스턴스 그룹 페이지로 이동

  2. 인스턴스 그룹 만들기를 클릭합니다.
  3. 왼쪽에서 새 관리형 인스턴스 그룹을 선택합니다.
  4. 이름l7-ilb-backend-example을 입력합니다.
  5. 위치에서 단일 영역을 선택합니다.
  6. 리전으로 us-west1을 선택합니다.
  7. 영역으로 us-west1-a를 선택합니다.
  8. 인스턴스 템플릿에서 다른 인스턴스 템플릿 생성을 선택합니다.
  9. 이름l7-ilb-backend-template을 입력합니다.
  10. 부팅 디스크가 Debian GNU/Linux 9 (stretch) 같은 Debian 이미지로 설정되었는지 확인합니다. 이 안내에서는 apt-get 같이 Debian에서만 사용할 수 있는 명령어를 사용합니다.
  11. 관리 탭의 관리, 보안, 디스크, 네트워킹, 단독 테넌시에서 시작 스크립트 필드에 다음 스크립트를 삽입합니다

    #! /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'
    
  12. 관리, 보안, 디스크, 네트워킹, 단독 테넌시에서 네트워킹 탭을 클릭합니다.

  13. 네트워크lb-network를, 서브넷으로 backend-subnet을 선택합니다.

  14. allow-sshload-balanced-backend의 네트워크 태그를 추가합니다.

  15. 저장 후 계속을 클릭합니다.

  16. 그룹에 만들 인스턴스의 수를 지정합니다. 원할 경우 UI의 자동 확장 섹션에서 인스턴스 그룹을 구성하여 인스턴스 CPU 사용량을 기준으로 인스턴스를 자동 추가 또는 삭제할 수 있습니다.

  17. 만들기를 클릭하여 새 인스턴스 그룹을 만듭니다.

gcloud

  1. gcloud compute instance-templates create 명령어를 사용하여 HTTP 서버로 VM 인스턴스 템플릿을 만듭니다.

    gcloud compute instance-templates create l7-ilb-backend-template \
    --region=us-west1 \
    --network=lb-network \
    --subnet=backend-subnet \
    --tags=allow-ssh,load-balanced-backend \
    --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. gcloud compute instance-groups managed create 명령어를 사용하여 영역에 관리형 인스턴스 그룹을 만듭니다.

    gcloud compute instance-groups managed create l7-ilb-backend-example \
        --zone=us-west1-a \
        --size=2 \
        --template=l7-ilb-backend-template
    

api

instanceTemplates.insert 메서드로 인스턴스 템플릿을 만들고 [project-id] 를 프로젝트 ID로 바꿉니다.

POST https://www.googleapis.com/compute/v1/projects/[project-id]/global/instanceTemplates
{
  "name":"l7-ilb-backend-template",
  "properties":{
     "machineType":"n1-standard-1",
     "tags":{
        "items":[
           "allow-ssh",
           "load-balanced-backend"
        ]
     },
     "metadata":{
        "kind":"compute#metadata",
        "items":[
          {
              "key":"startup-script",
              "value":"#! /bin/bash\napt-get update\napt-get install apache2 -y\na2ensite default-ssl\na2enmod ssl\nvm_hostname=\"$(curl -H \"Metadata-Flavor:Google\" \\\nhttp://169.254.169.254/computeMetadata/v1/instance/name)\"\necho \"Page served from: $vm_hostname\" | \\\ntee /var/www/html/index.html\nsystemctl restart apache2"
          }
        ]
     },
     "networkInterfaces":[
       {
           "kind":"compute#networkInterface",
           "network":"projects/[project-id]/global/networks/lb-network",
           "subnetwork":"regions/us-west1/subnetworks/backend-subnet",
           "accessConfigs":[
             {
                 "kind":"compute#accessConfig",
                 "type":"ONE_TO_ONE_NAT"
             }
           ]
       }
     ],
     "disks":[
       {
           "kind":"compute#attachedDisk",
           "index":0,
           "boot":true,
           "initializeParams":{
              "sourceImage":"projects/debian-cloud/global/images/family/debian-9"
           },
           "autoDelete":true
       }
     ]
  }
}

instanceGroupManagers.insert 메서드를 사용하여 각 영역에 관리형 인스턴스 그룹을 만들고 [project-id]를 프로젝트 ID로 바꿉니다.

POST https://www.googleapis.com/compute/v1/projects/[project-id]/zones/{zone}/instanceGroupManagers
{
  "name": "l7-ilb-backend-example",
  "zone": "projects/[project-id]/zones/us-west1-a",
  "instanceTemplate": "projects/[project-id]/global/instanceTemplates/l7-ilb-backend-template",
  "baseInstanceName": "l7-ilb-vm",
  "targetSize": 2
}

부하 분산기 구성

이 예시에서는 다음 내부 HTTP 부하 분산기 구성 작업을 보여줍니다.

  • HTTP 상태 확인 정의
  • 백엔드 서비스 정의
  • 백엔드 서비스에 관리형 인스턴스 그룹 추가
  • URL 맵 만들기
    • 대상 HTTP(S) 프록시에 리전이 정의되어 있으면 리전별 URL 맵을 참조해야 합니다. 리전별 URL 맵은 수신 URL의 호스트 및 경로에 대해 정의한 규칙에 따라 리전별 백엔드 서비스로 요청을 라우팅합니다. 리전별 URL 맵은 동일한 리전의 리전별 대상 프록시 규칙에서만 참조할 수 있습니다.
  • 대상 프록시 만들기
  • 전달 규칙 만들기

Console

부하 분산기 유형 선택

  1. Google Cloud Platform Console의 부하 분산 페이지로 이동합니다.
    부하 분산 페이지로 이동
  2. 부하 분산기 만들기를 클릭합니다.
  3. HTTP(S) 부하 분산에서 구성 시작을 클릭합니다.
  4. 내 VM 사이에서만 분산을 선택합니다. 이 설정은 내부 부하 분산기가 내부 옵션이라는 의미입니다.
  5. 계속을 클릭합니다.

부하 분산기 준비

  1. 부하 분산기 이름l7-ilb-map을 입력합니다.
  2. 프로토콜HTTP로 설정합니다.
  3. 리전으로 us-west1을 선택합니다.
  4. VPC 네트워크lb-network를 선택합니다.
  5. 계속하려면 창을 열어둡니다.

프록시 전용 서브넷 예약

내부 HTTP(S) 부하 분산의 경우 다음과 같이 프록시 서브넷을 예약합니다.

  1. 서브넷 예약을 클릭합니다.
  2. 이름proxy-subnet을 입력합니다.
  3. 네트워크lb-network를 선택합니다.
  4. 리전으로 us-west1을 선택합니다.
  5. IP 주소 범위10.129.0.0/26을 입력합니다.
  6. 추가를 클릭합니다.

백엔드 서비스 구성

  1. 백엔드 구성을 클릭합니다.
  2. 백엔드 서비스 만들기 또는 선택 메뉴에서 백엔드 서비스 만들기를 선택합니다.
  3. 백엔드 서비스의 이름l7-ilb-backend-service로 설정합니다.
  4. 백엔드 유형인스턴스 그룹으로 설정합니다.
  5. 백엔드 섹션새 백엔드 카드에서 다음을 수행합니다.
    1. 인스턴스 그룹l7-ilb-backend-example로 설정합니다.
    2. 포트 번호80으로 설정합니다.
    3. 분산 모드UTILIZATION으로 설정합니다.
    4. 완료를 클릭합니다.
  6. 상태 확인 섹션에서 상태 확인 만들기의 매개변수를 다음과 같이 선택합니다.
    1. 이름: l7-ilb-basic-check
    2. 프로토콜: HTTP
    3. 포트: 80
    4. 저장 후 계속을 클릭합니다.
  7. 만들기를 클릭합니다.

URL 맵 구성

  1. 호스트 및 경로 규칙을 클릭합니다. l7-ilb-backend-service가 일치하지 않는 모든 호스트 및 일치하지 않는 모든 경로에 대한 유일한 백엔드 서비스입니다.

프런트엔드 구성요소 구성

  1. 프런트엔드 구성을 클릭하고 새 프런트엔드 IP 및 포트 섹션을 수정합니다.
  2. 이름l7-ilb-forwarding-rule로 설정합니다.
  3. 프로토콜HTTP로 설정합니다.
  4. 서브넷backend-subnet으로 설정합니다.
  5. 내부 IP 팝업 버튼에서 고정 내부 IP 주소 예약을 선택합니다.
  6. 표시되는 패널에 다음 세부정보를 입력합니다.
    1. 이름: l7-ilb-ip
    2. 고정 IP 주소 섹션에서 직접 선택을 선택합니다.
    3. 커스텀 IP 주소 섹션에 10.1.2.99를 입력합니다.
    4. 예약을 클릭합니다.
  7. 포트80으로 설정합니다.
  8. 완료를 클릭합니다.

구성 완료

  1. 만들기를 클릭합니다.

gcloud

  1. gcloud compute health-checks create http 명령어로 HTTP 상태 확인을 정의합니다.

    gcloud beta compute health-checks create http l7-ilb-basic-check \
    --region=us-west1 \
    --use-serving-port
    
  2. gcloud compute backend-services create 명령어로 백엔드 서비스를 정의합니다.

    gcloud beta compute backend-services create l7-ilb-backend-service \
    --load-balancing-scheme=INTERNAL_MANAGED \
    --protocol=HTTP \
    --health-checks=l7-ilb-basic-check \
    --health-checks-region=us-west1 \
    --region=us-west1
    
  3. gcloud compute backend-services add-backend 명령어로 백엔드 서비스에 백엔드를 추가합니다.

    gcloud beta compute backend-services add-backend l7-ilb-backend-service \
    --balancing-mode=UTILIZATION \
    --instance-group=l7-ilb-backend-example \
    --instance-group-zone=us-west1-a \
    --region=us-west1
    
  4. gcloud compute url-maps create 명령어로 URL 맵을 만듭니다.

    gcloud beta compute url-maps create l7-ilb-map \
    --default-service=l7-ilb-backend-service \
    --region=us-west1
    
  5. gcloud compute target-http-proxies create 명령어로 대상 프록시를 만듭니다.

    gcloud beta compute target-http-proxies create l7-ilb-proxy \
    --url-map=l7-ilb-map \
    --url-map-region=us-west1 \
    --region=us-west1
    
  6. gcloud compute forwarding-rules create 명령어로 전달 규칙을 만듭니다.

    커스텀 네트워크의 경우 전달 규칙에서 서브넷을 참조해야 합니다. 이때 참조할 서브넷은 프록시 서브넷이 아니라 VM 서브넷입니다.

    gcloud beta compute forwarding-rules create l7-ilb-forwarding-rule \
    --load-balancing-scheme=INTERNAL_MANAGED \
    --network=lb-network \
    --subnet=backend-subnet \
    --address=10.1.2.99 \
    --ports=80 \
    --region=us-west1 \
    --target-http-proxy=l7-ilb-proxy \
    --target-http-proxy-region=us-west1
    

api

healthChecks.insert 메서드에 대해 POST 요청을 실행하여 상태 확인을 만들고 [project-id]를 프로젝트 ID로 바꿉니다.

POST https://www.googleapis.com/compute/beta/projects/[project-id]/global/healthChecks
{
  "name": "l7-ilb-basic-check",
  "type": "HTTP",
  "httpHealthCheck": {
    "portSpecification": "USE_SERVING_PORT"
  }
}

regionBackendServices.insert 메서드에 대해 POST 요청을 실행하여 리전별 백엔드 서비스를 만들고 [project-id]를 프로젝트 ID로 바꿉니다.

POST https://www.googleapis.com/compute/beta/projects/[project-id]/regions/us-west1/backendServices
{
  "name": "l7-ilb-backend-service",
  "backends": [
    {
      "group": "projects/[project-id]/zones/us-west1-a/instanceGroups/ig-a",
      "balancingMode": "UTILIZATION"
    }
  ],
  "healthChecks": [
    "projects/[project-id]/global/healthChecks/l7-ilb-basic-check"
  ],
  "loadBalancingScheme": "INTERNAL_MANAGED"
}

urlMap.insert 메서드에 대해 POST 요청을 실행하여 URL 맵을 만들고 [project-id]를 프로젝트 ID로 바꿉니다.

POST https://www.googleapis.com/compute/beta/projects/[project-id]/global/urlMaps
{
  "name": "l7-ilb-map",
  "defaultService": "projects/[project-id]/regions/us-west1/backendServices/l7-ilb-backend-service"
}

targetHttpProxies.insert 메서드에 대해 POST 요청을 실행하여 대상 HTTP 프록시를 만들고 [project-id]를 프로젝트 ID로 바꿉니다.

POST https://www.googleapis.com/compute/beta/projects/[project-id]/regions/us-west1/targetHttpProxy
{
  "name": "l7-ilb-proxy",
  "urlMap": "projects/[project-id]/global/urlMaps/l7-ilb-map",
  "region": "us-west1"
}

forwardingRules.insert 메서드에 대해 POST 요청을 실행하여 전달 규칙을 만들고 [project-id]를 프로젝트 ID로 바꿉니다.

POST https://www.googleapis.com/compute/beta/projects/[project-id]/regions/us-west1/forwardingRules
{
  "name": "l7-ilb-forwarding-rule",
  "IPAddress": "10.1.2.99",
  "IPProtocol": "TCP",
  "portRange": "80-80",
  "target": "projects/[project-id]/regions/us-west1/targetHttpProxies/l7-ilb-proxy",
  "loadBalancingScheme": "INTERNAL_MANAGED",
  "subnetwork": "projects/[project-id]/regions/us-west1/subnetworks/backend-subnet",
  "network": "projects/[project-id]/global/networks/lb-network",
  "networkTier": "PREMIUM",
}

테스트

VM 인스턴스를 생성하여 연결 테스트

gcloud compute instances create l7-ilb-client-us-west1-a \
    --image-family=debian-9 \
    --image-project=debian-cloud \
    --network=lb-network \
    --subnet=backend-subnet \
    --zone=us-west1-a \
    --tags=allow-ssh

부하 분산기 테스트

위에서 만든 인스턴스에 로그인한 후 내부 HTTP(S) 부하 분산기의 전달 규칙 IP 주소를 통해 백엔드의 HTTP(S) 서비스에 액세스 가능하고 백엔드 인스턴스 전체에 트래픽이 부하 분산되는지 테스트합니다.

각 클라이언트 인스턴스에 SSH를 통해 연결

gcloud compute ssh l7-ilb-client-us-west1-a \
    --zone=us-west1-a

IP의 호스트 이름 제공 여부 확인

curl 10.1.2.99

100개의 요청 실행 및 부하 분산 여부 확인

for LB_IP in 10.1.2.99; do
    RESULTS=
    for i in {1..100}; do RESULTS="$RESULTS:`curl 10.1.2.99`"; done >/dev/null 2>&1
    IFS=':'
    echo "***"
    echo "*** Results of load-balancing to 10.1.2.99: "
    echo "***"
    echo "$RESULTS" | tr ':' '\n' | grep -Ev "^$" | sort | uniq -c
    echo
done

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...