Compute Engine VM 및 프록시리스 gRPC 서비스 설정

이 가이드에서는 Traffic Director에 필요한 Compute Engine VM 호스트, gRPC 애플리케이션, 부하 분산 구성요소를 구성하는 방법을 설명합니다.

이 가이드의 안내를 따르기 전에 프록시리스 gRPC 서비스를 사용하여 Traffic Director 설정 준비를 검토하세요.

개요

Compute Engine 가상 머신(VM) 및 프록시리스 gRPC 서비스를 사용하여 Traffic Director를 설정하는 방법은 다음과 같습니다.

  1. 백엔드를 호스팅하는 관리형 인스턴스 그룹을 설정합니다.
  2. 클라이언트의 요청에 대한 응답으로 hello world를 반환하는 gRPC 서버를 실행하도록 백엔드를 구성합니다.
  3. 관리형 인스턴스 그룹 및 기타 Cloud Load Balancing 구성요소를 사용하여 Traffic Director 구성
  4. 프록시리스 gRPC 클라이언트 애플리케이션을 사용하여 gRPC 서버 애플리케이션에 트래픽을 전송하여 배포가 제대로 작동하는지 확인합니다.

프록시리스 gRPC 클라이언트는 xDS를 사용하여 Traffic Director에 연결합니다. 클라이언트가 Traffic Director에 연결되면 Traffic Director는 hello world 서비스와 연결된 백엔드에 대한 정보를 클라이언트에 전송합니다. 프록시리스 gRPC 클라이언트는 이 정보를 사용하여 hello world gRPC 서버로 요청을 전송합니다.

Traffic Director에 관리형 인스턴스 그룹 구성

관리형 인스턴스 그룹은 배포에 필요한 경우 자동 확장을 사용하여 새 백엔드 VM을 만듭니다. 이 예시에서는 다음을 수행하는 방법을 보여줍니다.

  • gRPC 프로토콜을 사용하여 hello world 서비스를 제공하는 샘플 서비스로 인스턴스 템플릿을 만듭니다.
  • 템플릿을 사용하여 관리형 인스턴스 그룹을 구성합니다.

인스턴스 템플릿 만들기

이 섹션에서는 인스턴스 템플릿을 만드는 방법에 대한 안내를 제공합니다. 이 예시에서는 포트 50051에 노출된 helloworld gRPC 서비스를 배포합니다.

콘솔

  1. Google Cloud 콘솔에서 인스턴스 템플릿 페이지로 이동합니다.

    인스턴스 템플릿 페이지로 이동

  2. 인스턴스 템플릿 만들기를 클릭합니다.
  3. 다음과 같이 필드를 작성합니다.

    • 이름: grpc-td-vm-template
    • 부팅 디스크 버전: Debian/Linux 10
    • 서비스 계정: Compute Engine 기본 서비스 계정
    • 액세스 범위: 모든 Google Cloud APIs에 대한 전체 액세스 허용
  4. 방화벽에서 HTTP 트래픽 허용HTTPS 트래픽 허용 체크박스를 선택합니다.

  5. 관리, 보안, 디스크, 네트워킹, 단독 임대를 클릭합니다.

  6. 관리 탭에서 시작 스크립트 필드에 다음 스크립트를 복사합니다.

    #! /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.37.0.tar.gz | tar -xz
    cd grpc-java-1.37.0/examples/example-hostname
    ../gradlew --no-daemon installDist
    # Server listens on 50051
    sudo systemd-run ./build/install/hostname-server/bin/hostname-server
    
  7. 만들기를 클릭합니다.

gcloud

인스턴스 템플릿을 만듭니다.

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.37.0.tar.gz | tar -xz
cd grpc-java-1.37.0/examples/example-hostname
../gradlew --no-daemon installDist
# Server listens on 50051
sudo systemd-run ./build/install/hostname-server/bin/hostname-server')

관리형 인스턴스 그룹 만들기

이 섹션에서는 이전 섹션에서 만든 인스턴스 템플릿을 사용하여 관리형 인스턴스 그룹을 만듭니다.

콘솔

  1. Google Cloud 콘솔에서 인스턴스 그룹 페이지로 이동합니다.

    인스턴스 그룹 페이지로 이동

  2. 인스턴스 그룹 만들기를 클릭합니다. 기본적으로 관리형 인스턴스 그룹을 만드는 페이지가 표시됩니다.
  3. 관리형 인스턴스 그룹의 이름으로 grpc-td-mig-us-central1을 입력하고 us-central1-a 영역을 선택합니다.
  4. 인스턴스 템플릿에서 사용자가 만든 인스턴스 템플릿인 grpc-td-vm-template을 선택합니다.
  5. 그룹에 만들려는 최소 및 최대 인스턴스 수를 2로 지정합니다.
  6. 만들기를 클릭합니다.

gcloud

관리형 인스턴스 그룹을 만듭니다.

gcloud compute instance-groups managed create grpc-td-mig-us-central1 \
  --zone us-central1-a \
  --size=2 \
  --template=grpc-td-vm-template

이름이 지정된 포트 구성

이 섹션에서는 gRPC 서비스에 사용될 이름이 지정된 포트를 구성합니다. 이름이 지정된 포트는 gRPC 서비스가 요청을 리슨하는 포트입니다. 이 예시에서 이름이 지정된 포트는 포트 50051입니다.

콘솔

  1. Google Cloud 콘솔에서 인스턴스 그룹 페이지로 이동합니다.

    인스턴스 그룹 페이지로 이동

  2. 생성한 인스턴스 그룹 grpc-td-mig-us-central1의 이름을 클릭합니다.
  3. 그룹 수정을 클릭합니다.
  4. 포트 이름 필드에 grpc-helloworld-port를 입력합니다.
  5. 포트 번호 필드에 50051을 입력합니다.
  6. 저장을 클릭합니다.

gcloud

이름이 지정된 포트를 구성합니다.

gcloud compute instance-groups set-named-ports grpc-td-mig-us-central1 \
  --named-ports=grpc-helloworld-port:50051 \
  --zone us-central1-a

Google Cloud 부하 분산 구성요소로 Traffic Director 구성

이 섹션에서는 서비스의 Google Cloud Load Balancing 구성요소로 Traffic Director를 구성하는 방법을 설명합니다.

상태 확인, 방화벽 규칙 및 백엔드 서비스 만들기

이 섹션에서는 부하 분산 스키마 INTERNAL_SELF_MANAGED와 프로토콜 GRPC를 사용하여 전역 백엔드 서비스를 만든 후 상태 확인과 인스턴스 그룹을 이 백엔드 서비스에 연결합니다. 이 예시에서는 관리형 인스턴스 그룹 만들기에서 만든 관리형 인스턴스 그룹을 사용합니다. 이 관리형 인스턴스 그룹은 샘플 gRPC 서비스를 실행합니다. --port-name 플래그의 포트는 이름이 지정된 포트 구성에서 만든 이름이 지정된 포트입니다.

gcloud

  1. 상태 확인을 만듭니다.

    gcloud compute health-checks create grpc grpc-helloworld-health-check \
     --use-serving-port
    
  2. 상태 확인 방화벽 규칙을 만듭니다.

    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
    
  3. 백엔드 서비스를 만듭니다.

    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
    
  4. 관리형 인스턴스 그룹을 백엔드 서비스에 추가합니다.

    gcloud compute backend-services add-backend grpc-helloworld-service \
     --instance-group grpc-td-mig-us-central1 \
     --instance-group-zone us-central1-a \
     --global
    

라우팅 규칙 맵, 대상 프록시 및 전달 규칙 만들기

이 섹션에서는 호스트 이름 및 경로를 기반으로 서비스의 트래픽을 라우팅하는 URL 맵, 경로 일치자, 호스트 규칙을 만듭니다. 다음 예시에서는 helloworld-gce를 서비스 이름으로 사용합니다. gRPC 애플리케이션은 이 서비스에 연결할 때 대상 URI에서 이 서비스 이름을 사용합니다. 기본적으로 경로 일치자는 이 호스트의 모든 경로 요청 (/*)과 일치합니다. 대상 gRPC 프록시 및 전달 규칙도 만듭니다.

자세한 내용은 라우팅 규칙 맵을 참조하세요.

다음 예시에서 포트 80은 지정된 포트입니다.

gcloud

  1. URL 맵을 만듭니다.

    gcloud compute url-maps create grpc-vm-url-map \
      --default-service grpc-helloworld-service
    
  2. 경로 일치자를 만듭니다.

    gcloud compute url-maps add-path-matcher grpc-vm-url-map \
      --default-service grpc-helloworld-service \
      --path-matcher-name grpc-vm-path-matcher \
      --new-hosts helloworld-gce
    
  3. 대상 gRPC 프록시를 만듭니다.

    gcloud compute target-grpc-proxies create grpc-vm-proxy \
     --url-map grpc-vm-url-map \
     --validate-for-proxyless
    
  4. 전달 규칙을 만듭니다.

    gcloud compute forwarding-rules create grpc-vm-forwarding-rule \
     --global \
     --load-balancing-scheme=INTERNAL_SELF_MANAGED \
     --address=0.0.0.0 --address-region=us-central1 \
     --target-grpc-proxy=grpc-vm-proxy \
     --ports 80 \
     --network default
    

이제 Traffic Director는 관리형 인스턴스 그룹의 백엔드에서 URL 맵에 지정된 서비스의 트래픽을 부하 분산하도록 구성됩니다.

구성 확인

구성 프로세스가 완료되면 이전에 만든 Traffic Director 부하 분산 서비스에 gRPC 연결을 설정할 수 있는지 확인합니다.

서비스를 사용할 수 있는지 확인하려면 다음 중 하나를 수행합니다.

  • VM 호스트 (gRPC 서비스 백엔드) 중 하나에 로그인하고 gRPC 서비스가 수신 대기 포트에서 실행 중인지 확인합니다. 이 예시에서 포트는 50051입니다.
  • 구성된 서비스 helloworld-gce에 대한 정보는 Console의 Traffic Director 페이지에서 확인하고 백엔드가 정상 상태로 보고되었는지 확인합니다.
  • 다음 안내에 따라 Compute Engine gRPC 클라이언트를 사용하여 확인합니다.

gRPC 클라이언트 애플리케이션으로 서비스 확인

다음 예시에서는 사용자가 원하는 언어로 gRPC 클라이언트 또는 grpcurl 도구를 사용하여 gRPC 서비스를 테스트합니다.

먼저 gRPC 클라이언트를 실행하는 클라이언트 VM을 만들어 서비스를 테스트합니다.

gcloud compute instances create grpc-client \
  --zone us-central1-a \
  --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
# Expose bootstrap variable to SSH connections
echo export GRPC_XDS_BOOTSTRAP=$GRPC_XDS_BOOTSTRAP | sudo tee /etc/profile.d/grpc-xds-bootstrap.sh
# Create the bootstrap file
curl -L https://storage.googleapis.com/traffic-director/td-grpc-bootstrap-0.11.0.tar.gz | tar -xz
./td-grpc-bootstrap-0.11.0/td-grpc-bootstrap | tee $GRPC_XDS_BOOTSTRAP')

환경 변수 및 부트스트랩 파일 설정

클라이언트 애플리케이션에는 부트스트랩 구성 파일이 필요합니다. 이전 섹션의 시작 스크립트는 GRPC_XDS_BOOTSTRAP 환경 변수를 설정하고 도우미 스크립트를 사용하여 부트스트랩 파일을 생성합니다. Compute Engine VM 인스턴스에 대한 이러한 세부정보를 알고 있는 메타데이터 서버에서 생성된 부트스트랩 파일에 있는 TRAFFICDIRECTOR_GCP_PROJECT_NUMBER, TRAFFICDIRECTOR_NETWORK_NAMEzone의 값을 가져옵니다. -gcp-project-number 옵션과 -vpc-network-name 옵션을 사용하여 이러한 값을 도우미 스크립트에 수동으로 제공할 수 있습니다.

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

자바

gRPC 자바 클라이언트에서 서비스를 확인하려면 다음 안내를 따르세요.

  1. 최신 패치와 함께 최신 버전의 gRPC 자바를 다운로드하고, xds-hello-world 클라이언트 애플리케이션을 빌드합니다.

    sudo apt-get update -y
    sudo apt-get install -y openjdk-11-jdk-headless
    curl -L https://github.com/grpc/grpc-java/archive/v1.37.0.tar.gz | tar -xz
    cd grpc-java-1.37.0/examples/example-xds
    ../gradlew --no-daemon installDist
    
  2. world를 이름으로, xds:///helloworld-gce를 서비스 URI로 사용하여 클라이언트를 실행합니다.

    ./build/install/example-xds/bin/xds-hello-world-client "world" \
       xds:///helloworld-gce
    

Go

gRPC Go 클라이언트에서 서비스를 확인하려면 다음 안내를 따르세요.

  1. 최신 패치와 함께 최신 버전의 gRPC Go를 다운로드하고, xds-hello-world 클라이언트 애플리케이션을 빌드합니다.

    sudo apt-get update -y
    sudo apt-get install -y golang git
    curl -L https://github.com/grpc/grpc-go/archive/v1.37.0.tar.gz | tar -xz
    cd grpc-go-1.37.0/examples/features/xds/client
    go get google.golang.org/grpc@v1.37.0
    go build .
    
  2. world를 이름으로, xds:///helloworld-gce를 서비스 URI로 사용하여 클라이언트를 실행합니다.

    ./client "world" xds:///helloworld-gce
    

C++

gRPC C++ 클라이언트에서 서비스를 확인하려면 다음 안내를 따르세요.

  1. 최신 패치와 함께 최신 버전의 gRPC C++를 다운로드하고, helloworld 클라이언트 예시를 빌드합니다.

    sudo apt-get update -y
    sudo apt-get install -y build-essential cmake git
    git clone --recurse-submodules -b v1.37.1 https://github.com/grpc/grpc
    cd grpc
    mkdir -p cmake/build
    pushd cmake/build
    cmake ../..
    make
    sudo make install
    popd
    mkdir -p third_party/abseil-cpp/cmake/build
    pushd third_party/abseil-cpp/cmake/build
    cmake ../..
    make
    sudo make install
    popd
    cd examples/cpp/helloworld
    mkdir -p cmake/build
    cd cmake/build/
    cmake ../..
    make
    
  2. 'xds:///helloworld-gce'를 서비스 URI로 지정하고 클라이언트를 실행합니다.

    ./greeter_client --target=xds:///helloworld-gce
    

grpcurl

grpcurl 도구를 사용하여 서비스를 확인하려면 다음 안내를 따르세요.

  1. grpcurl 도구를 다운로드하고 설치합니다.

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

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

Python

gRPC Python 클라이언트에서 서비스를 확인하려면 다음을 실행합니다. 최신 패치가 적용된 최신 버전의 gRPC를 사용합니다.

sudo apt-get update
sudo apt-get -y install python3-pip
sudo pip3 install virtualenv
curl -L https://github.com/grpc/grpc/archive/v1.37.1.tar.gz | tar -xz
cd grpc-1.37.1/examples/python/xds
virtualenv venv -p python3
source venv/bin/activate
pip install -r requirements.txt
python client.py  xds:///helloworld-gce

Ruby

gRPC Ruby 클라이언트에서 서비스를 확인하려면 다음을 실행합니다. 최신 패치가 적용된 최신 버전의 gRPC를 사용합니다.

sudo apt-get update
sudo apt-get install -y ruby-full
sudo gem install grpc
curl -L https://github.com/grpc/grpc/archive/v1.37.1.tar.gz | tar -xz
cd grpc-1.37.1/examples/ruby
ruby greeter_client.rb john xds:///helloworld-gce

PHP

gRPC PHP 클라이언트에서 서비스를 확인하려면 다음을 실행합니다. 최신 패치가 적용된 최신 버전의 gRPC를 사용합니다.

sudo apt-get update
sudo apt-get install -y php7.3 php7.3-dev php-pear phpunit python-all zlib1g-dev git
sudo pecl install grpc
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
curl -L https://github.com/grpc/grpc/archive/v1.37.1.tar.gz | tar -xz
cd grpc-1.37.1
export CC=/usr/bin/gcc
./tools/bazel build @com_google_protobuf//:protoc
./tools/bazel build src/compiler:grpc_php_plugin
cd examples/php
composer install
./../../bazel-bin/external/com_google_protobuf/protoc --proto_path=../protos \
--php_out=. --grpc_out=. \
--plugin=protoc-gen-grpc=../../bazel-bin/src/compiler/grpc_php_plugin \
../protos/helloworld.proto
php -d extension=grpc.so greeter_client.php john xds:///helloworld-gce

Node.js

gRPC Node.js 클라이언트를 사용하여 서비스를 확인하려면 다음을 실행합니다. 최신 패치가 적용된 최신 버전의 gRPC를 사용합니다.

sudo apt-get update
sudo apt-get install -y nodejs npm
curl -L https://github.com/grpc/grpc/archive/v1.34.0.tar.gz | tar -xz
cd grpc-1.34.0/examples/node/xds
npm install
node ./greeter_client.js --target=xds:///helloworld-gce

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

Greeting: Hello world, from INSTANCE_HOSTNAME

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

다음 단계