기본 애플리케이션 부하 분산기의 헤더 및 쿼리 매개변수 기반 라우팅 설정

이 페이지에는 기본 애플리케이션 부하 분산기에 대한 두 가지 예시가 포함되어 있습니다.

전역 외부 애플리케이션 부하 분산기 및 리전별 외부 애플리케이션 부하 분산기의 트래픽 관리를 구성하려면 다음 페이지를 참조하세요.

시작하기 전에

쿼리 매개변수 기반 라우팅 설정

이 예시는 쿼리 매개변수를 사용하여 쿼리 문자열을 일치시켜 A/B 테스트를 수행하는 방법을 보여줍니다.

백엔드 인스턴스 그룹 두 개 추가

라우팅이 유용하려면 여러 백엔드가 있어야 합니다.

두 개의 백엔드를 설정하려면 VM이 두 인스턴스 그룹에 있어야 합니다. 이 가이드에서는 Apache가 실행 중인 Linux VM을 사용하여 관리형 인스턴스 그룹을 만들고 부하 분산을 설정하는 방법을 설명합니다.

관리형 인스턴스 그룹은 외부 HTTP 부하 분산기의 백엔드 서버를 실행하는 VM을 제공합니다. 여기에서는 백엔드에서 데모용으로 자체 호스트 이름을 제공합니다.

편의상 백엔드는 동일한 리전에 있습니다. 멀티 리전 설정을 원하는 경우 두 번째 리전의 인스턴스 템플릿을 설정해야 합니다.

콘솔

  1. 인스턴스 템플릿을 만듭니다. Google Cloud 콘솔에서 인스턴스 템플릿 페이지로 이동합니다.

    인스턴스 템플릿으로 이동

    1. 인스턴스 템플릿 만들기를 클릭합니다.
    2. 이름lb-backend-template를 입력합니다.
    3. 부팅 디스크Debian GNU/Linux 10(buster)과 같은 Debian 이미지로 설정되었는지 확인합니다. 이 안내에서는 apt-get처럼 Debian에서만 사용할 수 있는 명령어를 사용합니다.
    4. 고급 옵션을 클릭합니다.
    5. 네트워킹을 클릭하고 다음 필드를 구성합니다.
      1. 네트워크 태그allow-health-check를 입력합니다.
    6. 관리를 클릭합니다. 시작 스크립트 필드에 다음 스크립트를 입력합니다.

      #! /bin/bash
      apt-get update
      apt-get install apache2 -y
      a2ensite default-ssl
      a2enmod ssl
      vm_hostname="$(curl -H "Metadata-Flavor:Google" \
      http://metadata.google.internal/computeMetadata/v1/instance/name)"
      echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      systemctl restart apache2
      
    7. 만들기를 클릭합니다.

  2. 관리형 인스턴스 그룹을 만듭니다. Google Cloud 콘솔에서 인스턴스 그룹 페이지로 이동합니다.

    인스턴스 그룹으로 이동

    1. 인스턴스 그룹 만들기를 클릭합니다.
    2. 새 관리형 인스턴스 그룹(스테이트리스(Stateless))을 선택합니다. 자세한 내용은 스테이트리스(Stateless) 또는 스테이트풀(Stateful) MIG를 참조하세요.
    3. 이름first-example-ig를 입력합니다.
    4. 위치에서 단일 영역을 선택합니다.
    5. 리전에서 원하는 리전을 선택합니다. 이 예시에서는 us-east1을 사용합니다.
    6. 영역에서 us-east1-b를 선택합니다.
    7. 인스턴스 템플릿에서 인스턴스 템플릿 lb-backend-template을 선택합니다.
    8. 최대 인스턴스 수2를 입력합니다.
    9. 자동 확장 모드에서 Off:do not autoscale을 선택합니다.
    10. 만들기를 클릭합니다.

이것과 같은 다른 관리형 인스턴스 그룹을 만듭니다. 두 번째 이름을 second-example-ig로 지정하고 lb-backend-template 템플릿을 기반으로 합니다.

gcloud

  1. 인스턴스 템플릿을 만듭니다.

    gcloud compute instance-templates create `lb-backend-template` \
       --region=us-east1 \
       --network=default \
       --subnet=default \
       --tags=allow-health-check \
       --image-family=debian-10 \
       --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://metadata.google.internal/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 first-example-ig \
       --template=lb-backend-template --size=2 --zone=us-east1-b
    
  3. 템플릿을 기반으로 두 번째 관리형 인스턴스 그룹을 만듭니다.

    gcloud compute instance-groups managed create second-example-ig \
       --template=lb-backend-template --size=2 --zone=us-east1-c
    

방화벽 규칙 구성

이 예시에서는 fw-allow-health-check 방화벽 규칙을 만듭니다. Google Cloud 상태 점검 시스템(130.211.0.0/2235.191.0.0/16)의 트래픽을 허용하는 인그레스 규칙입니다. 이 예시에서는 대상 태그 allow-health-check를 사용하여 VM을 식별합니다.

콘솔

  1. Google Cloud 콘솔에서 방화벽 정책 페이지로 이동합니다.
    방화벽 정책으로 이동
  2. 방화벽 규칙 만들기를 클릭하여 두 번째 방화벽 규칙을 만듭니다.
  3. fw-allow-health-check이름을 입력합니다.
  4. 네트워크에서 Default를 선택합니다.
  5. 대상에서 지정된 대상 태그를 선택합니다.
  6. allow-health-check대상 태그 필드를 채웁니다.
  7. 소스 필터IPv4 범위로 설정합니다.
  8. 소스 IPv4 범위130.211.0.0/2235.191.0.0/16으로 설정합니다.
  9. 프로토콜 및 포트에서 지정된 프로토콜 및 포트를 선택합니다.
  10. TCP 체크박스를 선택하고 포트 번호로 80을 입력합니다.
  11. 만들기를 클릭합니다.

gcloud

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

외부 IP 주소 예약

인스턴스가 준비되어 실행 중이므로 고객이 부하 분산기에 연결하는 데 사용하는 전역 고정 외부 IP 주소를 설정합니다.

콘솔

  1. Google Cloud 콘솔의 외부 IP 주소 페이지로 이동합니다.
    외부 IP 주소 페이지로 이동
  2. 고정 주소 예약을 클릭하여 IPv4 주소를 예약합니다.
  3. lb-ipv4-1이름을 할당합니다.
  4. 네트워크 등급을 표준으로 설정합니다.
  5. IP 버전IPv4로 설정합니다.
  6. 유형전역으로 설정합니다.
  7. 예약을 클릭합니다.
  8. 유형전역으로 설정되어 있는지 확인합니다.
  9. 예약을 클릭합니다.

gcloud

gcloud compute addresses create lb-ipv4-1 \
    --ip-version=IPV4 \
    --network-tier=PREMIUM \
    --global

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

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

부하 분산기 백엔드 설정

콘솔

Google Cloud 콘솔은 현재 헤더 기반 및 매개변수 기반 라우팅 설정을 지원하지 않습니다. 대신 gcloud 또는 API를 사용하세요.

gcloud

  1. 상태 점검을 만듭니다.
        gcloud compute health-checks create http http-basic-check \
            --port 80
        
  2. 첫 번째 백엔드 서비스를 만듭니다.
    • 전역 외부 애플리케이션 부하 분산기의 경우 gcloud CLI 명령어를 load-balancing-scheme=EXTERNAL_MANAGED와 함께 사용합니다. 이 설정은 고급 트래픽 관리 기능을 제공합니다.
    • 기본 애플리케이션 부하 분산기의 경우 load-balancing-scheme=EXTERNAL을 사용합니다.
        gcloud compute backend-services create service-a \
            --load-balancing-scheme=LOAD_BALANCING_SCHEME \
            --global-health-checks \
            --protocol HTTP \
            --health-checks http-basic-check \
            --global
        
  3. 두 번째 백엔드 서비스를 만듭니다.
        gcloud compute backend-services create service-b \
            --load-balancing-scheme=LOAD_BALANCING_SCHEME \
            --global-health-checks \
            --protocol HTTP \
            --health-checks http-basic-check \
            --global
        
  4. 첫 번째 인스턴스 그룹을 첫 번째 백엔드 서비스에 백엔드로 추가합니다.
        gcloud compute backend-services add-backend service-a \
            --balancing-mode=UTILIZATION \
            --max-utilization=0.8 \
            --capacity-scaler=1 \
            --instance-group=first-example-ig \
            --instance-group-zone=us-east1-b \
            --global
        
  5. 두 번째 인스턴스 그룹을 두 번째 백엔드 서비스에 백엔드로 추가합니다.
        gcloud compute backend-services add-backend service-b \
            --balancing-mode=UTILIZATION \
            --max-utilization=0.8 \
            --capacity-scaler=1 \
            --instance-group=second-example-ig \
            --instance-group-zone=us-east1-c \
            --global
        

URL 맵 만들기

콘솔

Google Cloud 콘솔은 현재 헤더 기반 및 매개변수 기반 라우팅 설정을 지원하지 않습니다. 대신 gcloud 또는 API를 사용하세요.

gcloud

  1. YAML 파일 /tmp/web-map-http.yaml을 만듭니다. PROJECT_ID를 프로젝트 ID로 바꿉니다.

    defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
    hostRules:
    - hosts:
      - '*'
      pathMatcher: path-matcher-1
    name: web-map-http
    pathMatchers:
    - defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
      name: path-matcher-1
      routeRules:
        - matchRules:
            - prefixMatch: /
              queryParameterMatches:
                - name: ABTest
                  exactMatch: A
          priority: 0
          service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
        - matchRules:
            - prefixMatch: /
              queryParameterMatches:
                - name: ABTest
                  exactMatch: B
          priority: 1
          service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-b
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http
    tests:
    - description: Test routing for query ABTest with A
      host: example.com
      path: /?ABTest=A
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
      expectedOutputUrl: http://example.com/?ABTest=A
    - description: Test routing for query ABTest with B
      host: example.com
      path: /?ABTest=B
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-b
      expectedOutputUrl: http://example.com/?ABTest=B
    
  2. URL 맵의 유효성을 검사합니다.

    gcloud compute url-maps validate --source /tmp/web-map-http.yaml
    

    테스트를 통과하고 명령어가 성공 메시지를 출력하는 경우 변경사항을 URL 맵에 저장합니다.

  3. URL 맵을 업데이트합니다.

    gcloud compute url-maps import web-map-http \
       --source /tmp/web-map-http.yaml \
       --global
    

대상 프록시 및 전달 규칙 만들기

콘솔

Google Cloud 콘솔은 현재 헤더 기반 및 매개변수 기반 라우팅 설정을 지원하지 않습니다. 대신 gcloud 또는 API를 사용하세요.

gcloud

  1. 대상 HTTP 프록시를 만들어 URL 맵에 요청을 라우팅합니다.
        gcloud compute target-http-proxies create http-lb-proxy \
            --url-map web-map-http
        
  2. 들어오는 요청을 프록시로 라우팅하는 전역 전달 규칙을 만듭니다.
    • 전역 외부 애플리케이션 부하 분산기의 경우 gcloud CLI 명령어를 load-balancing-scheme=EXTERNAL_MANAGED와 함께 사용합니다. 이 설정은 고급 트래픽 관리 기능을 제공합니다.
    • 기본 애플리케이션 부하 분산기의 경우 load-balancing-scheme=EXTERNAL을 사용합니다.
        gcloud compute forwarding-rules create http-content-rule \
            --load-balancing-scheme=LOAD_BALANCING_SCHEME \
            --network-tier=PREMIUM \
            --address=lb-ipv4-1 \
            --global \
            --target-http-proxy=http-lb-proxy \
            --ports=80
        

테스트

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

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

다음을 실행하여 이 설정을 테스트합니다.

curl http://IP_ADDRESS?ABTest=A
curl http://IP_ADDRESS?ABTest=B

브라우저에서 http://IP_ADDRESS?ABTest=Ahttp://IP_ADDRESS?ABTest=B를 엽니다.

HTTP 헤더 기반 라우팅 설정

이 예시에서는 지능형 라우팅을 수행하기 위해 HTTP 헤더를 추가 및 삭제하는 방법을 보여줍니다.

시작하기 전에

기존의 외부 애플리케이션 부하 분산기를 사용하거나 새로 만들 수 있습니다.

이 기능은 모든 지원되는 백엔드 유형에 사용할 수 있습니다. 이 예시에서는 인스턴스 그룹에서 VM을 사용한다고 가정합니다.

간단한 부하 분산기를 설정하려면 위의 쿼리 매개변수 기반 예시를 참조하세요.

URL 맵 업데이트

콘솔

Google Cloud 콘솔은 현재 헤더 기반 및 매개변수 기반 라우팅 설정을 지원하지 않습니다. 대신 gcloud 또는 API를 사용하세요.

gcloud

  1. 이 예시는 HTTP 요청 헤더를 사용하여 요청의 HTTP 헤더 값을 일치시켜 A/B 테스트를 수행하는 방법을 보여줍니다.

    YAML 파일 /tmp/web-map-http.yaml을 만듭니다. PROJECT_ID를 프로젝트 ID로 바꿉니다.

    defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
    kind: compute#urlMap
    name: web-map-http
    hostRules:
    - hosts:
      - '*'
      pathMatcher: path-matcher-1
    pathMatchers:
    - defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
      name: path-matcher-1
      routeRules:
        - matchRules:
            - prefixMatch: /
              headerMatches:
                - headerName: ABTest
                  exactMatch: A
          priority: 0
          service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
        - matchRules:
            - prefixMatch: /
              headerMatches:
                - headerName: ABTest
                  exactMatch: B
          priority: 1
          service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-b
    tests:
    - description: Test routing for query ABTest with A
      host: example.com
      path: /
      headers:
      - name: ABTest
        value: A
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
    - description: Test routing for query ABTest with B
      host: example.com
      path: /
      headers:
      - name: ABTest
        value: B
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-b
    
  2. URL 맵의 유효성을 검사합니다.

    gcloud compute url-maps validate --source /tmp/web-map-http.yaml
    

    테스트를 통과하고 명령어가 성공 메시지를 출력하는 경우 변경사항을 URL 맵에 저장합니다.

  3. URL 맵을 업데이트합니다.

    gcloud compute url-maps import web-map-http \
       --source /tmp/web-map-http.yaml \
       --global
    

테스트

연결된 부하 분산기의 IPv4 주소로 다음을 실행하여 이 설정을 테스트합니다.

curl http://IP_ADDRESS -H "ABTest: A"
curl http://IP_ADDRESS -H "ABTest: B"

다음 단계