네트워크 부하 분산 설정

이 가이드에서는 기본 네트워크 부하 분산 구성을 만드는 방법을 안내합니다. 이 예시에서는 Google Compute Engine 인스턴스에 트래픽의 균형을 조정하려는 여러 웹 서버가 있다고 가정합니다. 이 시나리오에서는 정상적인 인스턴스에 HTTP 트래픽을 분산시키기 위해 Layer 3 부하 분산 구성을 설정합니다. 트래픽이 정상적인 인스턴스에만 전송되도록 기본 HTTP 상태 확인이 구성됩니다.

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

시작하기 전에

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

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

gcloud compute http-health-checks create --help

이전에 gcloud 명령줄 도구를 실행한 적이 없다면 먼저 gcloud init를 실행하여 인증하세요.

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

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

Compute Engine 인스턴스 구성

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

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

인스턴스 설정

Console

  1. Google Cloud Platform Console의 VM 인스턴스 페이지로 이동합니다.
    VM 인스턴스 페이지로 이동
  2. 인스턴스 만들기를 클릭합니다.
  3. 이름www1로 설정합니다.
  4. 리전us-central1로 설정합니다.
  5. 영역us-central1-b로 설정합니다.
  6. 부팅 디스크에는 기본 OS 이미지 Debian GNU/Linux 9 (stretch)가 이미 선택되어 있습니다.
  7. 관리, 보안, 디스크, 네트워킹, 단독 테넌시를 클릭하여 고급 설정을 표시합니다.
    1. 관리에서 자동화, 시작 스크립트 필드에 다음 스크립트를 삽입합니다.
      #! /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
      EOF
    2. 네트워킹에서 태그 필드를 network-lb-tag로 채웁니다.
    3. 나머지 필드는 기본값 그대로 둡니다.
    4. 만들기를 클릭합니다.
  8. 동일한 설정으로 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
    EOF
  9. 동일한 설정으로 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
    EOF

gcloud

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

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

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

    gcloud compute instances create www1 \
      --image-family debian-9 \
      --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
        EOF"
    gcloud compute instances create www2 \
      --image-family debian-9 \
      --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
        EOF"
    gcloud compute instances create www3 \
      --image-family debian-9 \
      --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
        EOF"

api

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

POST https://www.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/eip-images/global/images/debian-9-drawfork-v20181101",
        "diskType": "projects/[PROJECT_ID]/zones/us-central1-b/diskTypes/pd-standard",
        "diskSizeGb": "10"
      }
    }
  ],
  "machineType": "projects/[PROJECT_ID]/zones/us-central1-b/machineTypes/n1-standard-1",
  "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 인스턴스에 외부 트래픽을 허용하는 방화벽 규칙 만들기

Console

  1. Google Cloud Platform Console에서 방화벽 페이지로 이동합니다.
    방화벽 페이지로 이동
  2. 방화벽 규칙 만들기를 클릭합니다.
  3. 이름www-firewall-network-lb로 입력합니다.
  4. 방화벽 규칙이 적용되는 네트워크를 선택합니다(기본값).
  5. 대상에서 지정된 대상 태그를 선택합니다.
  6. 대상 태그 필드에 network-lb-tag를 입력합니다.
  7. 소스 IP 범위0.0.0.0/0으로 설정하여 모든 소스의 트래픽을 허용합니다.
  8. 지정된 프로토콜 및 포트에서 TCP 옆의 체크박스를 클릭하고 80을 입력합니다.
  9. 만들기를 클릭합니다. Console에 새 방화벽 규칙이 표시되는 데 시간이 걸릴 수 있습니다. 또는 새로 고침을 클릭해야 규칙을 볼 수 있는 경우도 있습니다.

gcloud

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

api

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

POST https://www.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 주소를 가져오고 인스턴스가 실행 중인지 확인

Console

  1. Google Cloud Platform Console의 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://www.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/n1-standard-1",
 "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-9-stretch"
   ],
   "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\n EOF"
   }
  ]
 },
 "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의 별칭 또는 각 인스턴스의 루프백으로 이 주소를 구성해야 합니다.

Console

  1. Google Cloud Platform Console에서 부하 분산기 만들기 페이지로 이동합니다.
    부하 분산기 만들기 페이지로 이동
  2. TCP 부하 분산에서 구성 시작 버튼을 클릭합니다.

  3. 인터넷 연결 또는 내부 전용에서 From Internet to my VMs를 선택합니다.

  4. 여러 리전 또는 단일 리전에서 Single region only를 선택합니다.

  5. 계속 버튼을 클릭합니다.

백엔드 구성

  1. 새 TCP 부하 분산기 화면에서 새 부하 분산기에 www-network-lb라는 이름을 입력합니다.
  2. 백엔드 구성을 클릭합니다.
  3. 이전에 입력한 부하 분산기 이름이 나타나지만 수정할 수 없습니다.
  4. 리전에서 us-central1을 선택합니다.
  5. 백엔드에서 기존 인스턴스 선택 탭을 클릭하고 인스턴스 추가를 클릭합니다. www1 인스턴스를 입력합니다. www2www3 인스턴스에 이 단계를 반복합니다.
  6. 상태 확인에서 Create a new health check(새 상태 확인 생성) 또는 다른 상태 확인 생성을 클릭합니다.

    1. 상태 확인의 이름으로 basic-check를 입력합니다.
    2. 기본 설정을 유지합니다.
    3. 저장 후 계속 버튼을 클릭합니다.

    백엔드 구성 왼쪽의 체크 표시가 있는 파란색 원은 설정이 완료되었음을 나타냅니다.

전달 규칙 구성

  1. 프런트엔드 구성을 클릭합니다.
  2. 이름www-rule을 입력합니다.
  3. IP 아래의 드롭다운 메뉴를 클릭하고 IP 주소 만들기를 선택합니다.
    1. 고정 IP 주소 예약 화면에서 이름lb-ip-1을 할당합니다.
    2. 예약을 클릭합니다.
  4. 포트80을 입력합니다.
  5. 완료 버튼을 클릭합니다.

    프런트엔드 구성 왼쪽의 체크 표시가 있는 파란색 원은 설정이 완료되었음을 나타냅니다.

구성 검토

  1. 검토 및 완료 버튼을 클릭하여 부하 분산기의 모든 구성 설정을 확인합니다.
  2. 설정이 올바르면 만들기를 클릭합니다. 부하 분산기를 만들려면 몇 분 정도 걸립니다.

    부하 분산 화면의 새 부하 분산기에 대한 백엔드 열에 새 부하 분산기가 정상임을 나타내는 녹색 확인 표시가 나타납니다.

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://www.googleapis.com/compute/v1/projects/[PROJECT_ID/regions/us-central1/addresses
    {
      "name": "network-lb-ip-1"
    }
    
  2. 이전 HTTP 상태 확인 추가

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

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

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

    POST https://www.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://www.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://www.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 주소 찾기

Console

  1. Google Cloud Platform Console의 고급 부하 분산 페이지에서 전달 규칙 탭으로 이동합니다.
    전달 규칙 탭으로 이동
  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://www.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"
}

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

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

$ while true; do curl -m1 [IP_ADDRESS]; done

다음 단계

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

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