VM 인스턴스 그룹 백엔드로 리전 간 내부 프록시 네트워크 부하 분산기 설정

이 문서에서는 Compute Engine VM에서 실행되는 서비스의 프록시 네트워크 부하 분산기를 구성하는 방법을 설명합니다.

시작하기 전에

이 가이드를 진행하기 전에 다음 사항을 숙지하세요.

권한

이 가이드를 진행하려면 프로젝트에서 인스턴스를 만들고 네트워크를 수정할 수 있어야 합니다. 이렇게 하려면 프로젝트 소유자 또는 편집자이거나 다음 Compute Engine IAM 역할을 모두 보유해야 합니다.

작업 필요한 역할
네트워크, 서브넷, 부하 분산기 구성요소 만들기 Compute 네트워크 관리자
방화벽 규칙 추가 및 삭제 Compute 보안 관리자
인스턴스 만들기 Compute 인스턴스 관리자

자세한 내용은 다음 가이드를 참조하세요.

설정 개요

다음 다이어그램과 같이 부하 분산기를 구성할 수 있습니다.

리전 간 내부 프록시 네트워크 부하 분산기 고가용성 배포
리전 간 내부 프록시 네트워크 부하 분산기 고가용성 배포(확대하려면 클릭)

다이어그램에서 볼 수 있듯이 이 예시에서는 REGION_AREGION_B 리전에 하나의 백엔드 서비스와 2개의 백엔드 관리형 인스턴스 그룹(MIGs)이 있는 VPC 네트워크에서 리전 간 내부 프록시 네트워크 부하 분산기를 만듭니다.

다이어그램에 표시된 항목은 다음과 같습니다.

  1. 다음 서브넷을 사용하는 VPC 네트워크:

    • 서브넷 SUBNET_AREGION_A의 프록시 전용 서브넷
    • 서브넷 SUBNET_BREGION_B의 프록시 전용 서브넷

    리전 간 내부 프록시 네트워크 부하 분산기를 사용하는 VPC 네트워크의 각 리전에 프록시 전용 서브넷을 만들어야 합니다. 해당 리전의 프록시 전용 서브넷은 해당 리전의 모든 리전 간 내부 프록시 네트워크 부하 분산기 간에 공유됩니다. 부하 분산기에서 서비스의 백엔드로 보낸 패킷의 소스 주소는 프록시 전용 서브넷에서 할당됩니다. 이 예시에서 REGION_B 리전의 프록시 전용 서브넷의 기본 IP 주소 범위는 10.129.0.0/23이고 REGION_A의 기본 IP 주소 범위는 권장 서브넷 크기인 10.130.0.0/23입니다.

  2. 고가용성 설정에는 REGION_AREGION_B 리전에 Compute Engine VM 배포를 위한 관리형 인스턴스 그룹 백엔드가 있습니다. 한 리전의 백엔드가 다운되면 트래픽이 다른 리전으로 장애 조치됩니다.

  3. 백엔드의 사용 및 상태를 모니터링하는 백엔드 서비스입니다.

  4. 사용자로부터 요청을 수신하여 백엔드 서비스로 전달하는 전역 대상 TCP 프록시입니다.

  5. 각 수신 요청을 대상 프록시로 전달하기 위한 부하 분산기의 리전 내부 IP 주소가 있는 전역 전달 규칙입니다.

    전달 규칙에 연결된 내부 IP 주소는 백엔드와 동일한 네트워크 및 리전의 모든 서브넷에서 가져올 수 있습니다. 다음 조건을 참고하세요.

    • IP 주소는 백엔드 인스턴스 그룹과 동일한 서브넷에서 가져올 수 있지만 반드시 그럴 필요는 없습니다.
    • --purpose 플래그가 GLOBAL_MANAGED_PROXY로 설정된 예약된 프록시 전용 서브넷에서 IP 주소를 가져오면 안 됩니다.
    • 여러 전달 규칙에서 같은 내부 IP 주소를 사용하려면 IP 주소 --purpose 플래그를 SHARED_LOADBALANCER_VIP로 설정합니다.

네트워크 및 서브넷 구성

VPC 네트워크 내에서 백엔드가 구성되는 각 리전에서 서브넷을 구성합니다. 또한 부하 분산기를 구성하려는 각 리전에 proxy-only-subnet을 구성합니다.

이 예시에서는 다음 VPC 네트워크, 리전 및 서브넷을 사용합니다.

  • 네트워크. 네트워크는 커스텀 모드 VPC 네트워크이며 이름은 NETWORK입니다.

  • 백엔드용 서브넷.

    • REGION_A 리전에 있는 SUBNET_A라는 이름의 서브넷은 기본 IP 범위로 10.1.2.0/24를 사용합니다.
    • REGION_B 리전에 있는 SUBNET_B라는 이름의 서브넷은 기본 IP 범위로 10.1.3.0/24를 사용합니다.
  • 프록시용 서브넷.

    • REGION_A 리전에 있는 PROXY_SN_A라는 이름의 서브넷은 기본 IP 범위로 10.129.0.0/23을 사용합니다.
    • REGION_B 리전에 있는 PROXY_SN_B라는 이름의 서브넷은 기본 IP 범위로 10.130.0.0/23을 사용합니다.

리전 간 내부 애플리케이션 부하 분산기는 VPC 내의 모든 영역에서 액세스할 수 있습니다. 따라서 모든 리전의 클라이언트가 부하 분산기 백엔드에 전역으로 액세스할 수 있습니다.

백엔드 서브넷 구성

콘솔

  1. Google Cloud 콘솔에서 VPC 네트워크 페이지로 이동합니다.

    VPC 네트워크로 이동

  2. VPC 네트워크 만들기를 클릭합니다.

  3. 네트워크의 이름을 입력합니다.

  4. 서브넷 섹션에서 서브넷 생성 모드커스텀으로 설정합니다.

  5. 부하 분산기의 백엔드에 대한 서브넷을 만듭니다. 새 서브넷 섹션에 다음 정보를 입력합니다.

    • 서브넷 이름을 입력합니다.
    • 리전으로 REGION_A를 선택합니다.
    • IP 주소 범위10.1.2.0/24를 입력합니다.
  6. 완료를 클릭합니다.

  7. 서브넷 추가를 클릭합니다.

  8. 부하 분산기의 백엔드에 대한 서브넷을 만듭니다. 새 서브넷 섹션에 다음 정보를 입력합니다.

    • 서브넷 이름을 입력합니다.
    • 리전으로 REGION_B를 선택합니다.
    • IP 주소 범위10.1.3.0/24를 입력합니다.
  9. 완료를 클릭합니다.

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

gcloud

  1. gcloud compute networks create 명령어를 사용하여 커스텀 VPC 네트워크를 만듭니다.

    gcloud compute networks create NETWORK \
        --subnet-mode=custom
    
  2. gcloud compute networks subnets create 명령어를 사용하여 REGION_A 리전의 NETWORK 네트워크에 서브넷을 만듭니다.

    gcloud compute networks subnets create SUBNET_A \
        --network=NETWORK \
        --range=10.1.2.0/24 \
        --region=REGION_A
    
  3. gcloud compute networks subnets create 명령어를 사용하여 REGION_B 리전의 NETWORK 네트워크에 서브넷을 만듭니다.

    gcloud compute networks subnets create SUBNET_B \
        --network=NETWORK \
        --range=10.1.3.0/24 \
        --region=REGION_B
    

Terraform

VPC 네트워크를 만들려면 google_compute_network 리소스를 사용합니다.

resource "google_compute_network" "default" {
  auto_create_subnetworks = false
  name                    = "lb-network-crs-reg"
  provider                = google-beta
}

lb-network-crs-reg 네트워크에 VPC 서브넷을 만들려면 google_compute_subnetwork 리소스를 사용합니다.

resource "google_compute_subnetwork" "subnet_a" {
  provider      = google-beta
  ip_cidr_range = "10.1.2.0/24"
  name          = "lbsubnet-uswest1"
  network       = google_compute_network.default.id
  region        = "us-west1"
}
resource "google_compute_subnetwork" "subnet_b" {
  provider      = google-beta
  ip_cidr_range = "10.1.3.0/24"
  name          = "lbsubnet-useast1"
  network       = google_compute_network.default.id
  region        = "us-east1"
}

API

networks.insert 메서드에 대해 POST 요청을 실행합니다. PROJECT_ID를 프로젝트 ID로 바꿉니다.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks

{
 "routingConfig": {
   "routingMode": "regional"
 },
 "name": "NETWORK",
 "autoCreateSubnetworks": false
}

subnetworks.insert 메서드에 대해 POST 요청을 실행합니다. PROJECT_ID를 프로젝트 ID로 바꿉니다.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_A/subnetworks

{
 "name": "SUBNET_A",
 "network": "projects/PROJECT_ID/global/networks/lb-network-crs-reg",
 "ipCidrRange": "10.1.2.0/24",
 "region": "projects/PROJECT_ID/regions/REGION_A",
}

subnetworks.insert 메서드에 대해 POST 요청을 실행합니다. PROJECT_ID를 프로젝트 ID로 바꿉니다.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_B/subnetworks

{
 "name": "SUBNET_B",
 "network": "projects/PROJECT_ID/global/networks/NETWORK",
 "ipCidrRange": "10.1.3.0/24",
 "region": "projects/PROJECT_ID/regions/REGION_B",
}

프록시 전용 서브넷 구성

프록시 전용 서브넷은 Google Cloud에서 사용자를 대신하여 Envoy 프록시를 실행하는 데 사용하는 IP 주소 집합을 제공합니다. 프록시는 클라이언트의 연결을 종료하고 백엔드에 새 연결을 만듭니다.

이 프록시 전용 서브넷은 VPC 네트워크와 동일한 리전에 있는 모든 Envoy 기반 리전 부하 분산기에서 사용됩니다. 네트워크당 리전별 활성 프록시 전용 서브넷은 용도별로 하나만 있을 수 있습니다.

Console

Google Cloud 콘솔을 사용하는 경우에는 기다렸다가 나중에 부하 분산 페이지에서 프록시 전용 서브넷을 만들 수 있습니다.

지금 프록시 전용 서브넷을 만들려면 다음 단계를 사용합니다.

  1. Google Cloud 콘솔에서 VPC 네트워크 페이지로 이동합니다.

    VPC 네트워크로 이동

  2. VPC 네트워크의 이름을 클릭합니다.
  3. 서브넷 탭에서 서브넷 추가를 클릭합니다.
  4. 프록시 전용 서브넷의 이름을 입력합니다.
  5. 리전으로 REGION_A를 선택합니다.
  6. 용도 목록에서 리전 간 관리형 프록시를 선택합니다.
  7. IP 주소 범위 필드에 10.129.0.0/23을 입력합니다.
  8. 추가를 클릭합니다.

REGION_B에 프록시 전용 서브넷 만들기

  1. 서브넷 탭에서 서브넷 추가를 클릭합니다.
  2. 프록시 전용 서브넷의 이름을 입력합니다.
  3. 리전으로 REGION_B를 선택합니다.
  4. 용도 목록에서 리전 간 관리형 프록시를 선택합니다.
  5. IP 주소 범위 필드에 10.130.0.0/23을 입력합니다.
  6. 추가를 클릭합니다.

gcloud

gcloud compute networks subnets create 명령어로 프록시 전용 서브넷을 만드세요.

    gcloud compute networks subnets create PROXY_SN_A \
        --purpose=GLOBAL_MANAGED_PROXY \
        --role=ACTIVE \
        --region=REGION_A \
        --network=NETWORK \
        --range=10.129.0.0/23
    
    gcloud compute networks subnets create PROXY_SN_B \
        --purpose=GLOBAL_MANAGED_PROXY \
        --role=ACTIVE \
        --region=REGION_B \
        --network=NETWORK \
        --range=10.130.0.0/23
    

Terraform

lb-network-crs-reg 네트워크에 VPC 프록시 전용 서브넷을 만들려면 google_compute_subnetwork 리소스를 사용합니다.

resource "google_compute_subnetwork" "proxy_subnet_a" {
  provider      = google-beta
  ip_cidr_range = "10.129.0.0/23"
  name          = "proxy-only-subnet1"
  network       = google_compute_network.default.id
  purpose       = "GLOBAL_MANAGED_PROXY"
  region        = "us-west1"
  role          = "ACTIVE"
  lifecycle {
    ignore_changes = [ipv6_access_type]
  }
}
resource "google_compute_subnetwork" "proxy_subnet_b" {
  provider      = google-beta
  ip_cidr_range = "10.130.0.0/23"
  name          = "proxy-only-subnet2"
  network       = google_compute_network.default.id
  purpose       = "GLOBAL_MANAGED_PROXY"
  region        = "us-east1"
  role          = "ACTIVE"
  lifecycle {
    ignore_changes = [ipv6_access_type]
  }
}

API

subnetworks.insert 메서드로 프록시 전용 서브넷을 만드세요. 여기서 PROJECT_ID는 프로젝트 ID로 바꿉니다.

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_A/subnetworks

    {
      "name": " PROXY_SN_A",
      "ipCidrRange": "10.129.0.0/23",
      "network": "projects/PROJECT_ID/global/networks/NETWORK",
      "region": "projects/PROJECT_ID/regions/REGION_A",
      "purpose": "GLOBAL_MANAGED_PROXY",
      "role": "ACTIVE"
    }
   
    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_B/subnetworks

    {
      "name": "PROXY_SN_B",
      "ipCidrRange": "10.130.0.0/23",
      "network": "projects/PROJECT_ID/global/networks/NETWORK",
      "region": "projects/PROJECT_ID/regions/REGION_B",
      "purpose": "GLOBAL_MANAGED_PROXY",
      "role": "ACTIVE"
    }
   

방화벽 규칙 구성

이 예시에서는 다음과 같은 방화벽 규칙을 사용합니다.

  • fw-ilb-to-backends. 부하 분산되는 인스턴스에 적용되는 인그레스 규칙으로 TCP 포트 22에 임의의 주소로부터 수신되는 SSH 연결을 허용합니다. 이 규칙에 더 제한적인 소스 IP 주소 범위를 선택할 수 있습니다. 예를 들어 SSH 세션을 시작할 시스템의 IP 주소 범위만 지정할 수도 있습니다. 이 예시에서는 대상 태그 allow-ssh를 사용해서 방화벽 규칙이 적용되는 VM을 식별합니다.

  • fw-healthcheck. 부하 분산되는 인스턴스에 적용되는 인그레스 규칙으로 Google Cloud 상태 점검 시스템(130.211.0.0/2235.191.0.0/16 참조)의 모든 TCP 트래픽을 허용합니다. 이 예시에서는 load-balanced-backend 대상 태그를 사용하여 방화벽 규칙이 적용되는 VM을 식별합니다.

  • fw-backends: 부하 분산되는 인스턴스에 적용되는 인그레스 규칙으로 내부 프록시 네트워크 부하 분산기의 관리형 프록시로부터 포트 80, 443, 8080로의 TCP 트래픽을 허용합니다. 이 예시에서는 대상 태그 load-balanced-backend를 사용해서 방화벽 규칙이 적용되는 VM을 식별합니다.

이러한 방화벽 규칙이 없으면 기본 거부 인그레스 규칙은 백엔드 인스턴스로 들어오는 트래픽을 차단합니다.

대상 태그는 백엔드 인스턴스를 정의합니다. 대상 태그가 없으면 VPC 네트워크의 모든 백엔드 인스턴스에 방화벽 규칙이 적용됩니다. 백엔드 VM을 만들 때는 관리형 인스턴스 그룹 만들기에 나온 대로 지정된 대상 태그를 포함해야 합니다.

콘솔

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

    방화벽 정책으로 이동

  2. 방화벽 규칙 만들기를 클릭하여 수신 SSH 연결을 허용하는 규칙을 만듭니다.

    • 이름: fw-ilb-to-backends
    • 네트워크: NETWORK
    • 트래픽 방향: 인그레스
    • 일치 시 작업: 허용
    • 대상: 지정된 대상 태그
    • 대상 태그: allow-ssh
    • 소스 필터: IPv4 범위
    • 소스 IPv4 범위: 0.0.0.0/0
    • 프로토콜 및 포트:
      • 지정된 프로토콜 및 포트를 선택합니다.
      • TCP 체크박스를 선택한 후 포트 번호에 22을 입력합니다.
  3. 만들기를 클릭합니다.

  4. 방화벽 규칙 만들기를 다시 한 번 클릭하여 Google Cloud 상태 점검을 허용하는 규칙을 만듭니다.

    • 이름: fw-healthcheck
    • 네트워크: NETWORK
    • 트래픽 방향: 인그레스
    • 일치 시 작업: 허용
    • 대상: 지정된 대상 태그
    • 대상 태그: load-balanced-backend
    • 소스 필터: IPv4 범위
    • 소스 IPv4 범위: 130.211.0.0/2235.191.0.0/16
    • 프로토콜 및 포트:

      • 지정된 프로토콜 및 포트를 선택합니다.
      • TCP 체크박스를 선택한 후 포트 번호에 80을 입력합니다.

      권장사항에 따라서 상태 확인에 사용되는 것과 일치하는 프로토콜 및 포트로 이러한 규칙을 제한합니다. 프로토콜 및 포트에 tcp:80을 사용하면 Google Cloud가 포트 80에서 HTTP를 사용하여 VM에 연결할 수 있지만 포트 443에서 HTTPS를 사용하여 연결할 수는 없습니다.

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

  6. 방화벽 규칙 만들기를 세 번째로 클릭하여 부하 분산기의 프록시 서버를 백엔드에 연결하도록 허용하는 규칙을 만듭니다.

    • 이름: fw-backends
    • 네트워크: NETWORK
    • 트래픽 방향: 인그레스
    • 일치 시 작업: 허용
    • 대상: 지정된 대상 태그
    • 대상 태그: load-balanced-backend
    • 소스 필터: IPv4 범위
    • 소스 IPv4 범위: 10.129.0.0/2310.130.0.0/23
    • 프로토콜 및 포트:
      • 지정된 프로토콜 및 포트를 선택합니다.
      • TCP 체크박스를 선택한 다음 포트 번호로 80, 443, 8080을 입력합니다.
  7. 만들기를 클릭합니다.

gcloud

  1. allow-ssh 네트워크 태그를 사용해 VM으로 가는 SSH 연결을 허용하는 fw-ilb-to-backends 방화벽 규칙을 만듭니다. source-ranges를 생략하면 Google Cloud는 모든 소스를 의미하는 것으로 규칙을 해석합니다.

    gcloud compute firewall-rules create fw-ilb-to-backends \
        --network=NETWORK \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-ssh \
        --rules=tcp:22
    
  2. fw-healthcheck 규칙을 만들어 Google Cloud 상태 점검을 허용합니다. 이 예시에서는 상태 점검 프로버의 모든 TCP 트래픽을 허용합니다. 그러나 필요에 따라 더 좁은 포트 집합을 구성할 수 있습니다.

    gcloud compute firewall-rules create fw-healthcheck \
        --network=NETWORK \
        --action=allow \
        --direction=ingress \
        --source-ranges=130.211.0.0/22,35.191.0.0/16 \
        --target-tags=load-balanced-backend \
        --rules=tcp
    
  3. 내부 프록시 네트워크 부하 분산기의 프록시를 백엔드에 연결하도록 허용하는 fw-backends 규칙을 만듭니다. source-ranges를 프록시 전용 서브넷의 할당된 범위로 설정합니다(예시: 10.129.0.0/2310.130.0.0/23).

    gcloud compute firewall-rules create fw-backends \
        --network=NETWORK \
        --action=allow \
        --direction=ingress \
        --source-ranges=SOURCE_RANGE \
        --target-tags=load-balanced-backend \
        --rules=tcp:80,tcp:443,tcp:8080
    

API

firewalls.insert 메서드POST 요청을 수행하여 fw-ilb-to-backends 방화벽 규칙을 만듭니다. 여기서 PROJECT_ID는 프로젝트 ID로 바꿉니다.

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

{
 "name": "fw-ilb-to-backends",
 "network": "projects/PROJECT_ID/global/networks/NETWORK",
 "sourceRanges": [
   "0.0.0.0/0"
 ],
 "targetTags": [
   "allow-ssh"
 ],
 "allowed": [
  {
    "IPProtocol": "tcp",
    "ports": [
      "22"
    ]
  }
 ],
"direction": "INGRESS"
}

firewalls.insert 메서드POST 요청을 수행하여 fw-healthcheck 방화벽 규칙을 만듭니다. 여기서 PROJECT_ID는 프로젝트 ID로 바꿉니다.

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

{
 "name": "fw-healthcheck",
 "network": "projects/PROJECT_ID/global/networks/NETWORK",
 "sourceRanges": [
   "130.211.0.0/22",
   "35.191.0.0/16"
 ],
 "targetTags": [
   "load-balanced-backend"
 ],
 "allowed": [
   {
     "IPProtocol": "tcp"
   }
 ],
 "direction": "INGRESS"
}

firewalls.insert 메서드로 프록시 서브넷 내에서 TCP 트래픽을 허용하도록 fw-backends 방화벽 규칙을 만듭니다. 여기서 PROJECT_ID는 프로젝트 ID로 바꿉니다.

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

{
 "name": "fw-backends",
 "network": "projects/PROJECT_ID/global/networks/NETWORK",
 "sourceRanges": [
   "10.129.0.0/23",
   "10.130.0.0/23"
 ],
 "targetTags": [
   "load-balanced-backend"
 ],
 "allowed": [
   {
     "IPProtocol": "tcp",
     "ports": [
       "80"
     ]
   },
 {
     "IPProtocol": "tcp",
     "ports": [
       "443"
     ]
   },
   {
     "IPProtocol": "tcp",
     "ports": [
       "8080"
     ]
   }
 ],
 "direction": "INGRESS"
}

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

이 섹션에서는 템플릿 및 관리형 인스턴스 그룹 생성 방법을 보여줍니다. 관리형 인스턴스 그룹은 리전 간 내부 프록시 네트워크 부하 분산기 예시의 백엔드 서버를 실행하는 VM 인스턴스를 제공합니다. 인스턴스 그룹에 HTTP 서비스를 정의하고 해당 포트에 포트 이름을 매핑할 수 있습니다. 부하 분산기의 백엔드 서비스가 트래픽을 이름이 지정된 포트로 전달합니다. 클라이언트에서 전송된 트래픽은 백엔드 서버로 부하 분산됩니다. 여기에서는 백엔드에서 데모용으로 자체 호스트 이름을 제공합니다.

콘솔

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

    인스턴스 템플릿으로 이동

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

      #! /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
      
    7. 만들기를 클릭합니다.

    8. 인스턴스 템플릿 만들기를 클릭합니다.

    9. 이름gil4-backendwest1-template를 입력합니다.

    10. 부팅 디스크Debian GNU/Linux 10(buster)과 같은 Debian 이미지로 설정되었는지 확인합니다. 이 안내에서는 apt-get처럼 Debian에서만 사용할 수 있는 명령어를 사용합니다.

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

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

      1. 네트워크 태그allow-sshload-balanced-backend를 입력합니다.
      2. 네트워크 인터페이스에 다음을 선택합니다.
        • 네트워크: NETWORK
        • 서브넷: SUBNET_A
    13. 관리를 클릭합니다. 시작 스크립트 필드에 다음 스크립트를 입력합니다.

      #! /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
      
    14. 만들기를 클릭합니다.

  2. Google Cloud 콘솔에서 인스턴스 그룹 페이지로 이동합니다.

    인스턴스 그룹으로 이동

    1. 인스턴스 그룹 만들기를 클릭합니다.
    2. 새 관리형 인스턴스 그룹(스테이트리스(Stateless))을 선택합니다. 자세한 내용은 스테이트리스(Stateless) 또는 스테이트풀(Stateful) MIG를 참조하세요.
    3. 이름gl7-ilb-mig-a를 입력합니다.
    4. 위치에서 단일 영역을 선택합니다.
    5. 리전에서 REGION_A을 선택합니다.
    6. 영역에서 ZONE_A를 선택합니다.
    7. 인스턴스 템플릿에서 gil4-backendwest1-template을 선택합니다.
    8. 그룹에 만들 인스턴스의 수를 지정합니다.

      이 예시에서는 자동 확장에서 다음 옵션을 지정합니다.

      • 자동 확장 모드에서 Off:do not autoscale을 선택합니다.
      • 최대 인스턴스 수2를 입력합니다.

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

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

    10. 인스턴스 그룹 만들기를 클릭합니다.

    11. 새 관리형 인스턴스 그룹(스테이트리스(Stateless))을 선택합니다. 자세한 내용은 스테이트리스(Stateless) 또는 스테이트풀(Stateful) MIG를 참조하세요.

    12. 이름gl7-ilb-mig-b를 입력합니다.

    13. 위치에서 단일 영역을 선택합니다.

    14. 리전에서 REGION_B을 선택합니다.

    15. 영역에서 ZONE_B를 선택합니다.

    16. 인스턴스 템플릿에서 gil4-backendeast1-template을 선택합니다.

    17. 그룹에 만들 인스턴스의 수를 지정합니다.

      이 예시에서는 자동 확장에서 다음 옵션을 지정합니다.

      • 자동 확장 모드에서 Off:do not autoscale을 선택합니다.
      • 최대 인스턴스 수2를 입력합니다.

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

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

gcloud

이 가이드의 gcloud CLI 안내에서는 Cloud Shell 또는 bash가 설치된 다른 환경을 사용한다고 가정합니다.

  1. gcloud compute instance-templates create 명령어로 HTTP 서버가 포함된 VM 인스턴스 템플릿을 만듭니다.

    gcloud compute instance-templates create gil4-backendwest1-template \
       --region=REGION_A \
       --network=NETWORK \
       --subnet=SUBNET_A \
       --tags=allow-ssh,load-balanced-backend \
       --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://169.254.169.254/computeMetadata/v1/instance/name)"
         echo "Page served from: $vm_hostname" | \
         tee /var/www/html/index.html
         systemctl restart apache2'
    
    gcloud compute instance-templates create gil4-backendeast1-template \
        --region=REGION_B \
        --network=NETWORK \
        --subnet=SUBNET_B \
        --tags=allow-ssh,load-balanced-backend \
        --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://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 gl7-ilb-mig-a \
        --zone=ZONE_A \
        --size=2 \
        --template=gil4-backendwest1-template
    
    gcloud compute instance-groups managed create gl7-ilb-mig-b \
        --zone=ZONE_B \
        --size=2 \
        --template=gil4-backendeast1-template
    

API

instanceTemplates.insert 메서드로 인스턴스 템플릿을 만듭니다. 여기서 PROJECT_ID는 프로젝트 ID로 바꿉니다.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/instanceTemplates

{
  "name":"gil4-backendwest1-template",
  "properties":{
     "machineType":"e2-standard-2",
     "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\n
            vm_hostname=\"$(curl -H \"Metadata-Flavor:Google\"           
            \\\nhttp://169.254.169.254/computeMetadata/v1/instance/name)\"\n
            echo \"Page served from: $vm_hostname\" | \\\ntee
            /var/www/html/index.html\nsystemctl restart apache2"
          }
        ]
     },
     "networkInterfaces":[
       {
         "network":"projects/PROJECT_ID/global/networks/NETWORK",
         "subnetwork":"regions/REGION_A/subnetworks/SUBNET_A",
         "accessConfigs":[
           {
             "type":"ONE_TO_ONE_NAT"
           }
         ]
       }
     ],
     "disks":[
       {
         "index":0,
         "boot":true,
         "initializeParams":{
           "sourceImage":"projects/debian-cloud/global/images/family/debian-10"
         },
         "autoDelete":true
       }
     ]
  }
}

instanceGroupManagers.insert 메서드로 각 영역에 관리형 인스턴스 그룹을 만듭니다. 여기서 PROJECT_ID는 프로젝트 ID로 바꿉니다.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/{zone}/instanceGroupManagers

{
  "name": "gl7-ilb-mig-a",
  "zone": "projects/PROJECT_ID/zones/ZONE_A",
  "instanceTemplate": "projects/PROJECT_ID/global/instanceTemplates/gil4-backendwest1-template",
  "baseInstanceName": "gl4-ilb-migb",
  "targetSize": 2
}
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/instanceTemplates

{
  "name":"gil4-backendeast1-template",
  "properties":{
     "machineType":"e2-standard-2",
     "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\n
            vm_hostname=\"$(curl -H \"Metadata-Flavor:Google\"           
            \\\nhttp://169.254.169.254/computeMetadata/v1/instance/name)\"\n
            echo \"Page served from: $vm_hostname\" | \\\ntee
            /var/www/html/index.html\nsystemctl restart apache2"
          }
        ]
     },
     "networkInterfaces":[
       {
         "network":"projects/PROJECT_ID/global/networks/NETWORK",
         "subnetwork":"regions/REGION_B/subnetworks/SUBNET_B",
         "accessConfigs":[
           {
             "type":"ONE_TO_ONE_NAT"
           }
         ]
       }
     ],
     "disks":[
       {
         "index":0,
         "boot":true,
         "initializeParams":{
           "sourceImage":"projects/debian-cloud/global/images/family/debian-10"
         },
         "autoDelete":true
       }
     ]
  }
}

instanceGroupManagers.insert 메서드로 각 영역에 관리형 인스턴스 그룹을 만듭니다. 여기서 PROJECT_ID는 프로젝트 ID로 바꿉니다.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/{zone}/instanceGroupManagers

{
  "name": "gl7-ilb-mig-b",
  "zone": "projects/PROJECT_ID/zones/ZONE_A",
  "instanceTemplate": "projects/PROJECT_ID/global/instanceTemplates/gil4-backendwest1-template",
  "baseInstanceName": "gl4-ilb-migb",
  "targetSize": 2
}

부하 분산기 구성

이 예시에서는 다음 리전 간 내부 프록시 네트워크 부하 분산기 리소스를 만드는 방법을 보여줍니다.

  • 전역 TCP 상태 점검
  • 백엔드와 동일한 MIG를 사용하는 전역 백엔드 서비스입니다.
  • 전역 대상 프록시
  • 리전 IP 주소가 있는 전역 전달 규칙 2개. 전달 규칙 IP 주소에 SUBNET_A 또는 SUBNET_B IP 주소 범위를 사용합니다. 프록시 전용 서브넷을 사용하려고 하면 전달 규칙 생성에 실패합니다.

프록시 가용성

Google Cloud 리전에 새로운 부하 분산기의 프록시 용량이 부족한 경우도 있습니다. 이 경우 부하 분산기를 생성할 때 Google Cloud 콘솔에서 프록시 가용성 경고 메시지를 제공합니다. 이 문제를 해결하려면 다음 중 하나를 수행하면 됩니다.

  • 부하 분산기에 다른 리전을 선택합니다. 다른 리전에 백엔드가 있으면 이 방법이 편리합니다.
  • 프록시 전용 서브넷이 이미 할당된 VPC 네트워크를 사용합니다.
  • 용량 문제가 해결될 때까지 기다립니다.

콘솔

구성 시작

  1. Google Cloud 콘솔에서 부하 분산 페이지로 이동합니다.

    부하 분산으로 이동

  2. 부하 분산기 만들기를 클릭합니다.
  3. 부하 분산기 유형네트워크 부하 분산기(TCP/UDP/SSL)를 선택하고 다음을 클릭합니다.
  4. 프록시 또는 패스 스루프록시 부하 분산기를 선택하고 다음을 클릭합니다.
  5. 공개 또는 내부내부를 선택하고 다음을 클릭합니다.
  6. 리전 간 또는 단일 리전 배포에서 리전 간 워크로드에 적합을 선택하고 다음을 클릭합니다.
  7. 구성을 클릭합니다.

기본 구성

  1. 부하 분산기의 이름을 입력합니다.
  2. 네트워크NETWORK을 선택합니다.

2개의 전달 규칙으로 프런트엔드 구성

  1. 프런트엔드 구성을 클릭합니다.
    1. 전달 규칙의 이름을 제공합니다.
    2. 서브네트워크 리전 목록에서 REGION_A를 선택합니다.

      프록시 전용 서브넷 예약

    3. 서브네트워크 목록에서 SUBNET_A를 선택합니다.
    4. IP 주소 목록에서 IP 주소 만들기를 클릭합니다. 고정 내부 IP 주소 예약 페이지가 열립니다.
      • 고정 IP 주소의 이름을 입력합니다.
      • 고정 IP 주소 목록에서 직접 선택을 선택합니다.
      • 커스텀 IP 주소 필드에 10.1.2.99를 입력합니다.
      • 예약을 선택합니다.
  2. 완료를 클릭합니다.
  3. 두 번째 전달 규칙을 추가하려면 프런트엔드 IP 및 포트 추가를 클릭합니다.
    1. 전달 규칙의 이름을 제공합니다.
    2. 서브네트워크 리전 목록에서 REGION_B를 선택합니다.

      프록시 전용 서브넷 예약

    3. 서브네트워크 목록에서 SUBNET_B를 선택합니다.
    4. IP 주소 목록에서 IP 주소 만들기를 클릭합니다. 고정 내부 IP 주소 예약 페이지가 열립니다.
      • 고정 IP 주소의 이름을 입력합니다.
      • 고정 IP 주소 목록에서 직접 선택을 선택합니다.
      • 커스텀 IP 주소 필드에 10.1.3.99를 입력합니다.
      • 예약을 선택합니다.
  4. 완료를 클릭합니다.
백엔드 서비스 구성
  1. 백엔드 구성을 클릭합니다.
  2. 백엔드 서비스 만들기 또는 선택 목록에서 백엔드 서비스 만들기를 클릭합니다.
  3. 백엔드 서비스의 이름을 입력합니다.
  4. 프로토콜에서 TCP를 선택합니다.
  5. 이름이 지정된 포트http를 입력합니다.
  6. 백엔드 유형 목록에서 인스턴스 그룹을 선택합니다.
  7. 새 백엔드 섹션에서 다음을 수행합니다.
    • 인스턴스 그룹 목록에서 REGION_Agl7-ilb-mig-a를 선택합니다.
    • 포트 번호80으로 설정합니다.
    • 완료를 클릭합니다.
    • 다른 백엔드를 추가하려면 백엔드 추가를 클릭합니다.
    • 인스턴스 그룹 목록에서 REGION_Bgl7-ilb-mig-b를 선택합니다.
    • 포트 번호80으로 설정합니다.
    • 완료를 클릭합니다.
  8. 상태 점검 목록에서 상태 점검 만들기를 클릭합니다.
    • 이름 필드에 global-http-health-check를 입력합니다.
    • 프로토콜HTTP로 설정합니다.
    • 포트80으로 설정합니다.
    • 저장을 클릭합니다.

구성 검토

  1. 검토 및 완료를 클릭합니다.
  2. 부하 분산기 구성 설정을 검토합니다.
  3. 만들기를 클릭합니다.

gcloud

  1. gcloud compute health-checks create tcp 명령어로 TCP 상태 점검을 정의합니다.

    gcloud compute health-checks create tcp global-health-check \
       --use-serving-port \
       --global
    
  2. gcloud compute backend-services create 명령어로 백엔드 서비스를 정의합니다.

    gcloud compute backend-services create gl4-gilb-backend-service \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --protocol=TCP \
      --enable-logging \
      --logging-sample-rate=1.0 \
      --health-checks=global-health-check \
      --global-health-checks \
      --global
    
  3. gcloud compute backend-services add-backend 명령어로 백엔드 서비스에 백엔드를 추가합니다.

    gcloud compute backend-services add-backend gl4-gilb-backend-service \
      --balancing-mode=CONNECTION \
      --max-connections=50 \
      --instance-group=gl4-ilb-migb \
      --instance-group-zone=ZONE_A \
      --global
    
    gcloud compute backend-services add-backend gl4-gilb-backend-service \
      --balancing-mode=CONNECTION \
      --max-connections=50 \
      --instance-group=gl4-ilb-migb \
      --instance-group-zone=ZONE_B \
      --global
    
  4. 대상 프록시를 만듭니다.

    gcloud compute target-tcp-proxies create 명령어를 사용하여 대상 프록시를 만듭니다.

    gcloud compute target-tcp-proxies create gilb-tcp-proxy \
      --backend-service=gl4-gilb-backend-service \
      --global
    
  5. REGION_B에 VIP(10.1.2.99)가 있는 전달 규칙과 REGION_A에 VIP(10.1.3.99)가 있는 전달 규칙 두 개를 만듭니다. 자세한 내용은 고정 내부 IPv4 주소 예약을 참조하세요.

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

    올바른 플래그와 함께 gcloud compute forwarding-rules create 명령어를 사용하세요.

    gcloud compute forwarding-rules create gil4forwarding-rule-a \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=NETWORK \
      --subnet=SUBNET_A \
      --subnet-region=REGION_A \
      --address=10.1.2.99 \
      --ports=80 \
      --target-tcp-proxy=gilb-tcp-proxy \
      --global
    
    gcloud compute forwarding-rules create gil4forwarding-rule-b \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=NETWORK \
      --subnet=SUBNET_B \
      --subnet-region=REGION_B \
      --address=10.1.3.99 \
      --ports=80 \
      --target-tcp-proxy=gilb-tcp-proxy \
      --global
    

API

healthChecks.insert 메서드POST 요청을 수행하여 상태 점검을 만듭니다. 여기서 PROJECT_ID는 프로젝트 ID로 바꿉니다.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/healthChecks

{
"name": "global-health-check",
"type": "TCP",
"httpHealthCheck": {
  "portSpecification": "USE_SERVING_PORT"
}
}

backendServices.insert 메서드POST 요청을 수행하여 전역 백엔드 서비스를 만듭니다. 여기서 PROJECT_ID는 프로젝트 ID로 바꿉니다.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices

{
"name": "gl4-gilb-backend-service",
"backends": [
  {
    "group": "projects/PROJECT_ID/zones/ZONE_A/instanceGroups/gl4-ilb-migb",
    "balancingMode": "CONNECTION"
  },
  {
    "group": "projects/PROJECT_ID/zones/ZONE_B/instanceGroups/gl4-ilb-migb",
    "balancingMode": "CONNECTION"
  }
],
"healthChecks": [
  "projects/PROJECT_ID/regions/global/healthChecks/global-health-check"
],
"loadBalancingScheme": "INTERNAL_MANAGED"
}

targetTcpProxies.insert 메서드POST 요청을 수행하여 대상 TCP 프록시를 만듭니다. 여기서 PROJECT_ID는 프로젝트 ID로 바꿉니다.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/targetTcpProxy

{
"name": "l4-ilb-proxy",
}

forwardingRules.insert 메서드POST 요청을 수행하여 전달 규칙을 만듭니다. 여기서 PROJECT_ID는 프로젝트 ID로 바꿉니다.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules

{
"name": "gil4forwarding-rule-a",
"IPAddress": "10.1.2.99",
"IPProtocol": "TCP",
"portRange": "80-80",
"target": "projects/PROJECT_ID/global/targetTcpProxies/l4-ilb-proxy",
"loadBalancingScheme": "INTERNAL_MANAGED",
"subnetwork": "projects/PROJECT_ID/regions/REGION_A/subnetworks/SUBNET_A",
"network": "projects/PROJECT_ID/global/networks/NETWORK",
"networkTier": "PREMIUM"
}
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules

{
"name": "gil4forwarding-rule-b",
"IPAddress": "10.1.3.99",
"IPProtocol": "TCP",
"portRange": "80-80",
"target": "projects/PROJECT_ID/global/targetTcpProxies/l4-ilb-proxy",
"loadBalancingScheme": "INTERNAL_MANAGED",
"subnetwork": "projects/PROJECT_ID/regions/REGION_B/subnetworks/SUBNET_B",
"network": "projects/PROJECT_ID/global/networks/NETWORK",
"networkTier": "PREMIUM"
}

globalForwardingRules.insert 메서드POST 요청을 수행하여 전달 규칙을 만듭니다. 여기서 PROJECT_ID는 프로젝트 ID로 바꿉니다.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules

{
"name": "gil4forwarding-rule-a",
"IPAddress": "10.1.2.99",
"IPProtocol": "TCP",
"portRange": "80-80",
"target": "projects/PROJECT_ID/global/targetTcpProxies/l4-ilb-proxy",
"loadBalancingScheme": "INTERNAL_MANAGED",
"subnetwork": "projects/PROJECT_ID/regions/REGION_A/subnetworks/SUBNET_A",
"network": "projects/PROJECT_ID/global/networks/NETWORK",
"networkTier": "PREMIUM"
}
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules

{
"name": "gil4forwarding-rule-b",
"IPAddress": "10.1.3.99",
"IPProtocol": "TCP",
"portRange": "80-80",
"target": "projects/PROJECT_ID/global/targetTcpProxies/l4-ilb-proxy",
"loadBalancingScheme": "INTERNAL_MANAGED",
"subnetwork": "projects/PROJECT_ID/regions/REGION_B/subnetworks/SUBNET_B",
"network": "projects/PROJECT_ID/global/networks/NETWORK",
"networkTier": "PREMIUM"
}

부하 분산기 테스트

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

  1. REGION_BREGION_A 리전에 클라이언트 VM을 만듭니다.

    gcloud compute instances create l4-ilb-client-a \
        --image-family=debian-10 \
        --image-project=debian-cloud \
        --network=NETWORK \
        --subnet=SUBNET_A \
        --zone=ZONE_A \
        --tags=allow-ssh
    
    gcloud compute instances create l4-ilb-client-b \
        --image-family=debian-10 \
        --image-project=debian-cloud \
        --network=NETWORK \
        --subnet=SUBNET_B \
        --zone=ZONE_B \
        --tags=allow-ssh
    
  2. SSH를 사용하여 각 클라이언트 인스턴스에 연결합니다.

    gcloud compute ssh l4-ilb-client-a --zone=ZONE_A
    
    gcloud compute ssh l4-ilb-client-b --zone=ZONE_B
    
  3. IP 주소가 호스트 이름을 제공하는지 확인합니다.

    • 클라이언트 VM이 두 IP 주소 모두에 연결할 수 있는지 확인합니다. 명령어가 성공하고 요청을 제공한 백엔드 VM의 이름을 반환합니다.

      curl 10.1.2.99
      
      curl 10.1.3.99
      

장애 조치 테스트

  1. REGION_B의 백엔드가 비정상이거나 연결할 수 없는 경우 REGION_A 리전의 백엔드로 장애 조치되는지 확인합니다. 장애 조치를 시뮬레이션하려면 REGION_B에서 모든 백엔드를 삭제합니다.

    gcloud compute backend-services remove-backend gl4-gilb-backend-service \
      --instance-group=gl4-ilb-migb \
      --instance-group-zone=ZONE_B \
      --global
    
  2. SSH를 사용하여 REGION_B의 클라이언트 VM에 연결합니다.

    gcloud compute ssh l4-ilb-client-b \
       --zone=ZONE_B
    
  3. REGION_B 리전의 부하 분산된 IP 주소로 요청을 전송합니다. 명령어 결과에 REGION_A의 백엔드 VM의 응답이 표시됩니다.

    {
    RESULTS=
    for i in {1..100}
    do
      RESULTS="$RESULTS:$(curl -k -s 'https://test.example.com:443' --connect-to test.example.com:443:10.1.3.99:443)"
    done
    echo "***"
    echo "*** Results of load-balancing to 10.1.3.99: "
    echo "***"
    echo "$RESULTS" | tr ':' '\n' | grep -Ev "^$" | sort | uniq -c
    echo
    }
    

추가 구성 옵션

이 섹션에서는 대체 및 추가 구성 옵션을 제공하는 구성 예시를 살펴봅니다. 모든 태스크는 선택사항입니다. 원하는 순서대로 수행할 수 있습니다.

클라이언트 연결 정보를 유지하기 위한 프록시 프로토콜

리전 내부 프록시 네트워크 부하 분산기는 클라이언트의 TCP 연결을 종료하고 VM 인스턴스에 새 연결을 만듭니다. 기본적으로 원래 클라이언트 IP와 포트 정보는 유지되지 않습니다.

원래 연결 정보를 유지하고 인스턴스로 보내려면 프록시 프로토콜(버전 1)을 사용 설정합니다. 이 프로토콜은 요청의 일부로 소스 IP 주소, 대상 IP 주소, 포트 번호가 포함된 추가 헤더를 인스턴스에 보냅니다.

내부 프록시 네트워크 부하 분산기의 백엔드 인스턴스에서 PROXY 프로토콜 헤더를 지원하는 HTTP 또는 HTTPS 서버를 실행하는지 확인합니다. HTTP 또는 HTTPS 서버가 프록시 프로토콜 헤더를 지원하도록 구성되지 않았으면 백엔드 인스턴스가 빈 응답을 반환합니다. 예를 들어 프록시 프로토콜은 Apache HTTP 서버 소프트웨어에서 작동하지 않습니다. Nginx와 같은 다른 웹 서버 소프트웨어를 사용할 수 있습니다.

사용자 트래픽에 프록시 프로토콜을 설정한 경우 상태 점검에도 이를 설정해야 합니다. 동일한 포트에서 상태를 점검하고 콘텐츠를 제공하는 경우 상태 점검의 --proxy-header를 부하 분산기 설정에 맞게 설정합니다.

일반적으로 PROXY 프로토콜 헤더는 다음 형식의 사용자가 읽을 수 있는 한 줄 텍스트입니다.

PROXY TCP4 <client IP> <load balancing IP> <source port> <dest port>\r\n

다음은 PROXY 프로토콜 예시입니다.

PROXY TCP4 192.0.2.1 198.51.100.1 15221 110\r\n

앞의 예시에서 클라이언트 IP는 192.0.2.1, 부하 분산 IP는 198.51.100.1, 클라이언트 포트는 15221, 대상 포트는 110입니다.

클라이언트 IP를 알 수 없는 경우에는 부하 분산기가 다음과 같은 형식으로 프록시 프로토콜 헤더를 생성합니다.

PROXY UNKNOWN\r\n

대상 TCP 프록시의 프록시 프로토콜 헤더 업데이트

이 페이지의 부하 분산기 설정 예시에서는 내부 프록시 네트워크 부하 분산기를 만드는 동안 프록시 프로토콜 헤더를 사용 설정하는 방법을 보여줍니다. 기존 대상 TCP 프록시의 프록시 프로토콜 헤더를 변경하려면 다음 단계를 수행합니다.

콘솔

  1. Google Cloud 콘솔에서 부하 분산 페이지로 이동합니다.

    부하 분산으로 이동

  2. 부하 분산기의 수정을 클릭합니다.

  3. 프런트엔드 구성을 클릭합니다.

  4. 프록시 프로토콜 필드 값을 켜기로 변경합니다.

  5. 업데이트를 클릭하여 변경사항을 저장합니다.

gcloud

다음 명령어에서 --proxy-header 필드를 수정하고 요구사항에 따라 NONE 또는 PROXY_V1로 설정합니다.

gcloud compute target-ssl-proxies update int-tcp-target-proxy \
    --proxy-header=[NONE | PROXY_V1]

여러 내부 전달 규칙 간에 같은 IP 주소 사용

여러 내부 전달 규칙이 동일한 내부 IP 주소를 공유하려면 IP 주소를 예약하고 --purpose 플래그를 SHARED_LOADBALANCER_VIP로 설정해야 합니다.

gcloud

gcloud compute addresses create SHARED_IP_ADDRESS_NAME \
    --region=REGION \
    --subnet=SUBNET_NAME \
    --purpose=SHARED_LOADBALANCER_VIP

세션 어피니티 사용 설정

구성 예시는 세션 어피니티 없이 백엔드 서비스를 만듭니다.

이 절차에서는 백엔드 서비스가 클라이언트 IP 어피니티 또는 생성된 쿠키 어피니티를 사용하도록 예시 부하 분산기의 백엔드 서비스를 업데이트하는 방법을 보여줍니다.

클라이언트 IP 어피니티가 사용 설정되면 부하 분산기는 클라이언트의 IP 주소 및 부하 분산기의 IP 주소(내부 전달 규칙의 내부 IP 주소)에서 생성된 해시를 기반으로 특정 클라이언트의 요청을 동일한 백엔드 VM에 전달합니다.

콘솔

클라이언트 IP 세션 어피니티를 사용 설정하려면 다음 안내를 따르세요.

  1. Google Cloud 콘솔에서 부하 분산 페이지로 이동합니다.
    부하 분산으로 이동
  2. 백엔드를 클릭합니다.
  3. 이 예시에서 만든 백엔드 서비스의 이름을 클릭하고 수정을 클릭합니다.
  4. 백엔드 서비스 세부정보 페이지에서 고급 구성을 클릭합니다.
  5. 세션 어피니티의 메뉴에서 클라이언트 IP를 선택합니다.
  6. 업데이트를 클릭합니다.

gcloud

클라이언트 IP 세션 어피니티를 지정하여 BACKEND_SERVICE 백엔드 서비스를 업데이트하려면 다음 gcloud 명령어를 사용합니다.

gcloud compute backend-services update BACKEND_SERVICE \
    --global \
    --session-affinity=CLIENT_IP

연결 드레이닝 사용 설정

백엔드 서비스에서 연결 드레이닝을 사용 설정하면 트래픽을 제공하는 인스턴스가 종료되거나 수동으로 삭제되거나 자동 확장 처리를 통해 삭제되는 경우 사용자에 대한 방해를 최소화할 수 있습니다. 연결 드레이닝에 대한 자세한 내용은 연결 드레이닝 사용 설정 문서를 참조하세요.

다음 단계