프록시리스 gRPC 서비스로 고급 트래픽 관리 구성

이 구성은 프리뷰 고객에게 지원되지만 신규 Cloud Service Mesh 사용자에게는 권장되지 않습니다. 자세한 내용은 Cloud Service Mesh 서비스 라우팅 개요를 참조하세요.

이 문서에서는 다음 트래픽 관리 기능을 사용하여 Cloud Service Mesh를 구성하는 방법을 설명합니다.

  • 경로 일치
  • 트래픽 분할
  • 회로 차단
  • 결함 주입
  • 최대 스트림 지속 시간
  • 다시 시도
  • 세션 어피니티
  • 이상점 감지
  • 지역 부하 분산

이 문서에서는 Compute Engine에서 프록시리스 gRPC로 고급 트래픽 관리 설정에 대해 집중적으로 설명하지만, Google Kubernetes Engine(GKE)에서 프록시리스 gRPC를 사용할 때에도 고급 트래픽 관리가 지원됩니다.

시작하기 전에

고급 트래픽 관리를 구성하기 전에 프록시리스 gRPC 서비스로 Cloud Service Mesh 설정 준비의 요구사항을 검토합니다. 요구사항이 모두 충족되지 않으면 고급 트래픽 관리를 구성할 수 없습니다.

이러한 기능의 개념은 고급 트래픽 관리를 참조하세요.

gRPC 월렛 예시 정보

이러한 기능을 설명하기 위해 gRPC 월렛 예시를 배포합니다. 이 예시에서는 3개의 gRPC 서비스(grpc.examples.wallet.Wallet, grpc.examples.wallet.stats.Stats, grpc.examples.wallet.account.Account)가 3개의 개별 애플리케이션으로 배포됩니다.

다음 다이어그램과 같이 Wallet 서비스를 호출하여 계정 잔액을 가져오고 Stats 서비스를 호출하여 코인 가격을 가져오는 gRPC 클라이언트를 만듭니다. Wallet 서비스는 StatsAccount 서비스를 호출하여 잔액을 계산합니다. Stats 서비스도 Account 서비스를 호출하여 사용자 정보를 가져옵니다.

gRPC 월렛 트래픽 라우팅 구성 예시
gRPC 월렛 트래픽 라우팅 구성 예시(확대하려면 클릭)

이 예시에서는 구성된 규칙에 따라 WalletStats 구현의 두 가지 버전을 배포하여 요청 라우팅을 보여줍니다. 여러 서비스 버전의 빌드와 배포를 시뮬레이션하도록 서버 플래그를 사용하여 한 번만 빌드하는 바이너리의 동작을 변경합니다.

  • --port 플래그는 VM 인스턴스의 서비스가 리슨하는 포트를 지정합니다.
  • --hostname_suffix 플래그는 요청에 응답하는 VM 인스턴스의 호스트 이름에 추가되는 값을 지정합니다. 결과 값은 응답에 hostname 메타데이터로 추가됩니다. 이렇게 하면 인스턴스 그룹에서 어떤 인스턴스가 클라이언트 요청에 응답했는지 식별할 수 있습니다.
  • --premium_only 플래그를 true 값으로 지정하면 서비스가 stats 서비스의 프리미엄 버전으로 지정됩니다.
  • --v1_behavior 플래그를 true 값으로 지정하면 월렛 바이너리가 v1 버전으로 동작합니다.

다음 표에는 gRPC 서비스 중 하나를 실행하는 각 VM 인스턴스, 인스턴스 그룹의 인스턴스 수, 이러한 인스턴스 그룹이 속한 백엔드 서비스에 대한 플래그 값이 나와 있습니다.

백엔드 서비스 인스턴스 그룹 인스턴스 서버 플래그
account account 2 --port=50053
--hostname_suffix="account"
stats stats 2 --port=50052
--hostname_suffix="stats"
--account_server="xds:///account.grpcwallet.io"
stats-premium stats-premium 2 --port=50052
--hostname_suffix="stats_premium"
--account_server="xds:///account.grpcwallet.io"
--premium_only=true
wallet-v1
wallet-v1-affinity
wallet-v1 2 --port=50051
--hostname_suffix="wallet_v1"
--v1_behavior=true
--account_server="xds:///account.grpcwallet.io"
--stats_server="xds:///stats.grpcwallet.io"
wallet-v2 wallet-v2 1 --port=50051
--hostname_suffix "wallet_v2"
--account_server="xds:///account.grpcwallet.io"
--stats_server="xds:///stats.grpcwallet.io"

이러한 서비스를 배포한 후 다음 표의 라우팅 규칙에 따라 테스트 클라이언트에서 이러한 백엔드 서비스로 요청을 라우팅하도록 Cloud Service Mesh를 구성합니다. 클라이언트는 호스트 열에 표시된 대로 서비스의 가상 호스트 이름에 연결합니다.

호스트 일치 규칙 라우팅 작업
wallet.grpcwallet.io 경로 프리픽스: "/"
헤더: "session_id"
wallet-v1-affinity로 라우팅
경로 프리픽스: "/"
헤더: {"route": "timeout"}
5초 제한 시간 설정 및
wallet-v2로 라우팅
경로 프리픽스: "/"
헤더: {"route": "fault"}
50% 요청에 실패 및
나머지 항목을 wallet-v2로 라우팅
경로 프리픽스: "/"
헤더: {"membership": "premium"}
wallet-v1로 라우팅 및
실패 시 최대 3회 재시도
전체 경로: /grpc.examples.wallet.Wallet/FetchBalance 라우팅 대상:
wallet-v1: 70%
wallet-v2: 30%
기본값 wallet-v1로 라우팅
stats.grpcwallet.io 경로 프리픽스: "/"
헤더: {"membership": "premium"}
stats-premium로 라우팅
기본값 stats로 라우팅
account.grpcwallet.io 경로 프리픽스: "/"
헤더: {"route": "account-fault"}
30% 요청에 실패 및
나머지 항목을 account로 라우팅
기본값 account

이 예시에서는 기존 서비스 2개 간에 70/30 트래픽 분할을 사용합니다. 이전에 URL 맵에서 참조하지 않은 새 서비스로 트래픽을 분할하는 경우 먼저 weightedBackendServices에 새 서비스를 추가하고 가중치 0을 지정합니다. 그런 다음 서비스에 할당된 가중치를 점차적으로 늘립니다.

테스트 클라이언트에는 트래픽 관리 기능을 보여주는 적절한 요청을 생성할 수 있는 다음 옵션이 있습니다.

옵션 설명
--watch=true 스트리밍 메서드를 호출하여 잔액/가격 보기
--unary_watch=true 단항 메서드를 반복적으로 호출하여 잔액/가격 보기
--user=Alice {"membership": "premium"} 헤더 삽입
--user=Bob {"membership": "normal"} 헤더 삽입
--route=value {"route": "value"} 헤더 삽입
--affinity=true {"session_id": "value"} 헤더 삽입

로컬 환경 준비

이 예시에 로컬 환경을 설정하려면 다음 명령어를 실행합니다.

  1. 최신 버전을 사용하도록 gcloud 바이너리를 업데이트합니다.

    gcloud components update
    
  2. 예시 저장소를 다운로드합니다.

    sudo apt-get install git -y
    
  3. 예를 들어 올바른 저장소를 클론합니다.

    export EXAMPLES_VERSION=v1.1.x
    git clone -b $EXAMPLES_VERSION --single-branch --depth=1 \
      https://github.com/GoogleCloudPlatform/traffic-director-grpc-examples.git
    

Cloud Router 인스턴스 만들기 및 구성

이 섹션에서는 각 리전에서 Cloud Router 인스턴스를 만들고 Cloud NAT에 맞게 이를 구성합니다. 이 예시에서 생성된 VM은 외부 IP 주소를 포함하지 않지만, 인터넷 액세스가 필요합니다. Cloud NAT로 Cloud Router를 구성하면 필요한 액세스가 제공됩니다.

gcloud

  1. Cloud Router 인스턴스를 만듭니다.

    gcloud compute routers create nat-router-us-central1 \
        --network=default \
        --region=us-central1
    
  2. Cloud NAT용 라우터를 구성합니다.

    gcloud compute routers nats create nat-config \
        --router-region=us-central1 \
        --router=nat-router-us-central1 \
        --nat-all-subnet-ip-ranges \
        --auto-allocate-nat-external-ips
    

gRPC 상태 확인 및 방화벽 규칙 만들기

이 섹션에서는 gRPC 상태 확인과 gRPC 상태 확인 요청이 네트워크에 도달하도록 허용하는 방화벽 규칙을 만듭니다. 나중에 gRPC 상태 확인은 백엔드 서비스와 연결되어 백엔드 서비스의 백엔드 인스턴스 상태를 확인할 수 있습니다.

gcloud

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

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

    gcloud compute firewall-rules create grpcwallet-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-50053
    

인스턴스 템플릿 만들기

이 섹션에서는 포트 50053에 노출된 account gRPC 서비스를 배포하는 인스턴스 템플릿을 만듭니다.

gcloud

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

    gcloud compute instance-templates create grpcwallet-account-template \
       --scopes=https://www.googleapis.com/auth/cloud-platform \
       --tags=allow-health-checks \
       --network-interface=no-address \
       --image-family=debian-10 \
       --image-project=debian-cloud \
       --metadata-from-file=startup-script=<(echo "#! /bin/bash
    set -ex
    cd /root
    export HOME=/root
    sudo apt-get update -y
    pushd \$(mktemp -d)
    sudo apt-get install -y wget git
    wget https://dl.google.com/go/go1.16.5.linux-amd64.tar.gz
    sudo tar -C /usr/local -xvf go1.16.5.linux-amd64.tar.gz
    sudo cp /usr/local/go/bin/go /usr/bin/go
    popd
    git clone -b $EXAMPLES_VERSION --single-branch --depth=1 https://github.com/GoogleCloudPlatform/traffic-director-grpc-examples.git
    cd traffic-director-grpc-examples/go/account_server/
    go build .
    sudo systemd-run ./account_server --port 50053 --hostname_suffix account")
    

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

관리형 인스턴스 그룹(MIG)은 자동 확장을 사용하여 필요에 따라 새 VM 인스턴스를 만듭니다. 이 섹션에서는 이전 섹션에서 만든 인스턴스 템플릿을 사용하여 MIG를 만듭니다.

gcloud

  • 인스턴스 그룹을 만듭니다.

    gcloud compute instance-groups managed create grpcwallet-account-mig-us-central1 \
       --zone=us-central1-a \
       --size=2 \
       --template=grpcwallet-account-template
    

이름이 지정된 포트 구성

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

gcloud

  • 이름이 지정된 포트를 만듭니다.

    gcloud compute instance-groups set-named-ports grpcwallet-account-mig-us-central1 \
       --named-ports=grpcwallet-account-port:50053 \
       --zone=us-central1-a
    

백엔드 서비스 만들기

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

gcloud

  1. 백엔드 서비스를 만든 후 상태 확인을 새 백엔드 서비스에 연결합니다.

    gcloud compute backend-services create grpcwallet-account-service \
        --global \
        --load-balancing-scheme=INTERNAL_SELF_MANAGED \
        --protocol=GRPC \
        --port-name=grpcwallet-account-port \
        --health-checks=grpcwallet-health-check
    
  2. 관리형 인스턴스 그룹을 백엔드로 추가합니다.

    gcloud compute backend-services add-backend grpcwallet-account-service \
        --instance-group=grpcwallet-account-mig-us-central1 \
        --instance-group-zone=us-central1-a \
        --global
    

gRPC 월렛 예시에서 사용할 나머지 백엔드 서비스를 만드는 단계는 이전 단계와 비슷합니다. 셸 스크립트를 실행하여 나머지 서비스를 만듭니다. 스크립트는 다음 백엔드 서비스를 배포합니다.

  • stats
  • stats-premium
  • wallet-v1
  • wallet-v1-affinity
  • wallet-v2

추가 백엔드 서비스를 만드는 셸 스크립트를 실행합니다.

traffic-director-grpc-examples/scripts/create_service.sh go stats 50052 stats '--account_server="xds:///account.grpcwallet.io"'

traffic-director-grpc-examples/scripts/create_service.sh go stats 50052 stats-premium '--account_server="xds:///account.grpcwallet.io" --premium_only=true'

# This command creates wallet-v1 and wallet-v1-affinity backend services.
traffic-director-grpc-examples/scripts/create_service.sh java wallet 50051 wallet-v1 '--account_server="xds:///account.grpcwallet.io" --stats_server="xds:///stats.grpcwallet.io" --v1_behavior=true'

traffic-director-grpc-examples/scripts/create_service.sh java wallet 50051 wallet-v2 '--account_server="xds:///account.grpcwallet.io" --stats_server="xds:///stats.grpcwallet.io"'

라우팅 규칙 만들기

이 섹션에서는 다양한 트래픽 관리 기능을 보여주는 데 사용되는 URL 맵을 만듭니다. URL 맵은 이 예시에서 서비스의 가상 호스트 이름과 관련 라우팅 규칙을 지정합니다. 자세한 내용은 라우팅 규칙 맵을 참조하세요.

URL 맵에서 hostRules는 예시의 서비스 가상 호스트 이름을 지정합니다. 클라이언트가 특정 서비스에 연결하도록 채널 URI에서 사용하는 이름입니다. 예를 들어 account 서비스에 요청을 보내려면 클라이언트는 채널 URI에서 xds:///account.grpcwallet.io를 사용합니다. hostRules에서 hosts 항목을 account.grpcwallet.io 값으로 구성합니다.

hosts 항목과 연결된 pathMatcher는 가상 호스트의 모든 라우팅 규칙이 포함된 pathMatcher의 이름을 지정합니다. pathMatcher 구성은 gRPC 월렛 예시 정보에 설명된 대로 일치하는 규칙과 해당 작업 규칙으로 구성됩니다.

gcloud

URL 맵을 만듭니다.

export PROJECT_ID=$(gcloud config list --format 'value(core.project)')
export BS_PREFIX=projects/$PROJECT_ID/global/backendServices/grpcwallet

gcloud compute url-maps import grpcwallet-url-map << EOF
name: grpcwallet-url-map
defaultService: $BS_PREFIX-account-service

hostRules:
- hosts:
  - account.grpcwallet.io
  pathMatcher: grpcwallet-account-path-matcher
- hosts:
  - stats.grpcwallet.io
  pathMatcher: grpcwallet-stats-path-matcher
- hosts:
  - wallet.grpcwallet.io
  pathMatcher: grpcwallet-wallet-path-matcher

pathMatchers:
- name: grpcwallet-account-path-matcher
  defaultService: $BS_PREFIX-account-service
  routeRules:
  - matchRules:
    - prefixMatch: /
      headerMatches:
      - headerName: route
        exactMatch: account-fault
    priority: 0
    routeAction:
      weightedBackendServices:
      - backendService: $BS_PREFIX-account-service
        weight: 100
      faultInjectionPolicy:
        abort:
          httpStatus: 503
          percentage: 30

- name: grpcwallet-stats-path-matcher
  defaultService: $BS_PREFIX-stats-service
  routeRules:
  - matchRules:
    - prefixMatch: /
      headerMatches:
      - headerName: membership
        exactMatch: premium
    priority: 0
    service: $BS_PREFIX-stats-premium-service

- name: grpcwallet-wallet-path-matcher
  defaultService: $BS_PREFIX-wallet-v1-service
  routeRules:
  - matchRules:
    - prefixMatch: /
      headerMatches:
      - headerName: session_id
        presentMatch: true
    priority: 0
    routeAction:
      weightedBackendServices:
      - backendService: $BS_PREFIX-wallet-v1-affinity-service
        weight: 100

  - matchRules:
    - prefixMatch: /
      headerMatches:
      - headerName: route
        exactMatch: timeout
    priority: 1
    routeAction:
      weightedBackendServices:
      - backendService: $BS_PREFIX-wallet-v2-service
        weight: 100
      maxStreamDuration:
        seconds: 5

  - matchRules:
    - prefixMatch: /
      headerMatches:
      - headerName: route
        exactMatch: fault
    priority: 2
    routeAction:
      weightedBackendServices:
      - backendService: $BS_PREFIX-wallet-v2-service
        weight: 100
      faultInjectionPolicy:
        abort:
          httpStatus: 503
          percentage: 50

  - matchRules:
    - prefixMatch: /
      headerMatches:
      - headerName: membership
        exactMatch: premium
    priority: 3
    routeAction:
      weightedBackendServices:
      - backendService: $BS_PREFIX-wallet-v1-service
        weight: 100
      retryPolicy:
        retryConditions:
          - unavailable
        numRetries: 3

  - matchRules:
    - fullPathMatch: /grpc.examples.wallet.Wallet/FetchBalance
    priority: 4
    routeAction:
      weightedBackendServices:
      - backendService: $BS_PREFIX-wallet-v1-service
        weight: 70
      - backendService: $BS_PREFIX-wallet-v2-service
        weight: 30

  - matchRules:
    - prefixMatch: /grpc.examples.wallet.Wallet/
    priority: 5
    routeAction:
      weightedBackendServices:
      - backendService: $BS_PREFIX-wallet-v2-service
        weight: 100
EOF

대상 프록시 및 전달 규칙 만들기

이 섹션에서는 대상 gRPC 프록시와 전달 규칙을 만듭니다.

대상 gRPC 프록시는 이전 단계에서 만든 URL 맵을 참조합니다. --validate-for-proxyless 플래그를 지정하면 프록시리스 gRPC 배포와 호환되지 않는 기능이 우발적으로 사용 설정되지 않도록 구성 확인을 사용 설정할 수 있습니다.

gcloud

  • 대상 gRPC 프록시를 만듭니다.

    gcloud compute target-grpc-proxies create grpcwallet-proxy \
       --url-map=grpcwallet-url-map \
       --validate-for-proxyless
    

전달 규칙은 생성된 대상 gRPC 프록시를 참조합니다. 부하 분산 스키마가 INTERNAL_SELF_MANAGED로 설정되어 이 전달 규칙이 Cloud Service Mesh에서 사용됨을 나타냅니다. 전역 전달 규칙이어야 합니다. IP 주소는 0.0.0.0으로 설정됩니다. 프록시리스 gRPC 클라이언트가 DNS를 조회하는 대신 LDS 요청을 Cloud Service Mesh로 전송하여 대상 URI의 hostname:port를 확인하기 때문입니다. 자세한 내용은 이름 변환 스키마를 참조하세요.

대상 URI에 포트가 지정되어 있지 않으면 기본값은 80입니다. 예를 들어 대상 URI xds:///foo.myservice:8080은 포트 8080으로 구성된 전달 규칙과 일치합니다. 이 예시에서 전달 규칙은 포트 80으로 구성됩니다.

gcloud

  • 전달 규칙을 만듭니다.

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

구성 확인

구성 프로세스가 완료되면 Google Cloud 콘솔의 Cloud Service Mesh 페이지를 확인하여 구성한 백엔드 서비스를 사용할 수 있는지 확인합니다. 백엔드 서비스와 관련 백엔드가 정상으로 보고되었는지 확인합니다. 몇 분 정도 걸릴 수 있습니다.

라우팅 구성 확인

이 섹션에서는 라우팅 구성이 올바르게 작동하는지 확인합니다. grpcurl 도구를 사용하여 구성을 테스트합니다.

gcloud

  1. 클라이언트를 실행할 클라이언트 VM을 만들어 서비스를 테스트합니다. 선택적으로 --network-interface=no-address 플래그를 포함할 수 있습니다.

    gcloud compute instances create grpc-wallet-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.16.0.tar.gz | tar -xz
    ./td-grpc-bootstrap-0.16.0/td-grpc-bootstrap | sudo tee $GRPC_XDS_BOOTSTRAP')
    
  2. SSH를 사용하여 VM에 액세스하고 다음 명령어를 실행하여 VM을 준비합니다.

    export EXAMPLES_VERSION=v1.1.x
    sudo apt-get update
    sudo apt-get install git -y
    
  3. 다음 명령어를 실행합니다.

    git clone -b $EXAMPLES_VERSION --single-branch --depth=1 \
       https://github.com/GoogleCloudPlatform/traffic-director-grpc-examples.git
    curl -L https://github.com/fullstorydev/grpcurl/releases/download/v1.6.1/grpcurl_1.6.1_linux_x86_64.tar.gz | tar -xz
    chmod +x grpcurl
    

사이드카 프록시 없이 서비스에 액세스하려면 gRPC 클라이언트에서 xds 이름 변환 스키마를 사용해야 합니다. 이 스키마는 클라이언트에서 사용되는 gRPC 라이브러리에 xDS 서버를 사용하여 호스트 이름을 확인하도록 지시합니다. 이렇게 하려면 부트스트랩 구성이 필요합니다.

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

grpcurl 도구를 사용하여 구성 확인

SSH 셸에서 다음 명령어를 실행하여 wallet-service, stats-service, account-service가 실행 중인지 확인합니다.

./grpcurl -plaintext xds:///account.grpcwallet.io list
./grpcurl -plaintext -d '{"token": "2bd806c9"}' xds:///account.grpcwallet.io grpc.examples.wallet.account.Account/GetUserInfo
./grpcurl -plaintext -H 'authorization:2bd806c9' -H 'membership:premium' xds:///stats.grpcwallet.io grpc.examples.wallet.stats.Stats/FetchPrice
./grpcurl -plaintext -H 'authorization:2bd806c9' -H 'membership:premium' -d '{"include_balance_per_address": true}' xds:///wallet.grpcwallet.io grpc.examples.wallet.Wallet/FetchBalance

다음과 같은 결과가 표시됩니다.

grpc.examples.wallet.account.Account
grpc.health.v1.Health
grpc.reflection.v1alpha.ServerReflection

{
  "name": "Alice",
  "membership": "PREMIUM"
}

{
  "price": "10295"
}

{
  "balance": "5089953"
}

grpc-wallet 클라이언트로 확인

다음 언어별 안내를 따라 구성을 확인합니다. 이 명령어는 URL 맵의 일치 규칙에 따라 요청이 백엔드 서비스로 라우팅됨을 보여주기 위해 추가 메타데이터와 함께 RPC 여러 개를 전송합니다. 또한 이 명령어는 각 응답의 VM 인스턴스 호스트 이름을 출력하여 요청이 라우팅된 VM 인스턴스를 표시합니다.

자바

  1. gRPC 자바 클라이언트에서 서비스를 확인하려면 다음을 실행합니다.

    sudo apt-get install -y openjdk-11-jdk-headless
    
  2. 다음 명령어를 실행합니다.

    cd ~/traffic-director-grpc-examples/java
    ./gradlew installDist
    
    # This command calls 'FetchBalance' from 'wallet-service' in a loop,
    # to demonstrate that 'FetchBalance' gets responses from 'wallet-v1' (70%)
    # and 'wallet-v2' (30%).
    ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Bob
    
    # This command calls the streaming RPC 'WatchBalance' from 'wallet-service'.
    # The RPC path matches the service prefix, so all requests are
    # sent to 'wallet-v2'.
    ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob
    
    # This command calls 'WatchPrice' from 'stats-service'. It sends the
    # user's membership (premium or not) in metadata. Premium requests are
    # all sent to 'stats-premium' and get faster responses. Alice's requests
    # always go to premium and Bob's go to regular.
    ./build/install/wallet/bin/client price --stats_server="xds:///stats.grpcwallet.io" --watch=true --user=Bob
    ./build/install/wallet/bin/client price --stats_server="xds:///stats.grpcwallet.io" --watch=true --user=Alice
    

Go

  1. gRPC Go 클라이언트에서 서비스를 확인하려면 golang을 설치하거나 공식 안내를 따릅니다.

    sudo apt-get install -y wget
    wget https://dl.google.com/go/go1.16.5.linux-amd64.tar.gz
    sudo tar -C /usr/local -xvf go1.16.5.linux-amd64.tar.gz
    sudo ln -s /usr/local/go/bin/go /usr/bin/go
    
  2. 다음 명령어를 실행합니다.

    cd ~/traffic-director-grpc-examples/go/wallet_client
    go build
    
    # This command calls 'FetchBalance' from 'wallet-service' in a loop,
    # to demonstrate that 'FetchBalance' gets responses from 'wallet-v1' (70%)
    # and 'wallet-v2' (30%).
    ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch --user=Bob
    
    # This command calls the streaming RPC 'WatchBalance' from 'wallet-service'.
    # The RPC path matches the service prefix, so all requests
    # are sent to 'wallet-v2'.
    ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch --user=Bob
    
    # This command calls 'WatchPrice' from 'stats-service'. It sends the
    # user's membership (premium or not) in metadata. Premium requests are
    # all sent to 'stats-premium' and get faster responses. Alice's requests
    # always go to premium and Bob's go to regular.
    ./wallet_client price --stats_server="xds:///stats.grpcwallet.io" --watch --user=Bob
    ./wallet_client price --stats_server="xds:///stats.grpcwallet.io" --watch --user=Alice
    

C++

  1. gRPC C++ 클라이언트에서 서비스를 확인하려면 다음을 실행합니다.

    sudo apt-get install -y build-essential
    
  2. 다음 명령어를 실행합니다.

    cd ~/traffic-director-grpc-examples/cpp
    ../tools/bazel build :client
    
    # This command calls 'FetchBalance' from 'wallet-service' in a loop,
    # to demonstrate that 'FetchBalance' gets responses from 'wallet-v1' (70%)
    # and 'wallet-v2' (30%).
    ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Bob
    
    # This command calls the streaming RPC 'WatchBalance'  from 'wallet-service'.
    # The RPC path matches the service prefix, so all requests are sent to 'wallet-v2'.
    ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob
    
    # This command calls 'WatchPrice' from 'stats-service'. It sends the
    # user's membership (premium or not) in metadata. Premium requests are
    # all sent to 'stats-premium' and get faster responses. Alice's requests
    # always go to premium, and Bob's go to regular.
    ../bazel-bin/cpp/client price --stats_server="xds:///stats.grpcwallet.io" --watch=true --user=Bob
    ../bazel-bin/cpp/client price --stats_server="xds:///stats.grpcwallet.io" --watch=true --user=Alice
    

고급 옵션 구성

다음 섹션의 안내에 따라 고급 트래픽 라우팅 옵션을 추가로 구성할 수 있습니다.

회로 차단

회로 차단을 통해 클라이언트 요청으로 인해 백엔드 서비스에 과부하가 발생하지 않도록 장애 임곗값을 설정할 수 있습니다. 대기 중인 요청 수가 설정한 한도에 도달하면 클라이언트가 추가 요청 전송을 중지하여 백엔드 서비스에서 복구할 시간을 줍니다.

회로 차단은 백엔드 서비스에 과부하를 발생시키지 않고 클라이언트에 오류를 반환하여 연쇄적 장애를 방지합니다. 이렇게 하면 일부 트래픽을 제공하면서도 자동 확장을 통해 용량을 늘려 트래픽 급증을 처리하는 것과 같은 과부하 상황 관리를 위한 시간을 확보할 수 있습니다.

stats-service의 백엔드 서비스를 만들 때 create_service.sh 스크립트는 구성에 다음 줄을 포함합니다.

circuitBreakers:
  maxRequests: 1

이 설정은 클라이언트에서 stats-service에 대해 대기 중인 요청을 한 번에 한 개로 제한합니다. wallet-v2 서비스가 1개만 있기 때문에 2개의 동시 월렛 클라이언트 WatchBalance 작업을 실행하면 두 번째 인스턴스에서 오류가 표시됩니다.

자바

  1. 다음 명령어를 실행합니다.

    cd ~/traffic-director-grpc-examples/java
    ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob  2>/dev/null 1>/dev/null &
    
    sleep 10 # Wait a few seconds to allow the watch to begin.
    
    ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob
    
  2. 출력은 다음과 같이 표시됩니다.

    io.grpc.examples.wallet.Client run
    INFO: Will try to run balance
    io.grpc.examples.wallet.Client run
    WARNING: RPC failed: Status{code=INTERNAL, description=RPC to stats server failed: UNAVAILABLE: Cluster max concurrent requests limit exceeded, cause=null}
    
  3. kill 명령어를 실행합니다.

    kill %%
    

Go

  1. 다음 명령어를 실행합니다.

    cd ~/traffic-director-grpc-examples/go/wallet_client
    ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch --user=Bob 2> /dev/null 1> /dev/null &
    
    sleep 10 # Wait a few seconds to allow the watch to begin.
    
    ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch --user=Bob
    
  2. 출력은 다음과 같이 표시됩니다.

    server host: error: no hostname
    failed to fetch balance: rpc error: code = Internal desc = RPC to stats server failed:
    UNAVAILABLE: Cluster max concurrent requests limit exceeded
    
  3. kill 명령어를 실행합니다.

    kill %%
    

C++

  1. 다음 명령어를 실행합니다.

    cd ~/traffic-director-grpc-examples/cpp
    ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob 2>/dev/null 1>/dev/null &
    
    sleep 10 # Wait a few seconds to allow the watch to begin.
    
    ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob
    
  2. 출력은 다음과 같이 표시됩니다.

    Client arguments: command: balance, wallet_server: xds:///wallet.grpcwallet.io, stats_server:
    localhost:18882, user: Bob, watch: 1 ,unary_watch: 0, observability_project: , route:
    13: RPC to stats server failed: UNAVAILABLE: Cluster max concurrent requests limit exceeded
    
  3. kill 명령어를 실행합니다.

    kill %%
    

결함 주입

결함 주입은 높은 지연 시간, 서비스 과부하, 서비스 장애, 네트워크 파티션 나누기 등의 장애를 시뮬레이션하는 요청을 제공할 때 의도적으로 오류를 발생시킬 수 있습니다. 이 기능은 장애를 시뮬레이션하면서 서비스의 복원력을 테스트하는 데 유용합니다.

이전에 URL 맵을 만든 경우 route=fault 헤더를 사용하여 wallet.grpcwallet.io에 전송된 RPC의 50%를 실패하도록 결함 주입 정책을 설정합니다.

결함 주입을 표시하기 위해 다음 언어의 코드를 사용합니다.

자바

  1. 다음 명령어를 실행합니다.

    cd ~/traffic-director-grpc-examples/java
    ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Bob --route=fault
    
  2. 출력은 다음과 같이 표시됩니다.

    server host: grpcwallet-wallet-v2-mig-us-central1-zznc
    total balance: 10340491
    - address: 148de9c5, balance: 2549839
    - address: 2e7d2c03, balance: 7790652
    io.grpc.examples.wallet.Client run
    WARNING: RPC failed: Status{code=UNAVAILABLE, description=RPC terminated due to fault injection: HTTP status code 503, cause=null}
    

Go

  1. 다음 명령어를 실행합니다.

    cd ~/traffic-director-grpc-examples/go/wallet_client
    ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch --user=Bob --route=fault
    
  2. 출력은 다음과 같이 표시됩니다.

     server host: grpcwallet-wallet-v1-mig-us-central1-bm1t_wallet-v1
     user: Bob, total grpc-coin balance: 10452589.
      - address: 2e7d2c03, balance: 7875108.
      - address: 148de9c5, balance: 2577481.
     failed to fetch balance: rpc error: code = Unavailable desc = RPC terminated due to fault injection
    

C++

  1. 다음 명령어를 실행합니다.

    cd ~/traffic-director-grpc-examples/cpp
    ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Bob --route=fault
    
  2. 출력은 다음과 같이 표시됩니다.

    Client arguments: command: balance, wallet_server: xds:///wallet.grpcwallet.io,
    stats_server: localhost:18882, user: Bob, watch: 0 ,unary_watch: 1, observability_project: ,
    route: fault server host: grpcwallet-wallet-v2-mig-us-central1-1lm6
    user: Bob total grpc-coin balance: 10211908
     - address: 148de9c5, balance: 2518132
     - address: 2e7d2c03, balance: 7693776
    14: Fault injected
    

최대 스트림 지속 시간

최대 스트림 지속 시간은 최대 제한 시간이 모든 RPC에 적용되도록 합니다. 이렇게 하면 마감 시한 설정을 잊었거나 과도하게 설정한 클라이언트가 서버 리소스를 낭비하지 못하도록 방지합니다.

이전에 URL 맵을 만든 경우 route=timeout 헤더를 사용하여 wallet.grpcwallet.io에 전송된 RPC의 최대 스트림 기간을 5초로 설정합니다.

시간 제한을 보여주기 위해 먼저 wallet-v2 서비스를 중지합니다.

gcloud

gcloud compute instance-groups managed resize \
    --size=0 grpcwallet-wallet-v2-mig-us-central1 \
    --zone=us-central1-a

이를 처리할 수 있는 백엔드 서비스가 없고, 애플리케이션에 마감 시간이 설정되지 않기 때문에 다음 명령어가 계속 막힌 상태로 유지됩니다.

자바

  1. 다음 명령어를 실행합니다.

    cd ~/traffic-director-grpc-examples/java
    ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob
    
  2. 명령어가 응답하지 않습니다. ^C를 눌러 명령어를 중단합니다.

Go

  1. 다음 명령어를 실행합니다.

    cd ~/traffic-director-grpc-examples/go/wallet_client
    ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch --user=Bob
    
  2. 명령어가 응답하지 않습니다. ^C를 눌러 명령어를 중단합니다.

C++

  1. 다음 명령어를 실행합니다.

    cd ~/traffic-director-grpc-examples/cpp
    ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob
    
  2. 명령어가 응답하지 않습니다. ^C를 눌러 명령어를 중단합니다.

하지만 timeout 경로를 사용하는 다음 명령어는 maxStreamDuration 설정으로 인해 5초 후에 실패합니다.

자바

  1. 다음 명령어를 실행합니다.

    cd ~/traffic-director-grpc-examples/java
    ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob --route=timeout
    
  2. 출력은 다음과 같이 표시됩니다.

    io.grpc.examples.wallet.Client run
    WARNING: RPC failed: Status{code=DEADLINE_EXCEEDED, description=deadline exceeded after 4.999594070s.         [wait_for_ready, buffered_nanos=5000553401, waiting_for_connection], cause=null}
    

Go

  1. 다음 명령어를 실행합니다.

    cd ~/traffic-director-grpc-examples/go/wallet_client
    ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch --user=Bob --route=timeout
    
  2. 출력은 다음과 같이 표시됩니다.

    failed to create stream: rpc error: code = DeadlineExceeded desc = context deadline exceeded.
    

C++

  1. 다음 명령어를 실행합니다.

    cd ~/traffic-director-grpc-examples/cpp
    ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob --route=timeout
    
  2. 출력은 다음과 같이 표시됩니다.

    Client arguments: command: balance, wallet_server: xds:///wallet.grpcwallet.io, stats_server:
    localhost:18882, user: Bob, watch: 1 ,unary_watch: 0, observability_project: , route: timeout
    4: Deadline Exceeded
    

wallet-v2 서비스를 다시 시작합니다.

gcloud

gcloud compute instance-groups managed resize \
    --size=1 grpcwallet-wallet-v2-mig-us-central1 \
    --zone=us-central1-a

다시 시도

재시도는 gRPC 애플리케이션이 재시도 정책에 따라 아웃바운드 요청을 다시 시도할 수 있도록 하여 서비스 가용성을 향상시키는 데 도움이 됩니다. 재시도 정책에서는 실패한 요청이 재시도되어야 하는 조건과 최대 재시도 횟수를 구성할 수 있습니다. 예를 들어 요청이 특정 응답 코드와 함께 실패하는 경우입니다.

이전에 URL 맵을 만든 경우 membership=premium 헤더를 사용하여 FetchBalance 메서드에 RPC의 재시도 정책을 설정합니다. 이 정책은 상태 코드가 unavailable인 오류가 발생한 RPC를 최대 3회 재시도합니다. 또한 RPC에 대한 결함 주입 정책을 Wallet 서비스에서 Account 서비스로의 RPC의 30%를 실패하는 route=account-fault 헤더를 사용하여 account.grpcwallet.io으로 설정합니다. 결과적으로 membership=normal 헤더가 있는 테스트 클라이언트의 RPC 중 30%가 실패하지만 membership=premium 헤더가 있는 RPC의 실패율은 1% 미만입니다.

재시도를 표시하려면 다음 언어로 된 코드를 사용하세요.

자바

다음 명령어를 실행합니다.

cd ~/traffic-director-grpc-examples/java
# 30% of the requests fail because Bob is a normal user.
./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Bob --route=account-fault
# Less than 1% of the requests fail because Alice is a premium user.
./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Alice --route=account-fault

Go

다음 명령어를 실행합니다.

cd ~/traffic-director-grpc-examples/go/wallet_client
# 30% of the requests fail because Bob is a normal user.
./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Bob --route=account-fault
# Less than 1% of the requests fail because Alice is a premium user.
./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Alice --route=account-fault

C++

다음 명령어를 실행합니다.

cd ~/traffic-director-grpc-examples/cpp
# 30% of the requests fail because Bob is a normal user.
../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Bob --route=account-fault
# Less than 1% of the requests fail because Alice is a premium user.
../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Alice --route=account-fault

세션 어피니티

세션 어피니티는 인스턴스가 정상이고 용량이 있는 한 특정 특성(HTTP 헤더)이 있는 요청을 동일한 인스턴스로 전송하려고 합니다. 이 방법은 예를 들어 다른 인스턴스로의 라운드 로빈 분산 대신 특정 클라이언트의 요청을 동일한 인스턴스로 보낼 때 향상된 성능 및 효율성을 활용할 수 있는 스테이트풀(Stateful) 애플리케이션 서버에 유용합니다.

백엔드 서비스 grpcwallet-wallet-v1-affinity-service를 만들 때 create_service.sh 스크립트에서 localityLbPolicyROUND_ROBIN으로 설정되었습니다. 이 예시에서는 다음 구성을 적용하여 localityLbPolicyRING_HASH로 변경합니다.

sessionAffinity: HEADER_FIELD
localityLbPolicy: RING_HASH
consistentHash:
  httpHeaderName: "session_id"

gcloud

  1. 백엔드 서비스 grpcwallet-wallet-v1-affinity-service의 구성을 저장합니다.

    gcloud compute backend-services export grpcwallet-wallet-v1-affinity-service \
     --destination=bs_config.yaml \
     --global
    
  2. 백엔드 서비스 grpcwallet-wallet-v1-affinity-service를 업데이트합니다.

    project_id="$(gcloud config list --format 'value(core.project)')"
    backend_config="
    backends:
    - balancingMode: UTILIZATION
      capacityScaler: 1.0
      group: projects/${project_id}/zones/us-central1-a/instanceGroups/grpcwallet-wallet-v1-mig-us-central1
    connectionDraining:
      drainingTimeoutSec: 0
    healthChecks:
    - projects/${project_id}/global/healthChecks/grpcwallet-health-check
    loadBalancingScheme: INTERNAL_SELF_MANAGED
    name: grpcwallet-wallet-v1-affinity-service
    portName: grpcwallet-wallet-port
    protocol: GRPC
    sessionAffinity: HEADER_FIELD
    localityLbPolicy: RING_HASH
    consistentHash:
      httpHeaderName: session_id"
    gcloud compute backend-services import grpcwallet-wallet-v1-affinity-service --global <<< "${backend_config}"
    

세션 어피니티를 확인하려면 다음 언어의 코드를 사용하세요. --affinity=true 플래그를 사용하면 클라이언트는 각 사용자에 대해 고유한 값이 있는 session-id 헤더를 삽입합니다. 이 값의 해시는 백엔드 서비스 grpcwallet-wallet-v1-affinity-service의 인스턴스 그룹에 있는 특정 인스턴스로 요청을 보내는 데 사용됩니다.

자바

다음 명령어를 실행합니다.

cd ~/traffic-director-grpc-examples/java
# Without affinity, requests are sent to both instances.
./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Alice
# With affinity, requests are sent to only one instance.
./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Alice --affinity=true

Go

다음 명령어를 실행합니다.

cd ~/traffic-director-grpc-examples/go/wallet_client
# Without affinity, requests are sent to both instances.
./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Alice
# With affinity, requests are sent to only one instance.
./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Alice --affinity=true

C++

다음 명령어를 실행합니다.

cd ~/traffic-director-grpc-examples/cpp
# Without affinity, requests are sent to both instances.
../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Alice
# With affinity, requests are sent to only one instance.
../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Alice --affinity=true

백엔드 서비스 grpcwallet-wallet-v1-affinity-service의 구성을 복원합니다.

gcloud

gcloud compute backend-services import grpcwallet-wallet-v1-affinity-service \
  --source=bs_config.yaml \
  --global

이상점 감지

서비스 가용성을 개선하려면 이상점 감지를 구성하세요. 이 기능을 사용하면 부하 분산 풀에서 비정상 호스트를 식별하고 일시적으로 제거할 수 있습니다. 이러한 비정상 호스트를 이상점이라고 합니다.

gRPC는 호스트가 요청을 성공적으로 처리하는 빈도인 성공률을 기준으로 호스트를 평가합니다. 이 비율은 gRPC 오류, HTTP 오류, 시간 초과, 기타 문제와 같은 장애의 영향을 받습니다.

Cloud Service Mesh를 통해 이상점 감지를 구성할 때 gRPC가 호스트를 평가하는 방법과 이상점을 처리하는 방식을 미세 조정할 수 있습니다. 예를 들어 다음과 같은 기준을 지정할 수 있습니다.

  • gRPC가 가능한 이상점 상태를 분석하기 전에 호스트가 수신해야 하는 요청 수

  • 이상점으로 간주되기 전에 호스트가 평균 성공률에서 벗어나는 정도

  • 부하 분산 풀에서 한 번에 제거할 수 있는 최대 호스트 비율

  • 이상점이 부하 분산 풀에서 제외되는 시간

사용 가능한 매개변수에 대한 자세한 내용은 REST Resource: backendServices 참조를 확인하세요. 그러나 gRPC에는 다음 섹션에서 설명하는 제한사항이 적용됩니다.

제한사항

다음 필드는 gRPC 클라이언트에 지원되지 않습니다.

  • outlierDetection.consecutiveErrors

  • outlierDetection.enforcingConsecutiveErrors

  • outlierDetection.consecutiveGatewayFailure

  • outlierDetection.enforcingConsecutiveGatewayFailure

이상점 감지 설정

다음 절차에서는 인스턴스 그룹 하나를 백엔드로 사용하는 서비스의 이상점 감지를 구성하는 방법을 보여줍니다. 이 절차에서는 다음 구성을 설정합니다.

  • 이상점 감지 분석은 1초마다 실행됩니다. interval 필드를 사용하여 이 동작을 구성합니다.
  • 이상점은 다음과 같이 30초 단위로 부하 분산 풀에서 제거됩니다.
    • 이전에 제거된 적이 없는 호스트는 30초 동안만 제거됩니다.
    • 호스트가 이전에 제거된 경우 이전의 제거 1회당 30초씩 시간이 증가합니다. 예를 들어 세 번째로 제거되는 호스트는 90초 동안 제거됩니다. baseEjectionTime 필드를 사용하여 이 동작을 구성합니다.
  • 성공률이 선택한 시간 간격(이 경우 1초) 동안 평균보다 표준 편차 1만큼 낮은 호스트는 비정상으로 간주됩니다. successRateStdevFactor 필드를 사용하여 최대 표준 편차를 구성합니다.

이러한 방식으로 이상점 감지를 구성하려면 다음 단계를 수행합니다.

gcloud

  1. gcloud compute backend-services export 명령어를 사용하여 grpcwallet-wallet-v2-service 백엔드 서비스 구성 파일을 내보냅니다.

    gcloud compute backend-services export grpcwallet-wallet-v2-service \
     --destination=bs_config.yaml \
     --global
    
  2. bs_config.yaml 파일에서 이상점 감지 필드를 포함하도록 grpcwallet-wallet-v2-service 구성을 업데이트합니다.

    outlierDetection:
     interval:
       seconds: 1
       nanos: 0
     baseEjectionTime:
       seconds: 30
       nanos: 0
     successRateStdevFactor: 1000
    
  3. gcloud compute backend-services import 명령어를 사용하여 업데이트된 파일을 가져옵니다.

    gcloud compute backend-services import grpcwallet-wallet-v2-service \
     --source=bs_config.yaml \
     --global

지역 부하 분산

리소스를 가장 효율적으로 사용하려면 지역 부하 분산을 구성합니다. 이 기능을 사용하면 백엔드에 클라이언트 요청을 균등하게 분산하여 리소스를 보존할 수 있습니다.

지역 부하 분산을 구성할 때 다음 표에 설명된 옵션을 사용할 수 있습니다. 모든 옵션을 사용하려면 backendServices 리소스를 구성해야 합니다.

옵션 적용 대상 관련 구성 필드
기본 제공 정책 사용 모든 gRPC 클라이언트 localityLbPolicy
커스텀 정책 사용 gRPC 클라이언트만 포함된 메시에서 gRPC 버전 1.47 이상을 사용하는 Java 클라이언트 localityLbPolicies
선호 정책 목록 정의 gRPC 클라이언트만 포함된 메시에서 gRPC 버전 1.47 이상을 사용하는 Java 클라이언트 localityLbPolicies

위의 옵션을 원하는 대로 조합하여 사용할 수 있습니다. 하지만 localityLbPolicylocalityLbPolicies를 모두 구성하면 gRPC에서 먼저 localityLbPolicies 구성을 사용하려고 시도합니다.

지역 부하 분산을 구성하지 않으면 Cloud Service Mesh에서 ROUND_ROBIN 정책을 사용합니다.

ROUND_ROBIN 및 기타 기본 제공 정책에 관한 자세한 내용은 backendServices 페이지의 localityLbPolicy 설명을 참고하세요.

기본 제공 정책 사용

모든 클라이언트가 단일 기본 제공 정책을 사용하도록 하려면 localityLbPolicy 필드를 구성하여 이를 선택하면 됩니다.

이 필드를 구성할 때 다음 정책 중에서 선택할 수 있습니다.

  • LEAST_REQUEST(자바 클라이언트만 해당)
  • RING_HASH
  • ROUND_ROBIN

일부 클라이언트는 동일한 정책을 사용할 수 없는 경우 선호 정책 목록 정의를 참조하세요.

gcloud

  1. gcloud compute backend-services export 명령어를 사용하여 grpcwallet-wallet-v2-service 백엔드 서비스 구성 파일을 내보냅니다.

    gcloud compute backend-services export grpcwallet-wallet-v2-service \
    --destination=bs_config.yaml \
    --global
    
  2. 다음 줄을 포함하도록 내보낸 bs_config.yaml 파일을 업데이트합니다.

    localityLbPolicy:
     -- policy
        name: RING_HASH
    
  3. gcloud compute backend-services import 명령어를 사용하여 업데이트된 파일을 가져옵니다.

    gcloud compute backend-services import grpcwallet-wallet-v2-service --source=bs_config.yaml --global
    

커스텀 정책 사용

적절한 경우 gRPC로 만들고 배포한 커스텀 부하 분산 정책을 사용할 수 있습니다. 이 기능은 gRPC 버전 1.47 이상을 사용하는 Java 클라이언트에서 사용할 수 있습니다. 모든 gRPC 클라이언트가 포함된 메시에서만 사용하세요.

커스텀 정책을 만들 때 다음 문서가 도움이 될 수 있습니다.

  • 커스텀 정책을 보다 정교하게 만들려면 Open Request Cost Aggregation(ORCA) API를 사용하면 됩니다. 이 API를 사용하면 쿼리 비용과 서버 사용률에 대한 측정항목을 캡처할 수 있습니다. 이러한 API를 사용하려면 gRPC 버전 1.48.1 이상이 필요합니다. 자세한 내용은 gRPC ORCA 예시를 참고하세요.

  • 커스텀 부하 분산 구성이 xDS를 통해 gRPC에 전송되는 방식에 관한 자세한 내용은 gRPC xDS 커스텀 부하 분산기 구성을 참고하세요.

커스텀 정책을 사용하도록 Cloud Service Mesh를 구성하려면 localityLbPolicies 필드를 사용하여 정책을 식별합니다.

다음 단계에서 이 프로세스를 보여줍니다. 이 절차에서는 grpcwallet-wallet-v2-service 백엔드 서비스의 구성을 업데이트하여 여기에 연결되는 클라이언트가 example.ExampleLoadBalancer라는 커스텀 정책을 사용하도록 합니다.

gcloud

  1. gcloud compute backend-services export 명령어를 사용하여 grpcwallet-wallet-v2-service 백엔드 서비스 구성 파일을 내보냅니다.

    gcloud compute backend-services export grpcwallet-wallet-v2-service \
    --destination=bs_config.yaml \
    --global
    
  2. example.ExampleLoadBalancer 정책을 참조하도록 내보낸 bs_config.yaml 파일을 업데이트합니다. 다음 줄을 포함합니다.

    localityLbPolicies:
      - customPolicy:
          name: example.ExampleLoadBalancer
          data: '{ "message": "Hello load-balancing world!" }'
    
  3. gcloud compute backend-services import 명령어를 사용하여 업데이트된 파일을 가져옵니다.

    gcloud compute backend-services import grpcwallet-wallet-v2-service --source=bs_config.yaml --global
    
  4. 선택사항: 부하 분산 구성을 테스트합니다.

    자바

    cd ~/traffic-director-grpc-examples/java
    ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob
    

    커스텀 부하 분산 정책을 올바르게 구성한 경우 구성에 포함된 메시지('Hello load-balancing world!')가 표시됩니다.

선호 정책 목록 정의

클라이언트 중 일부가 단일 부하 분산 정책을 지원하지 않는 경우 클라이언트가 사용할 수 있는 정책 목록을 만듭니다. 이 옵션을 사용하면 특정 클라이언트에서 첫 번째 선호 정책을 사용할 수 없는 경우 gRPC가 목록의 다음 정책으로 되돌아갑니다.

선호 정책 목록을 만들 때 유효한 옵션으로 커스텀 정책 ROUND_ROBIN과 자바 클라이언트의 경우 LEAST_REQUEST가 포함됩니다. 정책은 최대 10개까지 나열할 수 있습니다.

이 기능은 gRPC 버전 1.47 이상을 사용하는 Java 클라이언트에서만 사용할 수 있습니다. 모든 gRPC 클라이언트가 포함된 메시에서만 사용하세요.

gcloud

  1. gcloud compute backend-services export 명령어를 사용하여 grpcwallet-wallet-v2-service 백엔드 서비스 구성 파일을 내보냅니다.
gcloud compute backend-services export grpcwallet-wallet-v2-service \
  --destination=bs_config.yaml \
  --global
  1. localityLbPolicies 필드를 포함하도록 내보낸 bs_config.yaml 파일을 업데이트합니다. 다음 정책을 나타내는 항목으로 채웁니다.

    • 잘못된 커스텀 정책(example.InvalidLoadBalancer)
    • 유효한 커스텀 정책(example.ExampleLoadBalancer)
    • 지원되는 기본 제공 정책(LEAST_REQUEST)
    localityLbPolicies:
      - customPolicy:
          name: example.InvalidLoadBalancer
          data: '{ "message": "This load-balancing policy doesn't work!" }'
      - customPolicy:
          name: example.ExampleLoadBalancer
          data: '{ "message": "Hello load-balancing world!" }'
      - policy:
          name: LEAST_REQUEST
    
  2. gcloud compute backend-services import 명령어를 사용하여 업데이트된 파일을 가져옵니다.

    gcloud compute backend-services import grpcwallet-wallet-v2-service --source=bs_config.yaml --global
    
  3. 선택사항: 부하 분산 구성을 테스트합니다.

    자바

    cd ~/traffic-director-grpc-examples/java
    ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob
    

    그에 따라 gRPC에서 example.InvalidLoadBalancer를 찾으려고 시도하지만 실패하게 됩니다. 그러면 example.ExampleLoadBalancer를 사용하도록 gRPC가 되돌아가며 구성에 포함된 메시지('Hello load-balancing world!')가 표시됩니다. 클라이언트의 gRPC 로깅에 example.InvalidLoadBalancer를 찾을 수 없다는 메시지가 포함됩니다.

리소스 삭제

리소스를 삭제하려면 로컬 시스템에서 다음 명령어를 실행합니다.

traffic-director-grpc-examples/scripts/cleanup.sh

서비스 간 트래픽 차단

서비스 A와 서비스 B 간의 트래픽을 차단하려고 하고 배포가 GKE에 있는 경우, 서비스 보안을 설정하고 승인 정책을 사용하여 서비스 간의 트래픽을 차단합니다. 전체 안내는 Cloud Service Mesh 서비스 보안Envoy프록시리스 gRPC를 사용한 설정 안내를 참조하세요.

다음 단계