외부 TCP/UDP 네트워크 부하 분산 개요

Google Cloud 외부 TCP/UDP 네트워크 부하 분산(이후 네트워크 부하 분산이라고 칭함)은 프록시 부하 분산기가 아닌 리전 부하 분산기입니다.

네트워크 부하 분산은 Virtual Private Cloud(VPC) 네트워크 내 동일한 리전의 가상 머신(VM) 인스턴스에 트래픽을 분산합니다. 네트워크 부하 분산기는 리전 백엔드에 TCP 또는 UDP 트래픽을 전달합니다.

네트워크 부하 분산기는 모든 포트를 지원합니다. 네트워크 부하 분산을 사용하여 TCP 및 UDP 트래픽의 부하를 분산할 수 있습니다. 부하 분산기는 패스스루 부하 분산기이므로 백엔드는 부하 분산된 TCP 연결 또는 UDP 패킷 자체를 종료합니다. 예를 들어 백엔드에서 HTTPS 웹 서버를 실행하고 네트워크 부하 분산을 사용하여 백엔드 자체에서 TLS를 종료할 수 있습니다.

지원되는 포트에 대한 자세한 내용은 Google Cloud 부하 분산기 요약을 참조하세요.

네트워크 부하 분산에는 다음과 같은 특성이 있습니다.

  • 네트워크 부하 분산은 관리형 서비스입니다.
  • 네트워크 부하 분산은 Andromeda 가상 네트워킹Google Maglev를 통해 구현됩니다.
  • 네트워크 부하 분산기는 프록시가 아닙니다.
  • 백엔드 VM의 응답은 부하 분산기를 통하지 않고 클라이언트에 직접 전달됩니다. 업계에서는 이를 직접 서버 반환이라 합니다.
  • 부하 분산기는 패킷의 소스 IP 주소를 유지합니다.
  • 패킷의 대상 IP 주소는 부하 분산기의 전달 규칙과 연결된 리전의 외부 IP 주소입니다.

따라서 다음을 실행해야 합니다.

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

    게스트 OS 환경 또는 이와 동등한 프로세스는 각 백엔드 VM에서 로컬 경로를 구성합니다. 이러한 경로를 통해 VM은 부하 분산기 전달 규칙의 IP 주소와 일치하는 대상을 가진 패킷을 수락할 수 있습니다.

  • 부하 분산 트래픽을 허용하는 백엔드 인스턴스에서 소프트웨어가 부하 분산기의 전달 규칙과 연결된 IP 주소(또는 임의의 IP 주소 0.0.0.0/0)에 결합되도록 구성해야 합니다.

다음 다이어그램에서는 캘리포니아, 뉴욕, 싱가포르의 사용자를 보여줍니다. 이들 사용자는 myapp, test, travel 등의 백엔드 리소스에 모두 연결합니다. 싱가포르 사용자가 미국 서부 백엔드에 연결하면 범위가 애니캐스트되므로 트래픽이 싱가포르와 가장 가까운 리전으로 인그레스됩니다. 여기서 트래픽은 리전 백엔드로 라우팅됩니다.

리전 백엔드 3개와 전달 규칙 3개(확대하려면 클릭)
네트워크 부하 분산 예시(확대하려면 클릭)

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

프로토콜, 스키마, 범위

각 네트워크 부하 분산기는 TCP 또는 UDP 트래픽 중 하나를 지원합니다. 하지만 둘 다 모두 지원하지 않습니다.

네트워크 부하 분산기는 인터넷에서 발생한 트래픽을 분산하지만

네트워크 부하 분산기 범위는 전역이 아닌 리전입니다. 즉, 네트워크 부하 분산기는 여러 리전에 걸쳐 있을 수 없습니다. 단일 리전 내에서 부하 분산기는 모든 영역을 서비스합니다.

사용 사례

다음 경우에 네트워크 부하 분산을 사용합니다.

  • UDP 트래픽 부하를 분산해야 하거나 다른 부하 분산기에서 지원하지 않는 TCP 포트의 부하를 분산해야 합니다.
  • SSL 트래픽이 부하 분산기가 아닌 백엔드에서 복호화될 수 있습니다. 네트워크 부하 분산기는 이 태스크를 수행할 수 없습니다. 백엔드에서 SSL 트래픽을 복호화하면 VM에 더 큰 CPU 부담이 발생합니다.
  • 부하 분산기의 자체 관리형 SSL 인증서를 사용할 수 있습니다. Google 관리형 SSL 인증서는 HTTP(S) 부하 분산 및 SSL 프록시 부하 분산에만 사용할 수 있습니다.
  • 프록시 해제된 상태의 원래 패킷을 전달해야 합니다.
  • 패스스루 부하 분산기를 사용하는 기존 설정이 있으며 이 설정을 변경하지 않고 마이그레이션하려 합니다.

아키텍처

부하 분산기는 여러 구성요소로 이뤄집니다. 단일 부하 분산기에는 다음이 포함될 수 있습니다.

네트워크 부하 분산기에는 항상 하나의 대상 풀이 있습니다. 여러 전달 규칙이 대상 풀을 참조할 수 있습니다.

대상 풀은 부하 분산기의 백엔드입니다. 트래픽 부하가 분산되는 백엔드 인스턴스를 지정합니다. 각 전달 규칙은 부하 분산기의 프런트엔드입니다. 프로젝트당 전달 규칙 및 대상 풀 수에는 제한이 있습니다.

네트워크 부하 분산기는 주소, 포트, 프로토콜 유형과 같은 수신 IP 프로토콜 데이터를 기준으로 부하를 시스템에 분산합니다.

네트워크 부하 분산기는 패스스루 부하 분산기이므로 백엔드는 원래 클라이언트 요청을 수신합니다. 네트워크 부하 분산기는 전송 계층 보안(TLS) 오프로드 또는 프록시를 수행하지 않습니다. 트래픽은 VM으로 직접 라우팅됩니다.

부하 분산기의 전달 규칙을 만들면 임시 가상 IP 주소(VIP)를 수신하거나 리전 네트워크 블록에서 VIP를 예약합니다.

그런 다음 이 전달 규칙을 대상 풀과 연결합니다. Google의 전역 접속 지점에서 VIP가 애니캐스트되지만 네트워크 부하 분산기의 백엔드는 리전 기준입니다. 부하 분산기에는 여러 리전에 걸쳐 있는 백엔드가 있을 수 없습니다.

Google Cloud 방화벽을 사용하여 백엔드 VM에 대한 액세스를 제어하거나 필터링할 수 있습니다.

네트워크 부하 분산기는 패킷 전달 방법을 결정하기 위해 소스 및 대상 포트, IP 주소, 프로토콜을 검사합니다. TCP 트래픽의 경우 세션 어피니티를 구성하여 부하 분산기의 전달 동작을 수정할 수 있습니다.

부하 분산 알고리즘

기본적으로 트래픽을 인스턴스에 배포하려면 세션 어피니티 값을 NONE으로 설정합니다. Cloud Load Balancing은 소스 IP와 포트, 대상 IP와 포트, 프로토콜의 해시를 기준으로 인스턴스를 선택합니다. 즉, 수신 TCP 연결이 여러 인스턴스에 분산되며 각각의 새 연결은 다른 인스턴스로 전달될 수 있습니다. 연결의 모든 패킷은 연결이 닫힐 때까지 동일한 인스턴스로 전달됩니다. 설정된 연결은 부하 분산 프로세스에서 고려되지 않습니다.

한 연결의 모든 패킷은 세션 어피니티 설정에 관계없이 연결이 닫힐 때까지 선택된 인스턴스로 전달됩니다. 기존 연결은 새 수신 연결의 부하 분산 결정에 영향을 주지 않습니다. 따라서 수명이 긴 TCP 연결을 사용하면 백엔드 간에 불균형이 발생할 수 있습니다.

한 클라이언트에서 수신되는 여러 연결을 동일한 인스턴스에 전달해야 하는 경우 다른 세션 어피니티 설정을 선택할 수 있습니다.

대상 풀

대상 풀 리소스는 전달 규칙에서 들어오는 트래픽을 수신할 인스턴스 그룹을 정의합니다. 전달 규칙이 트래픽을 대상 풀에 연결하면 Cloud Load Balancing은 소스 IP와 포트 및 대상 IP와 포트의 해시를 기준으로 이러한 대상 풀에서 인스턴스를 선택합니다. 인스턴스에 트래픽을 분산하는 방법에 대한 자세한 내용은 이 주제의 부하 분산 알고리즘 섹션을 참조하세요.

대상 풀은 TCP 및 UDP 트래픽을 처리하는 전달 규칙에만 사용될 수 있습니다. 다른 모든 프로토콜의 경우 대상 인스턴스를 만들어야 합니다. 전달 규칙에 사용하려면 먼저 대상 풀을 만들어야 합니다. 각 프로젝트에는 최대 50개의 대상 풀이 있을 수 있습니다.

대상 풀에 단일 가상 머신 인스턴스가 포함되도록 하려면 대신 프로토콜 전달 기능을 사용하는 것이 좋습니다.

네트워크 부하 분산은 Cloud Load Balancing 자동 확장 처리를 지원하므로 개발자는 백엔드 사용률을 기준으로 대상 풀의 인스턴스 그룹에서 자동 확장을 수행할 수 있습니다. 자세한 내용은 CPU 사용률을 기준으로 확장을 참조하세요.

전달 규칙

전달 규칙은 대상 풀 및 대상 인스턴스와 함께 작동하여 부하 분산을 지원합니다. 부하 분산을 사용하려면 특정 대상 풀에 트래픽을 전달하는 전달 규칙을 만들어야 합니다. 전달 규칙 없이는 트래픽의 부하를 분산할 수 없습니다.

각 전달 규칙은 특정 IP 주소, 프로토콜, 포트 범위(선택사항)를 단일 대상 풀과 일치시킵니다. 트래픽이 전달 규칙에 의해 제공되는 외부 IP 주소로 전송되면 전달 규칙이 해당 트래픽을 해당 대상 풀로 전달합니다.

Google Cloud VPC 네트워크에 도착하기 전에 조각화될 가능성이 있는 UDP 패킷의 부하를 분산하는 경우 부하 분산 및 조각화된 UDP 패킷을 참조하세요.

여러 전달 규칙

동일한 외부 TCP/UDP 네트워크 부하 분산기에 여러 리전 외부 전달 규칙을 구성할 수 있습니다. 선택에 따라 각 전달 규칙마다 각기 다른 리전 외부 IP 주소가 있을 수 있으며 여러 전달 규칙이 동일한 리전 외부 IP 주소를 가질 수 있습니다.

여러 리전 외부 전달 규칙을 구성하면 다음과 같은 경우에 유용합니다.

  • 동일한 대상 풀에 외부 IP 주소를 두 개 이상 구성해야 하는 경우
  • 동일한 대상 풀에 동일한 외부 IP 주소를 사용하여 다른 포트 범위나 프로토콜을 구성해야 하는 경우.

여러 전달 규칙을 사용할 경우 백엔드 VM에서 실행 중인 소프트웨어가 모든 필수 IP 주소에 결합되도록 구성해야 합니다. 이는 부하 분산기를 통해 전달된 패킷의 대상 IP 주소가 해당 리전 외부 전달 규칙과 연결된 리전 외부 IP 주소이기 때문에 필요합니다.

상태 확인

Compute Engine에서는 상태 확인을 통해 수신 가능한 인스턴스에만 새 연결을 전달합니다. Compute Engine에서는 지정된 빈도로 각 인스턴스에 상태 확인 요청을 전송합니다. 인스턴스가 허용된 상태 확인 실패 횟수를 초과하면 더 이상 새 트래픽을 수신할 수 있는 인스턴스로 간주되지 않습니다. 인스턴스를 정상적으로 종료하고 TCP 연결을 닫을 수 있도록 기존 연결은 종료되지 않습니다.

상태 확인기에서는 계속 비정상적인 인스턴스를 쿼리하고 지정된 수 만큼 확인이 성공하면 풀에 인스턴스를 반환합니다. 모든 인스턴스가 UNHEALTHY로 표시된 경우 부하 분산기는 새 트래픽을 모든 기존 인스턴스에 전달합니다.

네트워크 부하 분산은 기존 HTTP 상태 확인을 통해 인스턴스 상태를 확인합니다. 서비스가 HTTP를 사용하지 않더라도 상태 확인 시스템이 쿼리할 수 있는 각 인스턴스에서 기본 웹 서버를 실행해야 합니다.

기존 HTTPS 상태 확인은 네트워크 부하 분산기에서 지원되지 않으며 대부분의 다른 부하 분산기 유형과 함께 사용할 수 없습니다.

반환 경로

Google Cloud는 상태 확인을 위해 VPC 네트워크에 정의되지 않은 특수 경로를 사용합니다. 자세한 내용은 부하 분산기 반환 경로를 참조하세요.

방화벽 규칙

네트워크 부하 분산기의 상태 확인은 이들 IP 범위에서 전송됩니다. 이 범위에서 트래픽을 허용하는 인그레스 허용 방화벽 규칙을 만들어야 합니다.

네트워크 부하 분산은 패스스루 부하 분산기입니다. 즉, 방화벽 규칙에서 클라이언트 소스 IP 주소의 트래픽을 허용해야 합니다. 서비스가 인터넷에 공개되어 있으면 모든 IP 범위의 트래픽을 허용하는 것이 가장 쉽습니다. 특정 소스 IP 주소만 허용하도록 액세스를 제한하려면 이러한 제한이 적용되도록 방화벽 규칙을 설정하면 됩니다. 하지만 상태 확인 IP 범위의 액세스를 허용해야 합니다.

방화벽 규칙의 예시와 구성 예시는 네트워크 부하 분산 규칙을 참조하세요.

세션 연관성

네트워크 부하 분산에서는 백엔드 서비스 세션 어피니티를 사용하지 않습니다. 대신 네트워크 부하 분산기는 세션 어피니티의 대상 풀을 사용합니다.

자세한 내용은 대상 풀 사용sessionAffinity 매개변수를 참조하세요.

부하 분산 및 조각화된 UDP 패킷

UDP 패킷을 부하 분산하는 경우 다음 사항에 유의하세요.

  1. 조각화되지 않은 패킷은 모든 구성에서 정상적으로 처리됩니다.
  2. UDP 패킷은 Google Cloud에 도달하기 전에 조각화될 수 있습니다. 그러면 개입 네트워크에서는 모든 조각이 도달할 때까지 기다린 후에 전달하므로 지연이 발생하거나 조각이 삭제될 수 있습니다. Google Cloud에서는 모든 조각을 기다리지 않으며 각 조각이 도착하자마자 전달합니다.
  3. 후속 UDP 조각에는 대상 포트가 포함되지 않으므로 다음 상황에서 문제가 발생할 수 있기 때문입니다.

    • 대상 풀 세션 어피니티가 NONE(5튜플 어피니티)으로 설정된 경우 부하 분산기가 5튜플 해시를 계산할 수 없으므로 후속 조각이 삭제될 수 있습니다.
    • 동일한 부하 분산 IP 주소에 UDP 전달 규칙이 두 개 이상 있는 경우 후속 조각이 잘못된 전달 규칙으로 도달할 수 있습니다.

조각화된 UDP 패킷이 수신될 것으로 예상되면 다음을 수행합니다.

  • 세션 어피니티를 CLIENT_IP_PROTO 또는 CLIENT_IP로 설정합니다. NONE(5튜플 해싱)을 사용하지 않습니다. CLIENT_IP_PROTOCLIENT_IP는 대상 포트를 해싱에 사용하지 않으므로 첫 번째 조각과 마찬가지로 후속 조각에 동일한 해시를 계산할 수 있습니다.
  • 부하 분산된 IP 주소당 UDP 전달 규칙을 하나만 사용합니다. 이렇게 하면 모든 조각이 동일한 전달 규칙에 의해 도달합니다.

이러한 설정을 사용하면 동일한 패킷의 UDP 조각이 같은 인스턴스에 전달되어 리어셈블리됩니다.

다음 단계