게이트웨이 TLS 라우팅 설정

이 가이드에서는 GatewayTLSRoute 리소스를 사용하여 Envoy 프록시 기반 인그레스 게이트웨이를 설정하는 방법을 보여줍니다. TLSRoute 리소스를 연결할 수도 있습니다.

다음 다이어그램은 구성 배포를 보여줍니다. 리전 외부 패스 스루 네트워크 부하 분산기는 인그레스 게이트웨이로 작동하는 Envoy 프록시로 트래픽을 전달합니다. Envoy 프록시는 TLS 패스스루 라우팅을 사용하고 백엔드 VM 인스턴스에서 실행되는 HTTPS 서버로 트래픽을 전달합니다.

인그레스 게이트웨이와 TLS 패스스루
인그레스 게이트웨이를 사용한 TLS 패스 스루(확대하려면 클릭)

시작하기 전에

Envoy 및 프록시리스 워크로드 설정 준비에 설명된 작업을 완료해야 합니다.

방화벽 규칙 구성

이 섹션에서는 네트워크의 VM 인스턴스에 대한 수신 상태 점검 연결을 허용하는 방화벽 규칙을 만듭니다.

  1. 방화벽 규칙 만들기

    gcloud compute firewall-rules create allow-gateway-health-checks \
     --network=NETWORK_NAME \
     --direction=INGRESS \
     --action=ALLOW \
     --rules=tcp \
     --source-ranges="35.191.0.0/16,209.85.152.0/22,209.85.204.0/22" \
     --target-tags=gateway-proxy
    
  2. 모든 소스의 트래픽을 허용하도록 방화벽 규칙을 구성합니다. 포트 및 소스 IP 주소 범위에 대한 명령어를 수정합니다.

    gcloud compute firewall-rules create allow-gateway-ingress-traffic \
      --network=NETWORK_NAME \
      --direction=INGRESS \
      --action=ALLOW \
      --rules=tcp:443 \
      --source-ranges="0.0.0.0/0" \
      --target-tags=gateway-proxy
    

Identity and Access Management 권한 구성

이 섹션에서는 게이트웨이 프록시에 대한 서비스 계정을 지정하고 서비스 계정에 올바른 IAM 역할을 할당합니다.

  1. 게이트웨이 프록시에 대한 서비스 계정 ID를 만듭니다.

    gcloud iam service-accounts create gateway-proxy
    
  2. 필요한 IAM 역할을 서비스 계정 ID에 할당합니다.

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:gateway-proxy@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/trafficdirector.client"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:gateway-proxy@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/logging.logWriter"
    

Gateway 리소스 구성

  1. 호출된 gateway443.yaml에 HTTP 트래픽에 대해 Gateway 사양을 만듭니다.

    name: gateway443
    scope: gateway-proxy
    ports:
    - 443
    type: OPEN_MESH
    
  2. gateway443.yaml 사양을 사용해서 Gateway 리소스를 만듭니다.

    gcloud network-services gateways import gateway443 \
        --source=gateway443.yaml \
        --location=global
    

Envoy 프록시를 사용하여 관리형 인스턴스 그룹 만들기

이 섹션에서는 인그레스 게이트웨이와 연결된 Envoy 프록시를 만듭니다.

  1. 자동으로 배포된 Envoy 서비스 프록시를 실행하는 VM에 대한 인스턴스 템플릿을 만듭니다. Envoy 범위가 gateway-proxy로 설정되었습니다. 제공 포트를 --service-proxy 플래그의 파라미터로 전달하지 마세요.

    gcloud beta compute instance-templates create gateway-proxy \
      --machine-type=n1-standard-1 \
      --boot-disk-size=10GB \
      --scopes=https://www.googleapis.com/auth/cloud-platform \
      --tags=gateway-proxy \
      --network-interface=network=NETWORK_NAME,no-address \
      --service-account="gateway-proxy@PROJECT_ID.iam.gserviceaccount.com" \
      --service-proxy=enabled,scope=gateway-proxy
    
  2. 인스턴스 템플릿에서 리전 관리형 인스턴스 그룹을 만듭니다.

    gcloud compute instance-groups managed create gateway-proxy \
      --region=REGION \
      --size=1 \
      --template=gateway-proxy
    
  3. 관리형 인스턴스 그룹의 제공 포트 이름을 설정합니다.

    gcloud compute instance-groups managed set-named-ports gateway-proxy \
      --named-ports=https:443 \
      --region=REGION
    

리전 외부 패스 스루 네트워크 부하 분산기 설정

이 섹션에서는 외부 패스 스루 네트워크 부하 분산기를 만듭니다.

  1. 고정 외부 리전 IP 주소를 만듭니다.

    gcloud compute addresses create xnlb-REGION \
      --region=REGION
    
  2. 외부 부하 분산기에 예약된 IP 주소를 가져옵니다.

    gcloud compute addresses describe xnlb-REGION \
      --region=REGION --format='value(address)'
    

    이 IP 주소는 이 설정 가이드의 뒷부분에서 변수 IP_ADDRESS로 사용됩니다.

  3. 게이트웨이 프록시의 상태 점검을 만듭니다.

    gcloud compute health-checks create tcp xnlb-REGION \
      --region=REGION \
      --use-serving-port
    
  4. 게이트웨이 프록시에 대한 백엔드 서비스를 만듭니다.

    gcloud compute backend-services create xnlb-REGION \
      --health-checks=xnlb-REGION \
      --health-checks-region=REGION \
      --load-balancing-scheme=EXTERNAL \
      --protocol=TCP \
      --region=REGION \
      --port-name=https
    
  5. 관리형 인스턴스 그룹을 백엔드로 추가합니다.

    gcloud compute backend-services add-backend xnlb-REGION \
      --instance-group=gateway-proxy \
      --instance-group-region=REGION \
      --region=REGION
    
  6. 게이트웨이 프록시로 트래픽을 라우팅하는 전달 규칙을 만듭니다.

    gcloud compute forwarding-rules create xnlb-REGION \
      --region=REGION \
      --load-balancing-scheme=EXTERNAL \
      --address=IP_ADDRESS \
      --ip-protocol=TCP \
      --ports=443 \
      --backend-service=xnlb-REGION \
      --backend-service-region=REGION
    

HTTPS 서비스를 실행하는 관리형 인스턴스 그룹 구성

여기서는 데모용으로 관리형 인스턴스 그룹에서 자동 확장된 VM으로 백엔드 서비스를 만듭니다. VM은 포트 443에서 HTTPS 프로토콜을 사용하여 웹 요청에 대한 세부정보를 동일하게 표시합니다.

  1. 포트 443으로 노출된 HTTPS 서비스에 인스턴스 템플릿을 만듭니다.

    gcloud compute instance-templates create td-https-vm-template \
      --scopes=https://www.googleapis.com/auth/cloud-platform \
      --tags=https-td-server \
      --image-family=debian-10 \
      --image-project=debian-cloud \
      --metadata=startup-script='#! /bin/bash
    
    sudo rm -rf /var/lib/apt/lists/*
    sudo apt-get -y clean
    sudo apt-get -y update
    sudo apt-get -y install apt-transport-https ca-certificates curl gnupg2 software-properties-common
    sudo curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
    sudo add-apt-repository -y "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
    sudo apt-get -y update
    sudo apt-get -y install docker-ce
    sudo which docker
    echo "{ \"registry-mirrors\": [\"https://mirror.gcr.io\"] }" | sudo tee -a /etc/docker/daemon.json
    sudo service docker restart
    sudo docker run -e HTTPS_PORT=9999 -p 443:9999 --rm -dt mendhak/http-https-echo:22'
    
  2. 인스턴스 템플릿을 기반으로 관리형 인스턴스 그룹을 만듭니다.

    gcloud compute instance-groups managed create https-td-mig-us-REGION \
      --zone=ZONE \
      --size=2 \
      --template=td-https-vm-template
    
  3. 관리형 인스턴스 그룹에 대해 제공 포트 이름을 설정합니다.

    gcloud compute instance-groups managed set-named-ports https-td-mig-us-REGION \
      --named-ports=https:443 \
      --zone=ZONE
    
  4. 상태 확인을 만듭니다.

    gcloud compute health-checks create https https-helloworld-health-check \
      --port=443
    
  5. 네트워크 인스턴스에 들어오는 상태 점검 연결을 허용하는 방화벽 규칙을 만듭니다.

    gcloud compute firewall-rules create https-vm-allow-health-checks \
       --network NETWORK_NAME --action allow --direction INGRESS \
       --source-ranges 35.191.0.0/16,130.211.0.0/22 \
       --target-tags https-td-server \
       --rules tcp:443
    
  6. 부하 분산 스키마가 INTERNAL_SELF_MANAGED인 전역 백엔드 서비스를 만들고 상태 점검을 추가합니다.

    gcloud compute backend-services create https-helloworld-service \
      --global \
      --load-balancing-scheme=INTERNAL_SELF_MANAGED \
      --port-name=https \
      --health-checks https-helloworld-health-check
    
  7. 관리형 인스턴스 그룹을 백엔드 서비스에 백엔드로 추가합니다.

    gcloud compute backend-services add-backend https-helloworld-service \
      --instance-group=https-td-mig-us-REGION \
      --instance-group-zone=ZONE \
      --global
    

TLSRoute 리소스로 라우팅 설정

이전 섹션에서는 Gateway 리소스 및 HTTPS 서버를 구성했습니다. 이제 SNI 호스트 이름을 백엔드 서비스에 연결하는 TLSRoute 리소스를 사용하여 이를 연결합니다.

  1. tls_route.yaml이라는 파일에서 TLSRoute 사양을 만듭니다.

    name: helloworld-tls-route
    gateways:
    - projects/PROJECT_NUMBER/locations/global/gateways/gateway443
    rules:
    - matches:
      - sniHost:
        - example.com
        alpn:
        - h2
      action:
       destinations:
       - serviceName: projects/PROJECT_NUMBER/locations/global/backendServices/https-helloworld-service
    

    이전 안내에서 TLSRouteexample.com을 SNI로 그리고 h2를 ALPN으로 일치시킵니다. 일치가 다음과 같이 변경되면 TLSRoute가 SNI 또는 ALPN과 일치합니다.

    - matches:
      - sniHost:
        - example.com
      - alpn:
        - h2
    
  2. tls_route.yaml 사양을 사용해서 TLSRoute 리소스를 만듭니다.

    gcloud network-services tls-routes import helloworld-tls-route \
        --source=tls_route.yaml \
        --location=global
    

Cloud Service Mesh는 관리형 인스턴스 그룹의 백엔드에서 TLSRoute 리소스에 지정된 서비스의 트래픽을 부하 분산하도록 구성되었습니다.

배포 검증

이 섹션에서는 외부 패스 스루 네트워크 부하 분산기 및 Cloud Service Mesh Gateway 리소스를 통해 외부 클라이언트에서 서비스에 액세스할 수 있는지 확인합니다.

  1. 다음 curl 명령어를 실행하여 만든 테스트 서비스에 대한 HTTP 연결을 확인합니다.

    curl https://example.com --resolve example.com:443:IP_ADDRESS -k
    

이 명령어는 관리형 인스턴스 그룹에서 VM 중 하나로부터 응답을 반환합니다. 출력은 다음과 같습니다.

 "path": "/",
  "headers": {
    "host": "example.com",
    "user-agent": "curl/7.81.0",
    "accept": "*/*"
  },
  "method": "GET",
  "body": "",
  "fresh": false,
  "hostname": "example.com",
  "ip": "::ffff:10.142.0.2",
  "ips": [],
  "protocol": "https",
  "query": {},
  "subdomains": [],
  "xhr": false,
  "os": {
    "hostname": "0cd3aec9b351"
  },
  "connection": {
    "servername": "example.com"
  }
}

부정형 검증으로 확인

또한 음성 인식을 실행할 수 있습니다. 이 섹션의 명령어를 실행하면 TLSRoute 일치 조건과 맞지 않기 때문에 요청이 삭제됩니다.

다음 명령어에서 SNI가 example.com과 일치하지 않기 때문에 Gateway가 연결을 거부합니다.

curl https://invalid-server.com --resolve invalid-server.com:443:IP_ADDRESS -k

다음 명령어에서 ALPN이 h2(HTTP2 프로토콜)와 일치하지 않으므로 Gateway는 연결을 거부합니다.

curl https://example.com --resolve example.com:443:IP_ADDRESS -k --http1.1

다음 명령어에서 클라이언트는 일반 텍스트(암호화되지 않음) 연결을 생성하므로 Gateway가 연결을 거부합니다.

curl example.com:443 --resolve example.com:443:IP_ADDRESS -k

위의 명령어는 모두 다음 오류를 반환합니다.

curl: (35) OpenSSL SSL_connect: Connection reset by peer in connection.

다음 단계

  • Mesh 또는 Gateway 리소스와 연결된 경로 리소스 나열에 관한 자세한 내용은 Route 리소스 나열을 참조하세요. 이 기능은 미리보기 버전으로 제공됩니다.