하이브리드 연결 네트워크 엔드포인트 그룹을 사용하여 네트워크 에지 서비스 설정

Google은 온프레미스 데이터 센터 또는 다른 퍼블릭 클라우드에서 Google Cloud 외부 기반 서비스(온프레미스 및 멀티 클라우드 서비스)의 기능 및 보안을 강화시켜 주는 다양한 네트워크 에지 서비스를 제공합니다.

이러한 네트워크 에지 서비스를 사용하면 다음을 수행할 수 있습니다.

  • 외부 고객 트래픽을 수락하고 단일 Anycast VIP를 사용해 전 세계로 라우팅

  • 외부 애플리케이션 부하 분산기Google 관리 SSL 인증서를 사용하여 에지에서 TLS 트래픽을 종료하여 서버 부하를 줄입니다.

  • 사전 구성된 웹 애플리케이션 방화벽(WAF) 규칙을 사용 설정하고 Google Cloud Armor를 사용하여 들어오는 트래픽에 허용 목록 및 차단 목록을 적용합니다.

  • IAP(Identity-Aware Proxy)를 사용하여 애플리케이션 및 리소스에 대한 사용자 액세스 제어

  • Cloud CDN을 사용하여 콘텐츠 전송 및 최종 사용자 지연 시간 최적화

네트워크 에지 서비스 예시
네트워크 에지 서비스 예시(확대하려면 클릭)

비공개, 온프레미스, 멀티 클라우드 서비스에 이러한 이점을 가져오기 위해서는 공개 인터넷에서 트래픽을 수신하도록 외부 애플리케이션 부하 분산기를 배포합니다. 외부 애플리케이션 부하 분산기는 Cloud Service Mesh가 구성하는 중간 프록시로 트래픽을 전달합니다. 이 중간 프록시는 Cloud VPN 또는 Cloud Interconnect를 사용하여 온프레미스 환경 또는 Google Cloud 이외의 환경으로 트래픽을 라우팅합니다.

이 가이드에서는 Google 에지에서 Google Cloud Armor를 사용하여 선택적으로 클라이언트가 온프레미스 서비스에 비공개로 액세스할 수 있게 해주는 엔드 투 엔드 예시를 살펴봅니다. 클라이언트는 해당 IP 주소를 기반으로 액세스가 허용됩니다.

다음 작업을 완료합니다.

  1. Envoy를 관리형 인스턴스 그룹(MIG)에 중간 프록시로 배포합니다. 이 Envoy 프록시는 Cloud Service Mesh에 자동으로 연결됩니다.
  2. 시뮬레이션된 비공개 온프레미스 가상 머신(VM) 인스턴스를 만듭니다. 실제 예시에는 온프레미스 VM이 이미 있을 것입니다.
  3. 중간 프록시에 도달하는 모든 요청을 시뮬레이션된 온프레미스 VM으로 라우팅하도록 Cloud Service Mesh를 구성합니다.
  4. 공개 인터넷에서 트래픽을 수신하고 중간 프록시로 전달하는 외부 애플리케이션 부하 분산기를 만듭니다.
  5. 외부 애플리케이션 부하 분산기에 Google Cloud Armor 보안 정책을 연결합니다.

이 작업을 완료한 후에는 선택적으로 추가적인 에지 서비스 및 고급 트래픽 관리 기능을 살펴볼 수 있습니다.

기본 요건

중간 프록시를 설정하기 전에 다음 작업을 완료합니다.

  • Envoy로 Cloud Service Mesh 설정 준비를 검토하고 필요한 권한과 역할 부여, Cloud Service Mesh API 사용 설정 등 모든 기본 요건 작업을 완료합니다.

  • Cloud VPN 또는 Cloud Interconnect를 통해 Google Cloud Virtual Private Cloud(VPC) 네트워크 내에서 비공개 온프레미스 엔드포인트에 연결할 수 있는지 확인합니다. 이 튜토리얼에서 사용하는 예시에서는 Google Cloud 내의 엔드포인트로만 트래픽을 라우팅하므로 하이브리드 연결을 구성할 필요가 없습니다. 실제 배포 시나리오에서는 하이브리드 연결을 구성해야 합니다.

  • VPC 서브넷 CIDR 범위가 원격 CIDR 범위와 충돌하지 않는지 확인합니다. 서브넷 경로는 IP 주소가 겹칠 때 원격 연결보다 우선 적용됩니다.

  • 이 데모에서는 Google Cloud Armor 보안 정책을 만들고 업데이트하기 위한 권한이 필요합니다. Cloud CDN과 같은 다른 서비스를 사용할 경우에는 권한이 달라질 수 있습니다.

Compute Engine VM에 중간 프록시 배포

이 섹션에서는 외부 부하 분산기에서 트래픽을 수신하고 이를 원격 대상으로 전달하기 위해 Compute Engine의 중간 프록시로 Envoy를 배포하는 방법을 설명합니다.

중간 프록시용 인스턴스 템플릿 만들기

인스턴스 템플릿은 관리형 인스턴스 그룹(MIG) 내 VM의 구성을 지정합니다.

  1. 다음 템플릿을 사용하여 Cloud Service Mesh에 연결된 Envoy 프록시로 VM 인스턴스를 만듭니다.

    gcloud compute instance-templates create td-middle-proxy \
        --service-proxy=enabled \
        --tags=allow-hc
    
  2. 네트워크 이름 지정, 로그 경로 설정, 추적 사용 설정 등을 통해 Envoy 배포를 맞춤설정하려면 자동 Envoy 배포 옵션 가이드를 참조하세요.

중간 프록시용 MIG 만들기

  1. 템플릿을 기반으로 MIG를 만듭니다. 이 예시에서는 단일 인스턴스를 배포하기 위해 인스턴스 그룹 크기 1을 유지할 수 있습니다. 프로덕션 사용을 위해서는 중간 프록시가 대량의 트래픽을 처리해야 할 경우 병목 현상 발생을 방지하기 위해 CPU 사용률 등을 기준으로 자동 확장을 사용 설정합니다.

    gcloud compute instance-groups managed create td-middle-proxy-us-central1-a \
        --zone=us-central1-a \
        --template=td-middle-proxy \
        --size=1
    
  2. 이후 구성 및 확인을 위해 인스턴스의 내부 IP 주소를 확인하고 MIDDLE_PROXY_IP에 저장합니다.

    MIDDLE_PROXY_IP=$(gcloud compute instances list \
        --filter="name~'td-middle-proxy-us-central1-a-.*'" \
        --zones=us-central1-a \
        --format="value(networkInterfaces.networkIP)")
    

이 예시에서는 us-central1-a에 Envoy를 실행하는 VM 인스턴스가 포함된 MIG를 만듭니다. 이 튜토리얼의 뒷부분에서는 클라이언트의 공개 인터넷 트래픽을 처리하기 위해 외부 부하 분산기를 만듭니다.

외부 부하 분산기가 클라이언트와 가장 가까운 리전과 이 리전 내의 MIG로 트래픽을 자동으로 라우팅할 수 있기 때문에, MIG를 여러 개 만들도록 고려해볼 수 있습니다. Google Cloud의 사용 가능한 리전 및 영역 전체 목록은 리전 및 영역을 참조하세요.

시뮬레이션된 온프레미스 서비스 배포

이 섹션에서는 하이브리드 연결 네트워크 엔드포인트 그룹(NEG)을 배포하는 방법을 설명합니다. 프로덕션 배포에서 이 NEG에는 온프레미스 서버로 확인되는 엔드포인트(IP:port)가 포함됩니다. 이 예시에서는 IP:port에서 연결할 수 있는 Compute Engine VM을 만듭니다. 이 VM은 시뮬레이션된 온프레미스 서버 역할을 수행합니다.

시뮬레이션된 온프레미스 VM 만들기

  1. 단일 VM 인스턴스를 배포하여 비공개 온프레미스 서버를 시뮬레이션합니다.

    gcloud compute instances create on-prem-vm \
        --zone=us-central1-a \
        --metadata startup-script='#! /bin/bash
    ## Installs apache and a custom homepage
    sudo su -
    apt-get update
    apt-get install -y apache2
    cat <<EOF > /var/www/html/index.html
    <html><body><h1>Hello world from on-premises!</h1></body></html>
    EOF'
    
  2. 이후 구성 및 확인을 위해 내부 IP 주소를 식별하고 저장합니다. 이 VM의 서버는 포트 80에서 인바운드 요청을 리슨합니다.

    ON_PREM_IP=$(gcloud compute instances describe on-prem-vm \
        --zone=us-central1-a \
        --format="value(networkInterfaces.networkIP)" | sed "s/['\[\]]*//g")
    

NEG 만들기

non-gcp-private-ip-port 네트워크 엔드포인트 유형을 지정하여 이 데모 설정의 NEG를 만듭니다. 시뮬레이션된 온프레미스 VM의 IP 주소와 포트를 이 NEG의 엔드포인트로 추가합니다. 이전 단계에 이어서 IP 주소가 ON_PREM_IP 환경 변수에 저장됩니다.

  1. NEG를 만듭니다.

    gcloud compute network-endpoint-groups create td-on-prem-neg \
        --network-endpoint-type=non-gcp-private-ip-port \
        --zone=us-central1-a
    
  2. 새 NEG에 IP:port를 추가합니다.

    gcloud compute network-endpoint-groups update td-on-prem-neg \
        --zone=us-central1-a \
        --add-endpoint="ip=$ON_PREM_IP,port=80"
    

Cloud Load Balancing 구성요소로 Cloud Service Mesh 구성

이 섹션에서는 Cloud Service Mesh를 구성하고 중간 프록시가 트래픽을 비공개 온프레미스 서비스로 전달하도록 설정하는 방법을 보여줍니다. 다음 구성요소를 구성합니다.

  • 상태 확인. 이 상태 확인은 다른 NEG 유형에 구성된 상태 확인과 약간 다르게 작동합니다.

  • 백엔드 서비스. 자세한 내용은 백엔드 서비스 개요를 참조하세요.

  • 라우팅 규칙 맵. 이 단계에는 전달 규칙, 대상 프록시, URL 맵 만들기가 포함됩니다. 자세한 내용은 라우팅 규칙 맵을 참조하세요.

상태 확인 만들기

상태 확인은 엔드포인트가 정상이고 요청을 수신할 수 있는지 확인합니다. 이 NEG 유형에 대한 상태 확인에는 Envoy의 분산형 상태 확인 메커니즘이 사용됩니다.

다른 NEG 유형은 Google Cloud의 중앙 집중식 상태 확인 시스템을 사용합니다.

gcloud compute health-checks create http td-on-prem-health-check

백엔드 서비스 만들기

  1. Cloud Service Mesh에 사용할 INTERNAL_SELF_MANAGED 부하 분산 스키마로 백엔드 서비스를 만듭니다. 이 백엔드 서비스를 만들 때 바로 전에 만든 상태 확인을 지정합니다.

    gcloud compute backend-services create td-on-prem-backend-service \
        --global \
        --load-balancing-scheme=INTERNAL_SELF_MANAGED \
        --health-checks=td-on-prem-health-check
    
  2. 앞서 만든 NEG를 이 백엔드 서비스의 백엔드로 추가합니다.

    gcloud compute backend-services add-backend td-on-prem-backend-service \
        --global \
        --network-endpoint-group=td-on-prem-neg \
        --network-endpoint-group-zone=us-central1-a \
        --balancing-mode=RATE \
        --max-rate-per-endpoint=5
    

라우팅 규칙 맵 만들기

라우팅 규칙 맵은 Cloud Service Mesh가 백엔드 서비스로 트래픽을 라우팅하는 방법을 정의합니다.

  1. 이전에 정의된 백엔드 서비스를 사용하는 URL 맵을 만듭니다.

    gcloud compute url-maps create td-hybrid-url-map \
        --default-service=td-on-prem-backend-service
    
  2. 다음 콘텐츠로 target_proxy.yaml이라는 파일을 만듭니다.

    name: td-hybrid-proxy
    proxyBind: true
    urlMap: global/urlMaps/td-hybrid-url-map
    
  3. import 명령어를 사용하여 대상 HTTP 프록시를 만듭니다. 자세한 내용은 Cloud Service Mesh의 대상 프록시를 참조하세요.

    gcloud compute target-http-proxies import td-hybrid-proxy \
        --source=target_proxy.yaml
    
  4. 이 대상 HTTP 프록시를 참조하는 전달 규칙을 만듭니다. 전달 규칙의 IP 주소를 0.0.0.0으로 설정합니다. 규칙의 IP 주소를 0.0.0.0으로 설정하면 인바운드 포트, HTTP 호스트 이름, URL 맵에 구성된 경로 정보를 기반으로 트래픽을 라우팅합니다. HTTP 요청에 지정된 IP 주소는 무시됩니다.

    gcloud compute forwarding-rules create td-hybrid-forwarding-rule \
        --global \
        --load-balancing-scheme=INTERNAL_SELF_MANAGED \
        --address=0.0.0.0 \
        --target-http-proxy=td-hybrid-proxy \
        --ports=8080 \
        --network=default
    

중간 프록시가 시뮬레이션된 온프레미스 서비스로 요청을 라우팅할 수 있는지 확인

이제 Cloud Service Mesh가 중간 프록시를 통해 시뮬레이션된 비공개 온프레미스 서비스로 트래픽을 라우팅하도록 구성됩니다. 테스트 클라이언트 VM을 만들고, 해당 VM에 로그인하고, Envoy를 실행하는 중간 프록시로 요청을 전송하여 이 구성을 확인할 수 있습니다. 구성을 확인한 후 테스트 클라이언트 VM을 삭제합니다.

  1. 먼저 중간 프록시의 IP 주소를 가져옵니다. 확인 단계에만 이 정보가 필요합니다.

    gcloud compute instances list
    
  2. td-middle-proxy-us-central1-a MIG에 있는 인스턴스의 IP 주소를 기록합니다.

  3. 테스트 클라이언트 인스턴스를 만듭니다.

    gcloud compute instances create test-client \
        --zone=us-central1-a
    
  4. ssh를 사용하여 테스트 클라이언트에 로그인합니다.

    gcloud compute ssh test-client
        --zone=us-central1-a
    
  5. 이전에 가져온 IP 주소를 MIDDLE_PROXY_IP로 바꿔 중간 프록시 VM에 요청을 보냅니다.

    curl $MIDDLE_PROXY_IP:8080
    

    다음과 같은 출력이 표시됩니다.

    Hello world from on-premises!
    
  6. 테스트 클라이언트 VM을 종료합니다. 종료한 후 VM을 삭제할 수 있습니다.

    gcloud compute instances delete test-client \
        --zone=us-central1-a
    

외부 애플리케이션 부하 분산기 배포

이 섹션에서는 수신 트래픽을 중간 프록시로 전송하는 외부 애플리케이션 부하 분산기를 배포합니다. 이 배포는 표준 외부 애플리케이션 부하 분산기 설정입니다.

외부 IP 주소 예약

외부 클라이언트가 트래픽을 전송할 전역 고정 외부 IP 주소(external-lb-vip)를 만듭니다. 이 외부 IP 주소는 이 튜토리얼의 뒷부분에 나오는 인증 단계에서 가져옵니다.

gcloud compute addresses create external-lb-vip \
    --ip-version=IPV4 \
    --global

외부 HTTP 부하 분산기 설정

인터넷 고객 트래픽을 이미 구성된 중간 프록시로 라우팅하도록 외부 부하 분산기를 구성합니다.

  1. 중간 프록시를 실행하는 MIG가 정상 상태이고 트래픽을 수신할 수 있는지 확인하는 데 사용되는 상태 확인을 만듭니다.

    gcloud compute health-checks create tcp tcp-basic-check \
        --port=8080
    
  2. 상태 확인을 허용하는 방화벽 규칙을 만듭니다. 여기에서는 allow-hc 태그를 재사용하여 중간 프록시 VM에 방화벽 규칙을 적용합니다.

    gcloud compute firewall-rules create fw-allow-health-checks \
        --network=default \
        --action=ALLOW \
        --direction=INGRESS \
        --source-ranges=35.191.0.0/16,130.211.0.0/22 \
        --target-tags=allow-hc \
        --rules=tcp
    
  3. 백엔드 서비스를 만듭니다.

    gcloud compute backend-services create td-middle-proxy-backend-service \
        --protocol=HTTP \
        --health-checks=tcp-basic-check \
        --global
    
  4. 중간 프록시 MIG를 이 백엔드 서비스에 백엔드로 추가합니다.

    gcloud compute backend-services add-backend td-middle-proxy-backend-service \
        --instance-group=td-middle-proxy-us-central1-a \
        --instance-group-zone=us-central1-a \
        --global
    
  5. 들어오는 요청을 기본 백엔드 서비스인 중간 프록시로 라우팅하는 URL 맵을 만듭니다.

    gcloud compute url-maps create lb-map-http \
        --default-service=td-middle-proxy-backend-service
    
  6. 외부 부하 분산기의 전달 규칙 가상 IP 주소(VIP)에 대한 요청이 URL 맵에 따라 처리되도록 대상 HTTP 프록시를 만듭니다.

    gcloud compute target-http-proxies create http-lb-proxy \
        --url-map=lb-map-http
    
  7. 들어오는 요청을 대상 HTTP 프록시로 라우팅하는 전역 전달 규칙을 만듭니다.

    gcloud compute forwarding-rules create http-forwarding-rule \
        --address=external-lb-vip\
        --global \
        --load-balancing-scheme=EXTERNAL \
        --target-http-proxy=http-lb-proxy \
        --ports=80
    

MIG의 이름이 지정된 포트 설정

중간 프록시가 외부 부하 분산기에서 HTTP 트래픽을 수신할 수 있도록 인스턴스 그룹에 대해 이름이 지정된 포트를 설정합니다.

gcloud compute instance-groups managed set-named-ports td-middle-proxy-us-central1-a \
    --named-ports=http:8080 \
    --zone=us-central1-a

외부 애플리케이션 부하 분산기 구성 확인

이 단계에서는 외부 부하 분산기가 올바르게 설정되었는지 확인합니다.

  1. 부하 분산기의 VIP에 요청을 보내고 시뮬레이션된 온프레미스 VM에서 응답을 받을 수 있어야 합니다.

    PUBLIC_VIP=gcloud compute addresses describe external-lb-vip \
        --format="get(address)" \
        --global
    
  2. curl 요청을 외부 IP 주소(PUBLIC_VIP)로 보내고 Hello world 메시지를 받았는지 확인합니다.

    curl $PUBLIC_VIP
    

    다음과 같이 출력이 표시됩니다.

    Hello world from on-premises!
    

Google Cloud Armor 사용 설정

CLIENT_IP_RANGE에서만 서비스 액세스를 허용하도록 Google Cloud Armor 보안 정책을 구성합니다. 여기에는 "192.0.2.0/24"와 같이 테스트하려는 클라이언트 기기의 외부 IP 주소가 포함되어야 합니다.

이러한 정책은 외부 부하 분산기의 백엔드 서비스에 적용됩니다(이 예시에서는 중간 프록시를 가리키는 td-hybrid-backend-service). 이러한 규칙을 설정하는 데 필요한 권한에 대한 자세한 내용은 Google Cloud Armor 보안 정책 구성을 참조하세요.

  1. Google Cloud Armor 보안 정책을 만듭니다.

    gcloud compute security-policies create external-clients-policy \
        --description="policy for external clients"
    
  2. 모든 트래픽을 거부하도록 보안 정책의 기본 규칙을 업데이트합니다.

    gcloud compute security-policies rules update 2147483647 \
        --security-policy=external-clients-policy \
        --action="deny-404"
    
  3. 특정 IP 범위의 트래픽을 허용하기 위해 우선순위가 더 높은 규칙을 추가합니다.

    gcloud compute security-policies rules create 1000 \
        --security-policy=external-clients-policy \
        --description="allow traffic from CLIENT_IP_RANGE" \
        --src-ip-ranges="CLIENT_IP_RANGE" \
        --action="allow"
    
  4. 백엔드 서비스에 Google Cloud Armor 보안 정책을 연결합니다.

    gcloud compute backend-services update td-middle-proxy-backend-service \
        --security-policy=external-clients-policy
    

최종 확인

  1. 외부 애플리케이션 부하 분산기의 공개 가상 IP 주소로 curl 요청을 보냅니다. 클라이언트 기기의 IP 주소가 이전에 지정된 허용 CLIENT_IP_RANGE 내에 있으면 예상 응답을 받게 됩니다.

    curl $PUBLIC_VIP
    

    다음과 같이 출력이 표시됩니다.

    Hello world from on-premises!
    
  2. IP 주소가 CLIENT_IP_RANGE를 벗어나는 다른 클라이언트 기기에서 동일한 curl 요청을 수행하거나 클라이언트 IP 주소를 더 이상 포함하지 않도록 보안 정책 규칙을 업데이트합니다 그러면 이제 404 Not Found 오류가 표시됩니다.

문제 해결

다음 안내에서는 구성 문제를 해결하는 방법을 설명합니다.

전역 외부 애플리케이션 부하 분산기 IP 주소를 통해 내 온프레미스 서비스에 액세스할 수 없음

Envoy가 실행되는 Google Cloud VM에서 온프레미스 서비스에 이미 액세스할 수 있다면 다음 단계에 따라 설정 문제를 해결합니다.

  1. Google Cloud Envoy MIG가 정상으로 보고되는지 확인합니다. Google Cloud Console에서 네트워크 서비스 > 부하 분산으로 이동하고 url-map lb-map-http를 클릭하여 세부정보를 확인합니다. td-middle-proxy-us-central1-a에서 인스턴스 1/1이 정상으로 확인되어야 합니다.

  2. 정상이 아닌 경우 Envoy를 실행하는 Google Cloud VM에 대한 인그레스 상태 확인 트래픽을 허용하도록 방화벽 규칙이 구성되었는지 확인합니다.

    gcloud compute firewall-rules describe fw-allow-health-check
    

    다음과 같은 출력이 표시됩니다.

    allowed:
    ‑ IPProtocol: tcp
    ...
    direction: INGRESS
    disabled: false
    ...
    ...
    sourceRanges:
    ‑ 130.211.0.0/22
    ‑ 35.191.0.0/16
    targetTags:
    ‑ allow-hc
    

다음 단계