외부 TCP 프록시 부하 분산 개요

외부 TCP 프록시 부하 분산은 인터넷에서 들어오는 TCP 트래픽을 Google Cloud VPC 네트워크의 가상 머신(VM) 인스턴스로 배포하는 역방향 프록시 부하 분산기입니다. 외부 TCP 프록시 부하 분산을 사용하면 TCP 연결을 통해 들어오는 트래픽이 부하 분산 레이어에서 종료된 후 TCP 또는 SSL을 통해 사용 가능한 가장 가까운 백엔드로 전달됩니다.

외부 TCP 프록시 부하 분산을 사용하면 전 세계 모든 사용자의 단일 IP 주소를 사용할 수 있습니다. 외부 TCP 프록시 부하 분산기는 자동으로 트래픽을 사용자와 가장 가까운 백엔드로 라우팅합니다.

프리미엄 등급에서 외부 TCP 프록시 부하 분산을 전역 부하 분산 서비스로 구성할 수 있습니다. 표준 등급을 사용하면 외부 TCP 프록시 부하 분산기가 리전별 부하 분산을 처리합니다.

이 예시에서 서울 및 보스턴에 있는 사용자의 트래픽 연결은 부하 분산 레이어에서 종료됩니다. 이러한 연결은 1a2a로 표시되어 있습니다. 부하 분산기에서 선택한 백엔드 인스턴스로 별도의 연결이 설정됩니다. 이러한 연결은 1b2b로 표시되어 있습니다.

TCP 종료를 사용하는 Cloud Load Balancing(확대하려면 클릭)
TCP 종료를 사용하는 Cloud Load Balancing(확대하려면 클릭)

외부 TCP 프록시 부하 분산은 SMTP(Simple Mail Transfer Protocol)의 포트 25와 같이 잘 알려진 특정 포트의 TCP 트래픽용입니다. 자세한 내용은 포트 사양을 참조하세요. 동일한 포트에서 암호화되는 클라이언트 트래픽의 경우 외부 SSL 프록시 부하 분산을 사용합니다.

외부 TCP 프록시 부하 분산은 TCP 포트 80 또는 8080을 지원하지 않습니다. HTTP(S) 트래픽의 경우 외부 HTTP(S) 부하 분산을 사용합니다.

Google Cloud 부하 분산기의 차이점에 대한 자세한 내용은 다음 문서를 참조하세요.

이점

다음은 외부 TCP 프록시 부하 분산기의 몇 가지 이점입니다.

  • IPv6 종료. 외부 TCP 프록시 부하 분산은 클라이언트 트래픽의 IPv4 주소 및 IPv6 주소를 모두 지원합니다. 클라이언트 IPv6 요청은 부하 분산 레이어에서 종료된 후 IPv4를 통해 백엔드로 프록시 처리됩니다.
  • 지능형 라우팅. 부하 분산기는 용량이 있는 백엔드 위치로 요청을 라우팅할 수 있습니다. 반대로 L3/L4 부하 분산기는 용량에 관계없이 리전 백엔드로 라우팅해야 합니다. 더 스마트한 라우팅을 사용하면 x*N이 아니라 N+1 또는 N+2에서 프로비저닝할 수 있습니다.
  • 보안 패치 적용. TCP 스택에 취약점이 발생하면 Cloud Load Balancing은 백엔드가 안전하게 유지되도록 자동으로 부하 분산기에 패치를 적용합니다.
  • 가장 많이 사용되는 TCP 포트 지원: 25, 43, 110, 143, 195, 443, 465, 587, 700, 993, 995, 1883, 3389, 5222, 5432, 5671, 5672, 5900, 5901, 6379, 8085, 8099, 9092, 9200, 9300.
  • Google Cloud Armor와 통합됩니다. Google Cloud Armor 보안 정책을 사용하여 DDoS 공격과 기타 표적 공격으로부터 인프라를 보호할 수 있습니다.

아키텍처

외부 TCP 프록시 부하 분산기의 구성요소는 다음과 같습니다.

전달 규칙 및 IP 주소

전달 규칙은 IP 주소, 포트, 프로토콜별로 트래픽을 대상 프록시와 백엔드 서비스로 구성된 부하 분산 구성으로 라우팅합니다.

각 전달 규칙은 애플리케이션의 DNS 레코드에 사용할 수 있는 단일 IP 주소를 제공합니다. DNS 기반 부하 분산은 필요 없습니다. 사용할 수 있는 고정 IP 주소를 예약하거나 Cloud Load Balancing에서 IP 주소를 하나 할당하도록 할 수 있습니다. 고정 IP 주소를 예약하는 것이 좋습니다. 그렇지 않으면 전달 규칙을 삭제하고 새 규칙을 만들 때마다 DNS 레코드를 새로 할당된 임시 IP 주소로 업데이트해야 합니다.

외부 TCP 프록시 부하 분산기의 정의에 사용되는 외부 전달 규칙은 전달 규칙 포트 사양에 나와 있는 포트 중 하나를 정확하게 참조할 수 있습니다.

대상 프록시

외부 TCP 프록시 부하 분산은 클라이언트에서 TCP 연결을 종료하고 백엔드에 새 연결을 만듭니다. 대상 프록시는 이러한 새 연결을 백엔드 서비스로 라우팅합니다.

기본적으로 원래 클라이언트 IP 주소와 포트 정보는 유지되지 않습니다. 이 정보를 유지하려면 PROXY 프로토콜을 사용하면 됩니다.

백엔드 서비스

백엔드 서비스는 들어오는 트래픽을 연결된 백엔드 1개 이상에 전달합니다. 각 백엔드는 인스턴스 그룹 또는 네트워크 엔드포인트 그룹과 백엔드의 제공 용량에 대한 정보로 구성됩니다. 백엔드 제공 용량은 CPU 또는 초당 요청 수(RPS)를 기반으로 합니다.

각 외부 TCP 프록시 부하 분산기에는 단일 백엔드 서비스 리소스가 포함됩니다. 백엔드 서비스 변경사항은 즉시 적용되지 않습니다. 변경사항이 Google 프런트엔드(GFE)에 적용되는 데 몇 분 정도 걸릴 수 있습니다.

각 백엔드 서비스는 사용 가능한 백엔드에 수행할 상태 확인을 지정합니다.

사용자에 대한 중단이 최소화되도록 백엔드 서비스에서 연결 드레이닝을 사용 설정할 수 있습니다. 이러한 중단은 백엔드가 종료되거나 수동으로 삭제되거나 자동 확장 처리 과정에서 삭제될 때 발생할 수 있습니다. 연결 드레이닝을 사용하여 서비스 중단을 최소화하기에 대해 자세히 알아보려면 연결 드레이닝 사용 설정을 참조하세요.

백엔드 및 VPC 네트워크

모든 백엔드는 동일한 프로젝트에 있어야 하지만 서로 다른 VPC 네트워크에 있을 수 있습니다. GFE 프록시 시스템은 각 VPC 네트워크의 백엔드와 직접 통신하므로 VPC 네트워크 피어링을 사용하여 여러 VPC 네트워크를 연결할 필요가 없습니다.

백엔드와의 통신에 사용되는 프로토콜

외부 TCP 프록시 부하 분산기에 백엔드 서비스를 구성할 때 백엔드 서비스가 백엔드와 통신하는 데 사용할 프로토콜을 설정합니다. SSL 또는 TCP를 선택할 수 있습니다. 부하 분산기는 사용자가 지정한 프로토콜만 사용하고 다른 프로토콜과의 연결 협상을 시도하지 않습니다.

방화벽 규칙

외부 TCP 프록시 부하 분산과 외부 SSL 프록시 부하 분산에는 다음 방화벽 규칙이 필요합니다.

  • Google 프런트엔드(GFE)의 트래픽이 백엔드에 도달하도록 허용하는 인그레스 허용 방화벽 규칙입니다.

  • 상태 확인 프로브 범위의 트래픽이 백엔드에 도달하도록 허용하는 인그레스 허용 방화벽 규칙입니다. 상태 확인 프로브와 트래픽을 허용해야 하는 이유에 대한 자세한 내용은 프로브 IP 범위 및 방화벽 규칙을 참조하세요.

방화벽 규칙은 GFE 프록시가 아닌 VM 인스턴스 수준에서 구현됩니다. Google Cloud 방화벽 규칙을 사용하여 트래픽이 부하 분산기에 도달하는 것을 막을 수 없습니다.

이러한 방화벽 규칙의 포트를 다음과 같이 구성해야 합니다.

  • 각 백엔드 서비스 상태 점검의 대상 포트에 대한 트래픽을 허용합니다.

  • 인스턴스 그룹 백엔드: 백엔드 서비스의 이름이 지정된 포트와 각 인스턴스 그룹의 이름이 지정된 포트에 연결된 포트 번호 간의 매핑에 따라 구성할 포트를 결정합니다. 동일한 백엔드 서비스에 할당된 인스턴스 그룹에서도 이 포트 번호가 다를 수 있습니다.

  • GCE_VM_IP_PORT NEG 백엔드: 엔드포인트의 포트 번호에 대한 트래픽을 허용합니다.

허용되어야 하는 소스 IP 주소 범위는 다음과 같습니다.

  • 130.211.0.0/22
  • 35.191.0.0/16

이 범위는 GFE의 상태 확인 및 요청에 적용됩니다.

소스 IP 주소

백엔드에서 인식하는 패킷의 소스 IP 주소는 부하 분산기의 Google Cloud 외부 IP 주소가 아닙니다. 다시 말해 TCP 연결이 두 개 있습니다.

  • 원래 클라이언트에서 부하 분산기(GFE)로의 연결 1:

    • 소스 IP 주소: 원래 클라이언트(또는 클라이언트가 NAT 또는 전달 프록시 뒤에 있는 경우 외부 IP 주소)입니다.
    • 대상 IP 주소: 부하 분산기의 IP 주소입니다.
  • 부하 분산기(GFE)에서 백엔드 VM 또는 엔드포인트로의 연결 2:

    • 소스 IP 주소: IP 주소는 방화벽 규칙에 지정된 범위 중 하나입니다.

    • 대상 IP 주소: VPC 네트워크의 백엔드 VM 또는 컨테이너의 내부 IP 주소입니다.

열린 포트

외부 TCP 프록시 부하 분산기는 역방향 프록시 부하 분산기입니다. 부하 분산기는 수신 연결을 종료한 후 부하 분산기에서 백엔드로 새 연결을 엽니다. 이 부하 분산기는 전 세계의 Google 프런트엔드(GFE) 프록시를 사용하여 구현됩니다.

GFE에는 동일한 아키텍처에서 실행되는 다른 Google 서비스를 지원하는 열린 포트가 여러 개 있습니다. GFE에서 열려 있을 가능성이 있는 일부 포트 목록을 보려면 전달 규칙: 포트 사양을 참조하세요. GFE에서 실행되는 다른 Google 서비스에 다른 열린 포트가 있을 수 있습니다.

다음과 같은 이유로 GFE 기반 부하 분산기의 IP 주소에 포트 스캔을 실행하는 것은 감사 측면에서 유용하지 않습니다.

  • 포트 스캔(예: nmap 사용)에서는 일반적으로 TCP SYN 프로브를 수행할 때 응답 패킷이나 TCP RST 패킷을 예상하지 않습니다. 부하 분산기에서 프리미엄 등급 IP 주소를 사용하는 경우 GFE는 다양한 포트의 SYN 프로브에 대한 응답으로 SYN-ACK 패킷을 전송합니다. 하지만 GFE는 부하 분산기의 IP 주소 전달 규칙에 구성된 대상 포트로 전송된 패킷에 대한 응답으로만 패킷을 백엔드로 전송합니다. 다른 부하 분산기의 IP 주소나 전달 규칙에 구성되지 않은 포트의 부하 분산기 IP 주소로 전송된 패킷은 부하 분산기의 백엔드로 패킷이 전송되지 않습니다.

  • 부하 분산기의 IP 주소로 전송되는 패킷은 Google Fleet의 모든 GFE가 응답할 수 있습니다. 하지만 부하 분산기 IP 주소와 대상 포트 조합을 스캔하면 TCP 연결당 GFE 1개만 조사됩니다. 부하 분산기의 IP 주소는 단일 기기 또는 시스템에 할당되지 않습니다. 따라서 GFE 기반 부하 분산기의 IP 주소를 스캔해도 Google Fleet에 있는 모든 GFE가 스캔되지 않습니다.

이러한 점을 고려하여 백엔드 인스턴스의 보안을 감사하는 효과적인 방법을 몇 가지 소개합니다.

  • 보안 감사자는 부하 분산기 구성의 전달 규칙 구성을 검사해야 합니다. 전달 규칙에서는 부하 분산기가 패킷을 수락하여 백엔드로 전달하는 대상 포트를 정의합니다. GFE 기반 부하 분산기의 경우 외부 전달 규칙마다 하나의 대상 TCP 포트만 참조할 수 있습니다.

  • 보안 감사자는 백엔드 VM에 적용 가능한 방화벽 규칙 구성을 검사해야 합니다. 설정한 방화벽 규칙은 GFE에서 백엔드 VM으로 들어오는 트래픽을 차단하지만 GFE로 들어오는 트래픽은 차단하지 않습니다. 권장사항은 방화벽 규칙 섹션을 참조하세요.

공유 VPC 아키텍처

외부 TCP 프록시 부하 분산은 공유 VPC를 사용하는 네트워크를 지원합니다. 공유 VPC를 사용하면 네트워크 관리자와 서비스 개발자 간의 책임을 명확하게 구분할 수 있습니다. 개발팀은 서비스 프로젝트에 서비스를 빌드하는 데 집중할 수 있으며 네트워크 인프라팀은 부하 분산을 프로비저닝하고 관리할 수 있습니다. 공유 VPC에 대해 잘 모른다면 공유 VPC 개요 문서를 참조하세요.

IP 주소 전달 규칙 대상 프록시 및 URL 맵 백엔드 구성요소
외부 IP 주소는 부하 분산기와 동일한 프로젝트에서 정의되어야 합니다. 외부 전달 규칙은 백엔드 인스턴스와 동일한 프로젝트(서비스 프로젝트)에서 정의되어야 합니다. 대상 TCP 프록시 및 URL 맵은 백엔드 인스턴스와 동일한 프로젝트에서 정의되어야 합니다. 전역 백엔드 서비스는 백엔드 인스턴스와 동일한 프로젝트에서 정의되어야 합니다. 이 인스턴스는 백엔드 서비스에 백엔드로 연결된 인스턴스 그룹에 있어야 합니다. 백엔드 서비스와 관련된 상태 확인은 백엔드 서비스와 동일한 프로젝트에서 정의되어야 합니다.

트래픽 분산

외부 TCP 프록시 부하 분산기가 트래픽을 백엔드로 배포하는 방식은 분산 모드와 백엔드를 선택하기 위해 선택한 해싱 메서드(세션 어피니티)에 따라 다릅니다.

연결 분산 방법

외부 TCP 프록시 부하 분산을 프리미엄 등급의 전역 부하 분산 서비스와 표준 등급의 리전 서비스로 구성할 수 있습니다.

프리미엄 등급:

  • Google에서는 전 세계 모든 접속 지점에서 부하 분산기의 IP 주소를 공지합니다. 각 부하 분산기 IP 주소는 전역 Anycast입니다.
  • 여러 리전에서 백엔드로 백엔드 서비스를 구성하면 Google 프런트엔드(GFE)는 사용자에게 가장 가까운 리전의 정상 백엔드 인스턴스 그룹 또는 NEG로 요청을 전달하려고 시도합니다. 프로세스 세부정보는 이 페이지에 설명되어 있습니다.

표준 등급:

  • Google이 전달 규칙의 리전과 연결된 접속 지점에서 부하 분산기 IP 주소를 공지합니다. 부하 분산기에서 리전 외부 IP 주소를 사용합니다.

  • 전달 규칙과 동일한 리전에서 백엔드를 구성할 수 있습니다. 여기에서 설명한 프로세스가 계속 적용되지만 부하 분산기에서 해당 리전 한 곳의 정상 백엔드로만 요청을 전달합니다.

요청 분배 프로세스:

  1. 전달 규칙의 외부 IP 주소는 Google 네트워크 경계의 에지 라우터에서 공지됩니다. 각 공지는 레이어 3/4 부하 분산 시스템(Maglev)에 대한 다음 홉을 나열합니다.
  2. Maglev 시스템은 트래픽을 첫 번째 레이어 Google 프런트엔드(GFE)로 라우팅합니다. 첫 번째 레이어 GFE에서 필요한 경우 TLS를 종료한 후 이 프로세스에 따라 두 번째 레이어 GFE로 트래픽을 라우팅합니다.
    1. 백엔드 서비스가 인스턴스 그룹 또는 GCE_VM_IP_PORT NEG 백엔드를 사용하는 경우 첫 번째 레이어 GFE는 인스턴스 그룹 또는 NEG가 포함된 리전이나 그 근처에 있는 두 번째 레이어 GFE를 선호합니다.
    2. 하이브리드 NEG, 서버리스 NEG, 인터넷 NEG가 있는 백엔드 버킷 및 백엔드 서비스의 경우 첫 번째 레이어 GFE는 리전 하위 집합의 두 번째 레이어 GFE를 선택하여 두 GFE 간의 왕복 시간이 최소화됩니다.

      두 번째 레이어 GFE 환경설정은 보장되는 것은 아니며 Google의 네트워크 조건 및 유지보수에 따라 동적으로 변경될 수 있습니다.

      두 번째 레이어 GFE는 상태 점검 상태와 실제 백엔드 용량 사용량을 인식합니다.

  3. 두 번째 레이어 GFE가 해당 리전의 영역에 있는 백엔드로 요청을 전달합니다.
  4. 프리미엄 등급의 경우 두 번째 레이어 GFE가 다른 리전의 영역에 있는 백엔드로 요청을 보내는 경우가 있습니다. 이러한 동작을 스필오버라고 합니다.
  5. 스필오버에는 다음 두 가지 원칙이 적용됩니다.

    • 두 번째 레이어 GFE에 알려진 모든 백엔드가 용량에 도달하거나 비정상이면 스필오버가 가능합니다.
    • 두 번째 레이어 GFE에는 다른 리전의 영역에서 사용 가능한 정상 백엔드에 대한 정보가 포함됩니다.

    두 번째 레이어 GFE는 일반적으로 백엔드 위치의 하위 집합에 대응하도록 구성됩니다.

    스필오버 동작으로 가능한 모든 Google Cloud 영역이 소진되지 않습니다. 특정 영역 또는 전체 리전의 백엔드로 트래픽을 전달하지 않으려면 용량 확장 처리를 0으로 설정해야 합니다. 상태 점검이 실패하도록 백엔드를 구성해도 두 번째 레이어 GFE가 다른 리전의 영역에 있는 백엔드로 스필오버된다고 보장할 수 없습니다.

  6. 요청을 백엔드로 분산할 때 GFE는 영역 수준에서 운영됩니다.

분산 모드

백엔드 서비스에 백엔드를 추가할 때 부하 분산 모드를 설정합니다.

외부 TCP 프록시 부하 분산의 경우 분산 모드는 CONNECTION 또는 UTILIZATION일 수 있습니다.

부하 분산 모드가 CONNECTION이면 백엔드에서 처리할 수 있는 동시 연결 수에 따라 부하가 분산됩니다. 매개변수 maxConnections(리전 관리형 인스턴스 그룹 제외), maxConnectionsPerInstance, maxConnectionsPerEndpoint 중 하나를 정확하게 지정해야 합니다.

부하 분산 모드가 UTILIZATION이면 인스턴스 그룹의 인스턴스 사용률에 따라 부하가 분산됩니다.

부하 분산기 유형과 지원되는 부하 분산 모드 비교에 대한 자세한 내용은 부하 분산 방법을 참조하세요.

세션 어피니티

세션 어피니티는 백엔드가 정상이고 용량이 있는 한 동일한 클라이언트의 모든 요청을 동일한 백엔드로 전송합니다.

외부 TCP 프록시 부하 분산은 동일한 클라이언트 IP 주소의 모든 요청을 동일한 백엔드에 전달하는 클라이언트 IP 어피니티를 제공합니다.

장애 조치

백엔드가 비정상이 되면 트래픽은 자동으로 동일한 리전에 있는 정상 백엔드로 리디렉션됩니다. 한 리전 내 모든 백엔드가 비정상이면 트래픽이 다른 리전의 정상 백엔드로 분산됩니다(프리미엄 등급만 해당). 모든 백엔드가 비정상이면 부하 분산기가 트래픽을 삭제합니다.

GKE 애플리케이션을 위한 부하 분산

Google Kubernetes Engine에서 애플리케이션을 빌드하는 경우 독립형 NEG를 사용하여 트래픽을 컨테이너로 직접 부하 분산할 수 있습니다. 독립형 NEG에서는 사용자가 직접 NEG가 생성되는 서비스 객체를 만든 후 NEG를 백엔드 서비스와 연결하여 부하 분산기를 포드에 연결해야 합니다.

관련 GKE 문서:

다음 단계