프록시리스 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
서비스는 Stats
및 Account
서비스를 호출하여 잔액을 계산합니다. Stats
서비스도 Account
서비스를 호출하여 사용자 정보를 가져옵니다.
이 예시에서는 구성된 규칙에 따라 Wallet
및 Stats
구현의 두 가지 버전을 배포하여 요청 라우팅을 보여줍니다. 여러 서비스 버전의 빌드와 배포를 시뮬레이션하도록 서버 플래그를 사용하여 한 번만 빌드하는 바이너리의 동작을 변경합니다.
--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"} 헤더 삽입 |
로컬 환경 준비
이 예시에 로컬 환경을 설정하려면 다음 명령어를 실행합니다.
최신 버전을 사용하도록
gcloud
바이너리를 업데이트합니다.gcloud components update
예시 저장소를 다운로드합니다.
sudo apt-get install git -y
예를 들어 올바른 저장소를 클론합니다.
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
Cloud Router 인스턴스를 만듭니다.
gcloud compute routers create nat-router-us-central1 \ --network=default \ --region=us-central1
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
상태 확인을 만듭니다.
gcloud compute health-checks create grpc grpcwallet-health-check \ --use-serving-port
상태 확인의 방화벽 규칙을 만듭니다.
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
백엔드 서비스를 만든 후 상태 확인을 새 백엔드 서비스에 연결합니다.
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
관리형 인스턴스 그룹을 백엔드로 추가합니다.
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
클라이언트를 실행할 클라이언트 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')
SSH를 사용하여 VM에 액세스하고 다음 명령어를 실행하여 VM을 준비합니다.
export EXAMPLES_VERSION=v1.1.x sudo apt-get update sudo apt-get install git -y
다음 명령어를 실행합니다.
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 인스턴스를 표시합니다.
자바
gRPC 자바 클라이언트에서 서비스를 확인하려면 다음을 실행합니다.
sudo apt-get install -y openjdk-11-jdk-headless
다음 명령어를 실행합니다.
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
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
다음 명령어를 실행합니다.
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++
gRPC C++ 클라이언트에서 서비스를 확인하려면 다음을 실행합니다.
sudo apt-get install -y build-essential
다음 명령어를 실행합니다.
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
작업을 실행하면 두 번째 인스턴스에서 오류가 표시됩니다.
자바
다음 명령어를 실행합니다.
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
출력은 다음과 같이 표시됩니다.
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}
kill
명령어를 실행합니다.kill %%
Go
다음 명령어를 실행합니다.
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
출력은 다음과 같이 표시됩니다.
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
kill
명령어를 실행합니다.kill %%
C++
다음 명령어를 실행합니다.
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
출력은 다음과 같이 표시됩니다.
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
kill
명령어를 실행합니다.kill %%
결함 주입
결함 주입은 높은 지연 시간, 서비스 과부하, 서비스 장애, 네트워크 파티션 나누기 등의 장애를 시뮬레이션하는 요청을 제공할 때 의도적으로 오류를 발생시킬 수 있습니다. 이 기능은 장애를 시뮬레이션하면서 서비스의 복원력을 테스트하는 데 유용합니다.
이전에 URL 맵을 만든 경우 route=fault
헤더를 사용하여 wallet.grpcwallet.io
에 전송된 RPC의 50%를 실패하도록 결함 주입 정책을 설정합니다.
결함 주입을 표시하기 위해 다음 언어의 코드를 사용합니다.
자바
다음 명령어를 실행합니다.
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
출력은 다음과 같이 표시됩니다.
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
다음 명령어를 실행합니다.
cd ~/traffic-director-grpc-examples/go/wallet_client ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch --user=Bob --route=fault
출력은 다음과 같이 표시됩니다.
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++
다음 명령어를 실행합니다.
cd ~/traffic-director-grpc-examples/cpp ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --unary_watch=true --user=Bob --route=fault
출력은 다음과 같이 표시됩니다.
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
이를 처리할 수 있는 백엔드 서비스가 없고, 애플리케이션에 마감 시간이 설정되지 않기 때문에 다음 명령어가 계속 막힌 상태로 유지됩니다.
자바
다음 명령어를 실행합니다.
cd ~/traffic-director-grpc-examples/java ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob
명령어가 응답하지 않습니다. ^C를 눌러 명령어를 중단합니다.
Go
다음 명령어를 실행합니다.
cd ~/traffic-director-grpc-examples/go/wallet_client ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch --user=Bob
명령어가 응답하지 않습니다. ^C를 눌러 명령어를 중단합니다.
C++
다음 명령어를 실행합니다.
cd ~/traffic-director-grpc-examples/cpp ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob
명령어가 응답하지 않습니다. ^C를 눌러 명령어를 중단합니다.
하지만 timeout
경로를 사용하는 다음 명령어는 maxStreamDuration
설정으로 인해 5초 후에 실패합니다.
자바
다음 명령어를 실행합니다.
cd ~/traffic-director-grpc-examples/java ./build/install/wallet/bin/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob --route=timeout
출력은 다음과 같이 표시됩니다.
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
다음 명령어를 실행합니다.
cd ~/traffic-director-grpc-examples/go/wallet_client ./wallet_client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch --user=Bob --route=timeout
출력은 다음과 같이 표시됩니다.
failed to create stream: rpc error: code = DeadlineExceeded desc = context deadline exceeded.
C++
다음 명령어를 실행합니다.
cd ~/traffic-director-grpc-examples/cpp ../bazel-bin/cpp/client balance --wallet_server="xds:///wallet.grpcwallet.io" --watch=true --user=Bob --route=timeout
출력은 다음과 같이 표시됩니다.
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
스크립트에서 localityLbPolicy
가 ROUND_ROBIN
으로 설정되었습니다. 이 예시에서는 다음 구성을 적용하여 localityLbPolicy
를 RING_HASH
로 변경합니다.
sessionAffinity: HEADER_FIELD localityLbPolicy: RING_HASH consistentHash: httpHeaderName: "session_id"
gcloud
백엔드 서비스
grpcwallet-wallet-v1-affinity-service
의 구성을 저장합니다.gcloud compute backend-services export grpcwallet-wallet-v1-affinity-service \ --destination=bs_config.yaml \ --global
백엔드 서비스
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
gcloud compute backend-services export
명령어를 사용하여grpcwallet-wallet-v2-service
백엔드 서비스 구성 파일을 내보냅니다.gcloud compute backend-services export grpcwallet-wallet-v2-service \ --destination=bs_config.yaml \ --global
bs_config.yaml
파일에서 이상점 감지 필드를 포함하도록grpcwallet-wallet-v2-service
구성을 업데이트합니다.outlierDetection: interval: seconds: 1 nanos: 0 baseEjectionTime: seconds: 30 nanos: 0 successRateStdevFactor: 1000
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 |
위의 옵션을 원하는 대로 조합하여 사용할 수 있습니다. 하지만 localityLbPolicy
와 localityLbPolicies
를 모두 구성하면 gRPC에서 먼저 localityLbPolicies
구성을 사용하려고 시도합니다.
지역 부하 분산을 구성하지 않으면 Cloud Service Mesh에서 ROUND_ROBIN
정책을 사용합니다.
ROUND_ROBIN
및 기타 기본 제공 정책에 관한 자세한 내용은 backendServices
페이지의 localityLbPolicy
설명을 참고하세요.
기본 제공 정책 사용
모든 클라이언트가 단일 기본 제공 정책을 사용하도록 하려면 localityLbPolicy
필드를 구성하여 이를 선택하면 됩니다.
이 필드를 구성할 때 다음 정책 중에서 선택할 수 있습니다.
LEAST_REQUEST
(자바 클라이언트만 해당)RING_HASH
ROUND_ROBIN
일부 클라이언트는 동일한 정책을 사용할 수 없는 경우 선호 정책 목록 정의를 참조하세요.
gcloud
gcloud compute backend-services export
명령어를 사용하여grpcwallet-wallet-v2-service
백엔드 서비스 구성 파일을 내보냅니다.gcloud compute backend-services export grpcwallet-wallet-v2-service \ --destination=bs_config.yaml \ --global
다음 줄을 포함하도록 내보낸
bs_config.yaml
파일을 업데이트합니다.localityLbPolicy: -- policy name: RING_HASH
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
gcloud compute backend-services export
명령어를 사용하여grpcwallet-wallet-v2-service
백엔드 서비스 구성 파일을 내보냅니다.gcloud compute backend-services export grpcwallet-wallet-v2-service \ --destination=bs_config.yaml \ --global
example.ExampleLoadBalancer
정책을 참조하도록 내보낸bs_config.yaml
파일을 업데이트합니다. 다음 줄을 포함합니다.localityLbPolicies: - customPolicy: name: example.ExampleLoadBalancer data: '{ "message": "Hello load-balancing world!" }'
gcloud compute backend-services import 명령어를 사용하여 업데이트된 파일을 가져옵니다.
gcloud compute backend-services import grpcwallet-wallet-v2-service --source=bs_config.yaml --global
선택사항: 부하 분산 구성을 테스트합니다.
자바
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
gcloud compute backend-services export
명령어를 사용하여grpcwallet-wallet-v2-service
백엔드 서비스 구성 파일을 내보냅니다.
gcloud compute backend-services export grpcwallet-wallet-v2-service \ --destination=bs_config.yaml \ --global
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
- 잘못된 커스텀 정책(
gcloud compute backend-services import 명령어를 사용하여 업데이트된 파일을 가져옵니다.
gcloud compute backend-services import grpcwallet-wallet-v2-service --source=bs_config.yaml --global
선택사항: 부하 분산 구성을 테스트합니다.
자바
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를 사용한 설정 안내를 참조하세요.
다음 단계
- Cloud Service Mesh 구성 문제를 해결하려면 프록시리스 gRPC를 사용하는 배포 문제 해결을 참고하세요.