게이트웨이 TLS 라우팅 설정
이 가이드에서는 Gateway
및 TLSRoute
리소스를 사용하여 Envoy 프록시 기반 인그레스 게이트웨이를 설정하는 방법을 보여줍니다. TLSRoute
리소스를 연결할 수도 있습니다.
다음 다이어그램은 구성 배포를 보여줍니다. 리전 외부 패스 스루 네트워크 부하 분산기는 인그레스 게이트웨이로 작동하는 Envoy 프록시로 트래픽을 전달합니다. Envoy 프록시는 TLS 패스스루 라우팅을 사용하고 백엔드 VM 인스턴스에서 실행되는 HTTPS 서버로 트래픽을 전달합니다.
시작하기 전에
Envoy 및 프록시리스 워크로드 설정 준비에 설명된 작업을 완료해야 합니다.
방화벽 규칙 구성
이 섹션에서는 네트워크의 VM 인스턴스에 대한 수신 상태 점검 연결을 허용하는 방화벽 규칙을 만듭니다.
방화벽 규칙 만들기
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
모든 소스의 트래픽을 허용하도록 방화벽 규칙을 구성합니다. 포트 및 소스 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 역할을 할당합니다.
게이트웨이 프록시에 대한 서비스 계정 ID를 만듭니다.
gcloud iam service-accounts create gateway-proxy
필요한 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
리소스 구성
호출된
gateway443.yaml
에 HTTP 트래픽에 대해Gateway
사양을 만듭니다.name: gateway443 scope: gateway-proxy ports: - 443 type: OPEN_MESH
gateway443.yaml
사양을 사용해서Gateway
리소스를 만듭니다.gcloud network-services gateways import gateway443 \ --source=gateway443.yaml \ --location=global
Envoy 프록시를 사용하여 관리형 인스턴스 그룹 만들기
이 섹션에서는 인그레스 게이트웨이와 연결된 Envoy 프록시를 만듭니다.
자동으로 배포된 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
인스턴스 템플릿에서 리전 관리형 인스턴스 그룹을 만듭니다.
gcloud compute instance-groups managed create gateway-proxy \ --region=REGION \ --size=1 \ --template=gateway-proxy
관리형 인스턴스 그룹의 제공 포트 이름을 설정합니다.
gcloud compute instance-groups managed set-named-ports gateway-proxy \ --named-ports=https:443 \ --region=REGION
리전 외부 패스 스루 네트워크 부하 분산기 설정
이 섹션에서는 외부 패스 스루 네트워크 부하 분산기를 만듭니다.
고정 외부 리전 IP 주소를 만듭니다.
gcloud compute addresses create xnlb-REGION \ --region=REGION
외부 부하 분산기에 예약된 IP 주소를 가져옵니다.
gcloud compute addresses describe xnlb-REGION \ --region=REGION --format='value(address)'
이 IP 주소는 이 설정 가이드의 뒷부분에서 변수
IP_ADDRESS
로 사용됩니다.게이트웨이 프록시의 상태 점검을 만듭니다.
gcloud compute health-checks create tcp xnlb-REGION \ --region=REGION \ --use-serving-port
게이트웨이 프록시에 대한 백엔드 서비스를 만듭니다.
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
관리형 인스턴스 그룹을 백엔드로 추가합니다.
gcloud compute backend-services add-backend xnlb-REGION \ --instance-group=gateway-proxy \ --instance-group-region=REGION \ --region=REGION
게이트웨이 프록시로 트래픽을 라우팅하는 전달 규칙을 만듭니다.
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 프로토콜을 사용하여 웹 요청에 대한 세부정보를 동일하게 표시합니다.
포트
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'
인스턴스 템플릿을 기반으로 관리형 인스턴스 그룹을 만듭니다.
gcloud compute instance-groups managed create https-td-mig-us-REGION \ --zone=ZONE \ --size=2 \ --template=td-https-vm-template
관리형 인스턴스 그룹에 대해 제공 포트 이름을 설정합니다.
gcloud compute instance-groups managed set-named-ports https-td-mig-us-REGION \ --named-ports=https:443 \ --zone=ZONE
상태 확인을 만듭니다.
gcloud compute health-checks create https https-helloworld-health-check \ --port=443
네트워크 인스턴스에 들어오는 상태 점검 연결을 허용하는 방화벽 규칙을 만듭니다.
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
부하 분산 스키마가
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
관리형 인스턴스 그룹을 백엔드 서비스에 백엔드로 추가합니다.
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
리소스를 사용하여 이를 연결합니다.
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
이전 안내에서
TLSRoute
는example.com
을 SNI로 그리고h2
를 ALPN으로 일치시킵니다. 일치가 다음과 같이 변경되면TLSRoute
가 SNI 또는 ALPN과 일치합니다.- matches: - sniHost: - example.com - alpn: - h2
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
리소스를 통해 외부 클라이언트에서 서비스에 액세스할 수 있는지 확인합니다.
다음
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
리소스 나열을 참조하세요. 이 기능은 미리보기 버전으로 제공됩니다.