프록시리스 gRPC 서비스 설정

이 가이드에서는 MeshGRPCRoute 리소스로 프록시리스 gRPC 서비스 메시를 설정하는 방법을 설명합니다.

GRPCRoute 및 Mesh 리소스를 사용하는 프록시리스 gRPC 서비스
GRPCRouteMesh 리소스를 사용하는 프록시리스 gRPC 서비스(확대하려면 클릭)

시작하기 전에

배포가 다음 가이드에 설명된 기본 요건을 충족하는지 확인합니다.

Mesh 리소스 구성

프록시리스 gRPC 애플리케이션이 xds://hostname에 연결하면 gRPC 클라이언트 라이브러리가 Traffic Director에 연결을 설정합니다. 클라이언트 라이브러리는 이 연결을 사용해서 호스트 이름에 대해 요청을 라우팅하는 데 필요한 라우팅 구성을 가져옵니다.

프록시리스 gRPC 애플리케이션이 이 메시와 연관된 구성을 요청하기 위해 사용하는 키인 메시 리소스 이름을 기록해두어야 합니다.

  1. Mesh 사양을 만들고 mesh.yaml이라는 파일에 저장합니다.

    name: grpc-mesh
    
  2. mesh.yaml 사양을 사용해서 Mesh 리소스를 만듭니다.

    gcloud network-services meshes import grpc-mesh \
      --source=mesh.yaml \
      --location=global
    

Mesh 리소스가 생성되었으면 Traffic Director가 구성을 제공할 준비가 되었지만 아직 정의된 서비스가 없으므로, 구성이 비어 있습니다. 다음 섹션에서는 서비스를 정의하고 이를 Mesh 리소스에 연결합니다.

gRPC 서버 구성

여기서는 데모용으로 관리형 인스턴스 그룹에서 자동 확장된 VM으로 백엔드 서비스를 만듭니다. VM은 포트 50051에서 gRPC 프로토콜을 사용하여 hello world 구문을 제공합니다.

  1. 포트 50051에 노출된 helloworld gRPC 서비스로 Compute Engine VM 인스턴스 템플릿을 만듭니다.

    gcloud compute instance-templates create grpc-td-vm-template \
       --scopes=https://www.googleapis.com/auth/cloud-platform \
       --tags=allow-health-checks \
       --image-family=debian-10 \
       --image-project=debian-cloud \
       --metadata-from-file=startup-script=<(echo '#! /bin/bash
     set -e
     cd /root
     sudo apt-get update -y
     sudo apt-get install -y openjdk-11-jdk-headless
     curl -L https://github.com/grpc/grpc-java/archive/v1.38.0.tar.gz | tar -xz
     cd grpc-java-1.38.0/examples/example-hostname
     ../gradlew --no-daemon installDist
     sudo systemd-run ./build/install/hostname-server/bin/hostname-server')
     
  2. 템플릿을 기반으로 관리형 인스턴스 그룹을 만듭니다.

    gcloud compute instance-groups managed create grpc-td-mig-us-east1 \
      --zone=ZONE \
      --size=2 \
      --template=grpc-td-vm-template
    
  3. gRPC 서비스의 이름이 지정된 포트를 만듭니다. 이름이 지정된 포트는 gRPC 서비스가 요청을 리슨하는 포트입니다. 다음 예시에서 이름이 지정된 포트는 50051입니다.

    gcloud compute instance-groups set-named-ports grpc-td-mig-us-east1 \
     --named-ports=grpc-helloworld-port:50051 \
     --zone=ZONE
    
  4. gRPC 상태 점검을 만듭니다. 서비스는 gRPC 상태 점검이 제대로 작동할 수 있도록 gRPC 상태 점검 프로토콜을 구현해야 합니다. 자세한 내용은 상태 점검을 참조하세요.

    gcloud compute health-checks create grpc grpc-helloworld-health-check \
      --use-serving-port
    
  5. 네트워크의 인스턴스에 대한 상태 점검 연결을 허용하는 방화벽 규칙을 만듭니다.

    gcloud compute firewall-rules create grpc-vm-allow-health-checks \
      --network=default \
      --action=ALLOW \
      --direction=INGRESS \
      --source-ranges=35.191.0.0/16,130.211.0.0/22 \
      --target-tags allow-health-checks \
      --rules=tcp:50051
    
  6. INTERNAL_SELF_MANAGED의 부하 분산 스킴과 함께 전역 백엔드 서비스를 만들고 백엔드 서비스에 상태 확인을 추가합니다. 여기에서 지정된 포트는 관리형 인스턴스 그룹에서 VM 연결을 위해 사용됩니다.

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

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

Mesh 리소스 및 서비스가 구성됩니다. 다음 섹션에서는 라우팅을 설정합니다.

GRPCRoute로 라우팅 설정

Mesh 리소스 및 gRPC 서버가 구성되었습니다. 이제 다음 안내를 따라 라우팅을 설정합니다.

  1. GRPCRoute 사양을 만들고 grpc_route.yaml이라는 파일에 저장합니다.

    PROJECT_ID 또는 PROJECT_NUMBER를 사용할 수 있습니다.

    name: helloworld-grpc-route
    hostnames:
    - helloworld-gce
    meshes:
    - projects/PROJECT_NUMBER/locations/global/meshes/grpc-mesh
    rules:
    - action:
        destinations:
        - serviceName: projects/PROJECT_NUMBER/locations/global/backendServices/grpc-helloworld-service
    
  2. grpc_route.yaml 사양을 사용해서 GrpcRoute 리소스를 만듭니다.

    gcloud network-services grpc-routes import helloworld-grpc-route \
      --source=grpc_route.yaml \
      --location=global
    

이제 Traffic Director가 관리형 인스턴스 그룹의 백엔드에서 GRPCRoute 리소스에 지정된 서비스의 트래픽을 부하 분산하도록 구성되었습니다.

gRPC 클라이언트 만들기

프록시리스 gRPC 애플리케이션을 인스턴스화하고 이를 Traffic Director에 연결하여 구성을 확인할 수 있습니다. 부트스트랩 파일에서 애플리케이션은 메시에 표시된 VPC 네트워크를 지정해야 합니다.

구성이 완료되면 xds:///helloworld-gce 서비스 URI를 사용해서 애플리케이션이 helloworld-gce와 연관된 인스턴스 또는 엔드포인트에 요청을 전송할 수 있습니다.

다음 예시에서는 grpcurl 도구를 사용해서 gRPC 서비스를 테스트합니다.

  1. 클라이언트 VM 만들기

    gcloud compute instances create grpc-client \
      --zone=ZONE\
      --scopes=https://www.googleapis.com/auth/cloud-platform \
      --image-family=debian-10 \
      --image-project=debian-cloud \
      --metadata-from-file=startup-script=<(echo '#! /bin/bash
    set -e
    export GRPC_XDS_BOOTSTRAP=/run/td-grpc-bootstrap.json
    echo export GRPC_XDS_BOOTSTRAP=$GRPC_XDS_BOOTSTRAP | sudo tee /etc/profile.d/grpc-xds-bootstrap.sh
    curl -L https://storage.googleapis.com/traffic-director/td-grpc-bootstrap-0.14.0.tar.gz | tar -xz
    ./td-grpc-bootstrap-0.14.0/td-grpc-bootstrap --config-mesh-experimental grpc-mesh | tee $GRPC_XDS_BOOTSTRAP')
    

부트스트랩 파일 설정

클라이언트 애플리케이션에 부트스트랩 구성 파일이 있어야 합니다. 이전 섹션의 시작 스크립트는 GRPC_XDS_BOOTSTRAP 환경 변수를 설정하고 도우미 스크립트를 사용하여 부트스트랩 파일을 생성합니다. VM 인스턴스에 대한 이러한 세부정보를 알고 있는 메타데이터 서버에서 생성된 부트스트랩 파일에 있는 TRAFFICDIRECTOR_GCP_PROJECT_NUMBER 및 영역의 값을 가져옵니다. --gcp-project-number 옵션을 사용하여 이러한 값을 도우미 스크립트에 수동으로 제공할 수 있습니다. --config-mesh-experimental 옵션을 사용하여 Mesh 리소스와 일치하는 메시 이름을 제공해야 합니다.

구성을 확인하려면 클라이언트 VM에 로그인하고 다음을 실행합니다.

  1. SSH로 클라이언트 VM에 연결합니다.

    gcloud compute ssh grpc-client
    
  2. grpcurl 도구를 다운로드하고 설치합니다.

    curl -L https://github.com/fullstorydev/grpcurl/releases/download/v1.8.1/grpcurl_1.8.1_linux_x86_64.tar.gz | tar -xz
    
  3. xds:///helloworld-gce를 서비스 URI로, helloworld.Greeter/SayHello를 호출할 서비스 이름과 메서드로 사용하여 grpcurl 도구를 실행합니다. SayHello 메서드에 대한 매개변수는 -d 옵션을 사용하여 전달합니다.

    ./grpcurl --plaintext \
      -d '{"name": "world"}' \
      xds:///helloworld-gce helloworld.Greeter/SayHello
    

다음과 비슷한 출력이 표시됩니다. 여기서 INSTANCE_HOSTNAME은 VM 인스턴스의 이름입니다.

   Greeting: Hello world, from INSTANCE_HOSTNAME
   

출력은 프록시리스 gRPC 클라이언트가 Traffic Director에 성공적으로 연결되었고 xds 이름 리졸버를 사용하여 helloworld-gce 서비스의 백엔드에 대해 학습했는지 확인합니다. 클라이언트는 IP 주소 정보를 확인하거나 DNS 변환을 수행할 필요 없이 서비스의 백엔드 중 하나에 요청을 보냈습니다.