대상 풀이 있는 외부 패스 스루 네트워크 부하 분산기 설정

이 가이드에서는 대상 풀 백엔드가 있는 외부 패스 스루 네트워크 부하 분산기 구성을 만드는 방법을 설명합니다. 이 예시에서는 Compute Engine 인스턴스에 트래픽의 균형을 조정하려는 웹 서버가 여러 개 있다고 가정합니다. 이 시나리오에서는 정상적인 인스턴스에 HTTP 트래픽을 분산시키기 위해 Layer 4 부하 분산 구성을 설정합니다. 트래픽이 정상적인 인스턴스에만 전송되도록 기본 HTTP 상태 점검이 구성됩니다.

이 예시에서는 HTTP 트래픽을 부하 분산하지만 대상 풀 기반 외부 패스 스루 네트워크 부하 분산기를 사용하여 TCP, UDP, SSL 트래픽을 부하 분산할 수 있습니다. 시작하기 전에 외부 패스 스루 네트워크 부하 분산기 개요에서 외부 패스 스루 네트워크 부하 분산기에 대한 개념 정보를 읽어보세요.

시작하기 전에

Google Cloud CLI 설치 이 도구에 대한 전체 개요는 gcloud 도구 가이드를 참조하세요. 부하 분산 관련 명령어는 gcloud compute 명령어 그룹에서 확인할 수 있습니다.

또한 --help 플래그를 사용하면 gcloud 명령어에 대한 상세한 도움말을 이용할 수 있습니다.

gcloud compute http-health-checks create --help

이전에 Google Cloud CLI를 실행한 적이 없다면 먼저 gcloud init를 실행하여 인증하세요.

또한 부하 분산기의 고정 외부 IP 주소를 만들어야 합니다. Compute Engine에서 제공하는 이미지를 사용하는 경우 가상 머신 인스턴스가 이 IP 주소를 처리하도록 자동으로 구성됩니다. 다른 이미지를 사용하는 경우 eth0의 별칭 또는 각 인스턴스의 루프백으로 이 주소를 구성해야 합니다.

이 가이드는 bash에 익숙한 개발자를 대상으로 합니다.

Compute Engine VM 인스턴스 구성

이 부하 분산 시나리오에서는 Compute Engine VM 인스턴스 3개를 만들고 거기에 Apache를 설치합니다. HTTP 트래픽이 인스턴스에 도달할 수 있도록 방화벽 규칙을 추가합니다.

외부 패스 스루 네트워크 부하 분산기에 백엔드 VM으로 참여하는 인스턴스는 적절한 Linux 게스트 환경, Windows 게스트 환경 또는 기타 동일한 기능을 제공하는 프로세스를 실행해야 합니다.

백엔드 인스턴스 설정

콘솔

  1. Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스로 이동

  2. 인스턴스 만들기를 클릭합니다.

  3. 이름www1으로 설정합니다.

  4. 리전us-central1으로 설정합니다.

  5. 영역us-central1-b로 설정합니다.

  6. 부팅 디스크에는 기본 OS 이미지 Debian GNU/Linux 10 (buster)가 이미 선택되어 있습니다.

  7. 고급 옵션을 클릭합니다.

  8. 네트워킹을 클릭하고 다음 필드를 구성합니다.

    1. 네트워크 태그network-lb-tag를 입력합니다.
  9. 관리를 클릭합니다. 시작 스크립트 필드에 다음 스크립트를 입력합니다.

     #! /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. 만들기를 클릭합니다.
  10. 동일한 설정으로 www2라는 인스턴스를 만듭니다. 단, 자동화, 시작 스크립트 필드에 다음 스크립트를 삽입해야 합니다.

      #! /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
     

  11. 동일한 설정으로 www3이라는 인스턴스를 만듭니다. 단, 자동화, 시작 스크립트 필드에 다음 스크립트를 삽입해야 합니다.

        #! /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
      

gcloud

아래의 명령어는 모두 로컬 시스템에서 실행되며 bash 명령 프롬프트라고 가정합니다.

OS 이미지 이름, 속성, 상태를 보려면 gcloud compute images list 명령어를 사용합니다.

  1. 지정된 영역에 새 가상 머신 3개를 만들고 모두 같은 태그를 지정합니다. 이 예시에서는 영역을 us-central1-b로 설정합니다. tags 필드를 설정하면 방화벽 규칙을 사용할 때처럼 이러한 인스턴스를 한 번에 참조할 수 있습니다. 또한 이 명령어는 각 인스턴스에 Apache를 설치하고 고유한 홈페이지를 제공합니다.

    gcloud compute instances create www1 \
      --image-family debian-10 \
      --image-project debian-cloud \
      --zone us-central1-b \
      --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"
    gcloud compute instances create www2 \
      --image-family debian-10 \
      --image-project debian-cloud \
      --zone us-central1-b \
      --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"
    gcloud compute instances create www3 \
      --image-family debian-10 \
      --image-project debian-cloud \
      --zone us-central1-b \
      --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"

API

instances.insert 메서드를 사용하여 us-central1-b 영역에 www1 인스턴스 만들기

POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances

{
  "canIpForward": false,
  "deletionProtection": false,
  "disks": [
    {
      "type": "PERSISTENT",
      "boot": true,
      "mode": "READ_WRITE",
      "autoDelete": true,
      "deviceName": "www1",
      "initializeParams": {
        "sourceImage": "projects/debian-cloud/global/images/debian-10-buster-v20220719",
        "diskType": "projects/[PROJECT_ID]/zones/us-central1-b/diskTypes/pd-standard",
        "diskSizeGb": "10"
      }
    }
  ],
  "machineType": "projects/[PROJECT_ID]/zones/us-central1-b/machineTypes/e2-standard-2",
  "metadata": {
    "items": [
      {
        "key": "startup-script",
        "value": "sudo apt-get update\nsudo apt-get install apache2 -y\nsudo a2ensite default-ssl\nsudo a2enmod ssl\nsudo service apache2 restart\necho '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html"
      }
    ]
  },
  "name": "www1",
  "networkInterfaces": [
    {
      "network": "projects/[PROJECT_ID]/global/networks/default",
      "subnetwork": "projects/[PROJECT_ID]/regions/us-central1/subnetworks/default"
    }
  ],
  "tags": {
    "items": [
      "network-lb-tag"
    ]
  }
}

동일한 설정으로 www2www3이라는 인스턴스를 만듭니다. 단, deviceName, value, name 필드의 www1을 바꿉니다.

이러한 VM 인스턴스에 외부 트래픽을 허용하는 방화벽 규칙 만들기

콘솔

  1. Google Cloud 콘솔에서 방화벽 정책 페이지로 이동합니다.

    방화벽 정책으로 이동

  2. 방화벽 규칙 만들기를 클릭합니다.

  3. www-firewall-network-lb이름을 입력합니다.

  4. 방화벽 규칙이 적용되는 네트워크를 선택합니다(기본값).

  5. 대상에서 지정된 대상 태그를 선택합니다.

  6. 대상 태그 필드에 network-lb-tag를 입력합니다.

  7. 소스 필터IPv4 범위로 설정합니다.

  8. 소스 IPv4 범위0.0.0.0/0으로 설정하여 모든 소스의 트래픽을 허용합니다.

  9. 지정된 프로토콜 및 포트에서 TCP 체크박스를 선택하고 80을 입력합니다.

  10. 만들기를 클릭합니다. 콘솔에 새 방화벽 규칙이 표시되는 데 시간이 걸릴 수 있습니다. 또는 새로고침을 클릭해야 규칙을 볼 수 있는 경우도 있습니다.

gcloud

gcloud compute firewall-rules create www-firewall-network-lb \
    --target-tags network-lb-tag --allow tcp:80

API

firewalls.insert ** 메서드**를 사용하여 서브넷 내의 모든 트래픽을 허용하는 방화벽 규칙 만들기

POST https://compute.googleapis.com/compute/projects/[PROJECT_ID]/global/firewalls

{
  "name": "www-firewall-network-lb",
  "direction": "INGRESS",
  "priority": 1000,
  "targetTags": [
    "network-lb-tag"
  ],
  "allowed": [
    {
      "IPProtocol": "tcp",
      "ports": [
        "80"
      ]
    }
  ],
  "sourceRanges": [
    "0.0.0.0/0"
  ]
}

인스턴스의 외부 IP 주소 가져오기 및 이들의 실행 여부 확인

콘솔

  1. Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스로 이동

  2. 외부 IP 열에서 인스턴스의 주소를 확인합니다.

  3. 인스턴스 이름 왼쪽에 있는 녹색 체크 표시를 확인하여 인스턴스가 실행 중인지 확인합니다. 녹색 체크 표시가 보이지 않으면 인스턴스의 일반 문제 해결 페이지를 참조하세요.

gcloud

  1. 인스턴스를 나열하여 EXTERNAL_IP 열에서 IP 주소를 가져옵니다.

    gcloud compute instances list
    
  2. 각 인스턴스가 실행 중인지 확인합니다.

    명령줄에서 각 인스턴스의 외부 IP 주소를 통해 curl을 실행하여 모든 인스턴스가 응답하는지 확인합니다.

    curl http://[IP_ADDRESS]
    

API

instances.get 메서드를 사용하여 www1 인스턴스에 대한 정보 가져오기

status 필드가 RUNNING인지 확인하고 natIP 필드에서 외부 IP 주소를 찾습니다.

GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/www1

{
 "kind": "compute#instance",
 "id": "6734015273571474749",
 "creationTimestamp": "2018-11-09T11:45:23.487-08:00",
 "name": "www1",
 "description": "",
 "tags": {
  "items": [
   "network-lb-tag"
  ],
  "fingerprint": "9GVlO4gPawg="
 },
 "machineType": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/machineTypes/e2-standard-2",
 "status": "RUNNING",
 "zone": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b",
 "canIpForward": false,
 "networkInterfaces": [
  {
   "kind": "compute#networkInterface",
   "network": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks/default",
   "subnetwork": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/subnetworks/default",
   "networkIP": "10.128.0.2",
   "name": "nic0",
   "accessConfigs": [
    {
     "kind": "compute#accessConfig",
     "type": "ONE_TO_ONE_NAT",
     "name": "External NAT",
     "natIP": "35.192.37.233",
     "networkTier": "PREMIUM"
    }
   ],
   "fingerprint": "lxD5f5ua_sw="
  }
 ],
 "disks": [
  {
   "kind": "compute#attachedDisk",
   "type": "PERSISTENT",
   "mode": "READ_WRITE",
   "source": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/disks/www1",
   "deviceName": "www1",
   "index": 0,
   "boot": true,
   "autoDelete": true,
   "licenses": [
    "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/licenses/debian-10-buster"
   ],
   "interface": "SCSI",
   "guestOsFeatures": [
    {
     "type": "VIRTIO_SCSI_MULTIQUEUE"
    }
   ]
  }
 ],
 "metadata": {
  "kind": "compute#metadata",
  "fingerprint": "IyHRmHoJx6E=",
  "items": [
   {
    "key": "startup-script",
    "value": "#! /bin/bash\n sudo apt-get update\n sudo apt-get install apache2 -y\n sudo service apache2 restart\n echo '\u003c!doctype html\u003e\u003chtml\u003e\u003cbody\u003e\u003ch1\u003ewww1\u003c/h1\u003e\u003c/body\u003e\u003c/html\u003e' | tee /var/www/html/index.html"
   }
  ]
 },
 "serviceAccounts": [
  {
   "email": "674259759219-compute@developer.gserviceaccount.com",
   "scopes": [
    "https://www.googleapis.com/auth/devstorage.read_only",
    "https://www.googleapis.com/auth/logging.write",
    "https://www.googleapis.com/auth/monitoring.write",
    "https://www.googleapis.com/auth/servicecontrol",
    "https://www.googleapis.com/auth/service.management.readonly",
    "https://www.googleapis.com/auth/trace.append"
   ]
  }
 ],
 "selfLink": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/www1",
 "scheduling": {
  "onHostMaintenance": "MIGRATE",
  "automaticRestart": true,
  "preemptible": false
 },
 "cpuPlatform": "Intel Haswell",
 "labelFingerprint": "42WmSpB8rSM=",
 "startRestricted": false,
 "deletionProtection": false
}

www2www3에 이 API 호출을 반복합니다.

부하 분산 서비스 구성

다음으로, 부하 분산 서비스를 설정합니다.

부하 분산 서비스를 구성하면 가상 머신 인스턴스는 사용자가 구성한 고정 외부 IP 주소로 전송되는 패킷을 수신합니다. Compute Engine에서 제공하는 이미지를 사용하는 경우 IP 주소를 처리하도록 인스턴스가 자동으로 구성됩니다. 다른 이미지를 사용하는 경우 eth0의 별칭 또는 각 인스턴스의 루프백으로 이 주소를 구성해야 합니다.

콘솔

Google Cloud 콘솔을 사용하여 대상 풀 기반 외부 패스 스루 네트워크 부하 분산기를 만들 수 없습니다. 대신 gcloud 또는 REST API를 사용하세요.

gcloud

  1. 부하 분산기의 고정 외부 IP 주소 만들기

    gcloud compute addresses create network-lb-ip-1 \
        --region us-central1
    
  2. 기존 HTTP 상태 점검 리소스 추가

    이 예시에서는 상태 점검 메커니즘의 기본 설정을 사용하지만 상태 점검을 직접 맞춤설정할 수도 있습니다.

    gcloud compute http-health-checks create basic-check
    
  3. 대상 풀 추가

    가상 머신 인스턴스와 동일한 리전에 대상 풀을 추가합니다. 이전 단계에서 만든 상태 점검을 이 대상 풀에 사용합니다. 대상 풀이 작동하려면 상태 점검 서비스가 필요합니다.

    gcloud compute target-pools create www-pool \
        --region us-central1 --http-health-check basic-check
    
  4. 대상 풀에 인스턴스 추가

    gcloud compute target-pools add-instances www-pool \
        --instances www1,www2,www3 \
        --instances-zone us-central1-b
    

    대상 풀의 인스턴스는 같은 리전에 속해야 하지만 같은 리전의 여러 영역에 분산되어 있어도 됩니다. 예를 들어 us-central1-f 영역과 us-central1-b 영역은 둘 다 us-central1 리전에 있으므로 대상 풀 하나에서 두 영역에 인스턴스를 둘 수 있습니다.

  5. 전달 규칙 추가

    대상 풀을 가리키는 외부 IP 주소 및 포트 범위를 대신하는 전달 규칙을 추가합니다. --address 필드에는 숫자 IP 주소나 정규화된 이름을 사용합니다.

    gcloud compute forwarding-rules create www-rule \
        --region us-central1 \
        --ports 80 \
        --address network-lb-ip-1 \
        --target-pool www-pool
    

API

  1. 부하 분산기의 고정 외부 IP 주소 만들기

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID/regions/us-central1/addresses
    {
      "name": "network-lb-ip-1"
    }
    
  2. 기존 HTTP 상태 점검 추가

    이 예시에서는 상태 점검 메커니즘에 기본 설정을 사용하지만 직접 맞춤설정할 수도 있습니다.

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/httpHealthChecks
    {
      "name": "basic-check"
    }
    
  3. 대상 풀 추가

    가상 머신 인스턴스와 동일한 리전에 대상 풀을 추가합니다. 이전 단계에서 만든 상태 점검을 이 대상 풀에 사용합니다. 대상 풀이 작동하려면 상태 점검 서비스가 필요합니다.

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools
    {
      "name": "www-pool",
      "healthChecks": [
        "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/httpHealthChecks/basic-check"
      ]
    }
    
  4. 대상 풀에 인스턴스 추가

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-pool/addInstance
    {
      "instances": [
        {
          "instance": "projects/[PROJECT_ID]/zones/us-central1-b/instances/www1"
        }
      ]
    }
    

    www2www3 인스턴스에 이 API 호출을 반복합니다.

    대상 풀의 인스턴스는 같은 리전에 속해야 하지만 같은 리전의 여러 영역에 분산되어 있어도 됩니다. 예를 들어 us-central1-f 영역과 us-central1-b 영역은 둘 다 us-central1 리전에 있으므로 대상 풀 하나에서 두 영역에 인스턴스를 둘 수 있습니다.

  5. 전달 규칙 추가

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules
    {
      "name": "www-rule",
      "portRange": "80",
      "loadBalancingScheme": "EXTERNAL",
      "target": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-network-lb"
    }
    

인스턴스에 트래픽 보내기

부하 분산 서비스를 구성했으므로 이제 전달 규칙에 트래픽을 보내고 트래픽이 여러 인스턴스에 분산되는 것을 확인할 수 있습니다.

전달 규칙의 외부 IP 주소 조회

콘솔

  1. Google Cloud 콘솔의 고급 부하 분산 페이지에 있는 전달 규칙 탭으로 이동합니다.
    전달 규칙 탭으로 이동
  2. 부하 분산기에서 사용하는 www-rule 전달 규칙을 찾습니다.
  3. www-ruleIP 주소 열에서 나열된 외부 IP 주소를 확인합니다.

gcloud

부하 분산기에서 사용하는 www-rule 전달 규칙의 외부 IP 주소를 확인하려면 다음 명령어를 입력합니다.

gcloud compute forwarding-rules describe www-rule --region us-central1

API

forwardingRules.get 메서드를 사용하여 www-rule 전달 규칙의 외부 IP 주소 확인

출력에서 IPAddress 필드를 확인합니다.

GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules/www-rule
{
  "kind": "compute#forwardingRule",
  "id": "5133886346582800002",
  "creationTimestamp": "2018-11-09T14:21:33.574-08:00",
  "name": "www-rule",
  "description": "",
  "region": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1",
  "IPAddress": "35.232.228.9",
  "IPProtocol": "TCP",
  "portRange": "80-80",
  "target": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-network-lb",
  "selfLink": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules/www-rule",
  "loadBalancingScheme": "EXTERNAL",
  "networkTier": "PREMIUM"
}

백엔드 인스턴스에 지원되지 않는 ICMP

외부 패스 스루 네트워크 부하 분산기는 ICMP 패킷을 백엔드 인스턴스로 전달하지 않습니다. ping 또는 traceroute를 사용하여 ICMP 패킷을 전송하면 응답은 부하 분산기의 백엔드 인스턴스에서 전송되지 않습니다.

부하 분산기의 백엔드 인스턴스에 ICMP 트래픽을 차단하는 방화벽 규칙이 있더라도 Google Cloud 인프라는 ICMP 응답을 전송할 수 있습니다. 이 설정은 변경할 수 없습니다.

curl 명령어를 사용하여 외부 IP 주소에 액세스

curl 명령어는 인스턴스 세 개에서 무작위로 응답합니다. 처음에 응답이 성공하지 못하면 구성이 완전히 로드되고 인스턴스가 정상으로 표시될 때까지 30초 정도 기다린 다음 다시 시도합니다.

$ while true; do curl -m1 IP_ADDRESS; done

다음 단계