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 프록시 부하 분산을 사용합니다.

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.

아키텍처

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)에 적용되는 데 몇 분 정도 걸릴 수 있습니다.

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

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

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

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

방화벽 규칙

백엔드 인스턴스는 다음 소스에서의 연결을 허용해야 합니다.

  • 백엔드로 전송되는 모든 요청의 부하 분산기 Google 프런트엔드(GFE)
  • 상태 점검 프로브

이 트래픽을 허용하려면 인그레스 방화벽 규칙을 만들어야 합니다. 이러한 방화벽 규칙의 포트에서 다음과 같이 트래픽을 허용해야 합니다.

  • 각 백엔드 서비스 상태 확인의 대상 포트로의 트래픽

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

  • GCE_VM_IP_PORT NEG 백엔드의 경우: 엔드포인트의 포트 번호로의 트래픽입니다.

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

상태 확인 프로브와 그 트래픽을 허용해야 하는 이유에 대한 자세한 내용은 프로브 IP 범위 및 방화벽 규칙을 참조하세요.

SSL 프록시 부하 분산기 및 TCP 프록시 부하 분산기의 경우 필수 소스 범위는 다음과 같습니다.

  • 130.211.0.0/22
  • 35.191.0.0/16

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

소스 IP 주소

백엔드에서 확인되는 패킷의 소스 IP 주소는 부하 분산기의 Google Cloud 외부 IP 주소가 아닙니다. 즉, TCP 연결이 2개 존재합니다.

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

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

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

    • 대상 IP 주소: Virtual Private Cloud(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 주소로 전송된 패킷은 부하 분산기의 백엔드로 패킷이 전송되지 않습니다. 특별한 구성이 없더라도 Google 인프라와 GFE에서 DDoS 공격 및 SYN 플러드에 대한 심층 방어를 제공합니다.

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

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

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

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

트래픽 분산

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

연결 분산 방법

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

프리미엄 등급:

  • 백엔드 서비스 하나만 가질 수 있으며 백엔드 서비스는 여러 리전에서 백엔드를 가질 수 있습니다. 전역 부하 분산의 경우 백엔드를 여러 리전에 배포하면 부하 분산기에서 자동으로 트래픽을 사용자와 가장 가까운 리전에 전달합니다. 트래픽 집중 리전의 경우 부하 분산기가 자동으로 새 연결을 사용 가능한 용량이 있는 다른 리전에 전달합니다. 기존 사용자 연결은 현재 리전에 계속 유지됩니다.
  • Google이 전 세계 모든 접속 지점에서 부하 분산기의 IP 주소를 공지합니다. 각 부하 분산기 IP 주소는 전역 Anycast입니다.
  • 여러 리전에서 백엔드로 백엔드 서비스를 구성하면 Google 프런트엔드(GFE)는 사용자에게 가장 가까운 리전의 정상 백엔드 인스턴스 그룹 또는 NEG로 요청을 전달하려고 시도합니다. 프로세스 세부정보는 이 페이지에 설명되어 있습니다.

표준 등급:

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

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

요청 분배 프로세스:

분산 모드와 선택한 대상에 따라 각 영역별 GCE_VM_IP_PORT NEG, 영역 인스턴스 그룹 또는 리전 인스턴스 그룹 영역의 관점에서 백엔드의 가득 찬 상태가 정의됩니다. 그런 다음 일관된 해싱으로 영역 내에서 분산이 이루어집니다.

부하 분산기는 다음 프로세스를 사용합니다.

  1. 전달 규칙의 외부 IP 주소는 Google 네트워크 경계의 에지 라우터에서 공지됩니다. 각 공지는 사용자와 최대한 가까운 곳에서 레이어 3/4 부하 분산 시스템(Maglev)에 대한 다음 홉을 나열합니다.
  2. Maglev 시스템에서 수신 패킷의 소스 IP 주소를 검사합니다. Google의 지역 IP 시스템에서 사용자와 가장 근접하다고 판단한 Maglev 시스템으로 수신 요청을 전달합니다.
  3. 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는 상태 점검 상태와 실제 백엔드 용량 사용량을 인식합니다.

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

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

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

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

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

    연결 수가 적은 경우 두 번째 레이어 GFE가 다른 영역보다 리전의 한 영역을 선호하는 경우가 있습니다. 이 선호 사항은 정상이며 예상할 수 있습니다. 부하 분산기가 더 많은 연결을 수신할 때까지 리전의 영역 간 분산이 일정하지 않습니다.

분산 모드

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

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

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

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

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

세션 어피니티

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

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

장애 조치

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

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

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

관련 GKE 문서:

제한사항

  • TCP 프록시 부하 분산기는 VPC 네트워크 피어링을 지원하지 않습니다.

다음 단계