[Google Cloud] Cloud Run 서비스 간 내부 통신하기 — Internal HTTP(S) Load Balancer 활용

Kiwon Lee
google-cloud-apac
Published in
15 min readApr 19, 2023

안녕하세요, 이기원 입니다.

Cloud Run 을 사용하면 서버리스로 컨테이너 기반 워크로드들을 쉽고 빠르게 실행할 수 있습니다.

특히, MSA(Micro Service Architecture)로 구성된 컨테이너 워크로드들을 Cloud Run 에 배포하는 경우, Cloud Run 서비스 간에 내부 통신이 필요한 경우가 있습니다. 예를 들자면 Cloud Run 서비스 A 에서 Cloud Run 서비스 B 를 호출하는 경우입니다.

이번 글에서는 최근에 Cloud Run 에서 지원하게 된 Internal HTTP(S) Load Balancer와 Cloud Run 을 조합하여 Cloud Run 서비스 간 내부 통신 하는 방법에 대해 알아 보겠습니다.

https://cloud.google.com/load-balancing/docs/release-notes#April_06_2023

참고로, 아래 블로그 글들을 먼저 보시면 Cloud Run 서비스 간의 다른 통신 방식에 대해서도 이해하실수 있습니다.

먼저 본 글에서 나오는 핵심 기술들에 대해 알아보겠습니다.

  • Internal HTTP(S) Load Balancer, Serverless NEG

Google Cloud 의 Internal HTTP(S) Load Balancer (이하, Internal HTTP(S) LB) 는 Layer 7 부하 분산기로 LB 에 할당된 내부 IP로 트래픽을 전달하면, 연동된 백엔드 서비스로 트래픽을 부하분산 하는 기능을 제공합니다.

Internal HTTP(S) Load Balancer의 자세한 내용을 다음에서 확인 가능합니다.

https://cloud.google.com/load-balancing/docs/l7-internal?hl=ko

Cloud Run 은 Serverless NEG(Network endpoint groups) 를 사용하여 Internal HTTP(S) Load balancer의 백엔드 서비스로 등록할 수 있습니다. 이렇게 구성하면 Internal HTTP(S) LB 로 들어오는 트래픽을 Cloud Run 으로 부하 분산 할 수 있고, Internal HTTP(S) LB 의 여러 기능(fault injection, header rewrites, redirects, traffic splitting 등) 들을 Cloud Run 서비스에 적용 할 수 있는 장점을 가지고 있습니다.

https://cloud.google.com/load-balancing/docs/negs/serverless-neg-concepts

https://cloud.google.com/load-balancing/docs/negs/serverless-neg-concepts#internal-https-load-balancer

Cloud Run 을 Internal HTTP(S) LB 와 함께 사용 하게 되면, Cloud Run 서비스의 URL 이 아닌 Internal HTTP(S) LB 에 할당되는 내부 IP 로 Cloud Run 서비스를 호출할 수 있어, Cloud Run 서비스간 내부 통신이 가능하고, Ingress 설정을 internal 로 하게 되면 내부 트래픽만 허용할 수 있도록 트래픽 접근 제한도 가능합니다.

https://cloud.google.com/run/docs/securing/ingress?hl=ko#settings

그리고, 이전 글에서 설명드렸듯이, Cloud Run 에서 VPC 네트워크로 내부 IP 를 통신하려면 Serverless VPC Access 가 필요했었죠., Serverless VPC Access 와 Internal HTTP(S) LB + Serverless NEG 를 활용하여 Cloud Run 서비스 간에 내부 통신이 가능합니다.

Serverless VPC Access 에 대한 자세한 내용은 지난 글에서 확인하실 수 있습니다.

이 방법을 Bookinfo 샘플 애플리케이션을 통해 확인 해 보겠습니다. Bookinfo는 MSA 구조로 여러 컨테이너들로 구성되어 있습니다. 사용자가 productpage 를 호출하면 내부에서 details 와 reviews 를 호출 한 후 응답값으로 페이지를 구성한 후 응답하는 구조입니다.

https://github.com/istio/istio/tree/master/samples/bookinfo

이 애플리케이션을 Cloud Run 에 배포해 보겠습니다.

  1. reviews 를 Cloud Run 서비스에 배포합니다. Ingress 옵션은 internal (내부 네트워크 요청만 허용, internal LB 포함) 로 설정합니다.
gcloud run deploy reviews \
--image=docker.io/istio/examples-bookinfo-reviews-v1:1.17.0 \
--allow-unauthenticated \
--ingress=internal \
--port=9080 \
--region=us-central1

2. details 를 Cloud Run 서비스에 배포합니다. Ingress 옵션은 internal (내부 네트워크 요청만 허용, internal LB 포함) 로 설정합니다.

gcloud run deploy details \
--image=docker.io/istio/examples-bookinfo-details-v1:1.17.0 \
--allow-unauthenticated \
--ingress=internal \
--port=9080 \
--region=us-central1

다음과 같이 Cloud Run(reviews), Cloud Run(details) 의 Ingress 설정을 Internal 로 설정하여, 내부 네트워크 에서만 접근 가능하도록 설정합니다. (Internal HTTP(S) LB 로 부터 Cloud Run 으로 들어가는 트래픽은 내부 트래픽으로 간주됩니다.)

Ingress 옵션 관련해서는 다음에서 추가 확인 가능합니다.

https://cloud.google.com/run/docs/securing/ingress?hl=ko#settings

3. Serverless VPC Access 와 Internal HTTP(S) LB 구성을 위해 VPC 네트워크와 Subnet 을 생성합니다.

https://cloud.google.com/vpc/docs/create-modify-vpc-networks?hl=ko#create-custom-network

gcloud compute networks create lb-network \
--subnet-mode=custom
gcloud compute networks subnets create lb-subnet \
--network=lb-network \
--range=10.1.2.0/24 \
--region=us-central1

4. Internal HTTP(S) LB 를 위해 3 에서 생성된 VPC 네트워크에 프록시 전용 서브넷을 생성합니다.

https://cloud.google.com/load-balancing/docs/l7-internal/setting-up-l7-internal-serverless#create-proxy-only-subnet

gcloud compute networks subnets create proxy-only-subnet \
--purpose=REGIONAL_MANAGED_PROXY \
--role=ACTIVE \
--region=us-central1 \
--network=lb-network \
--range=10.129.0.0/23

다음과 같이 VPC 네트워크에 서브넷과 프록시 전용 서브넷이 생성된 것을 확인 할 수 있습니다.

5. 생성한 Cloud Run(reviews)과 연동할 Internal HTTP(S) LB 를 생성합니다.

https://cloud.google.com/load-balancing/docs/l7-internal/setting-up-l7-internal-serverless

  • Cloud Console 에서 Network services — Load Balancing 페이지 이동
  • Create Load Balancer 생성
  • HTTP(S) Load Balancing 선택
  • Internal HTTP(S) LB 생성을 위해 “only between my VMs or serverless services” 선택
  • 다음과 같이 LB 를 위한 컴포넌트들을 생성합니다.
    — Internal HTTP(S) LB (reviews-lb) 생성
    — 백엔드 서비스 (reviews-backend) 생성
    — Serverless NEG (reviews-neg) 생성
  • Cloud Run(reviews)과 연결된 내부 IP 를 가진 Internal HTTP(S) LB 가 생성되었습니다.

6. Cloud Run(details) 를 위한 Internal HTTP(S) LB 를 위와 5번과 방법으로 생성합니다.

https://cloud.google.com/load-balancing/docs/l7-internal/setting-up-l7-internal-serverless

  • Cloud Run(details)과 연결된 내부 IP 를 가진 Internal HTTP(S) LB 가 생성되었습니다.

Internal HTTP(S) LB 를 생성해서 각 Cloud Run 서비스에 연동했기 때문에, 이제 Cloud Run(details) 와 Cloud Run(reviews)에 연결 할때는 Cloud Run 서비스의 URL 이 아닌 생성된 Internal HTTP(S) LB 의 내부 IP 를 통해 연결 할 수 있습니다.

7. 3 에서 생성한 VPC 네트워크(lb-network) 정보를 참조하여 Serverless VPC access 를 생성합니다. Serverless VPC access 를 통하면 VPC 네트워크의 Internal HTTP(S) LB 에 내부 IP 로 연결이 가능해 집니다.

https://cloud.google.com/vpc/docs/configure-serverless-vpc-access#gcloud

8 productpage 를 Cloud Run 서비스에 배포합니다.

  • Ingress 옵션은 All 로 설정 (productpage 는 외부에서 접근해야 하기 때문에 All 로 설정합니다.)
  • details 와 reviews 호출을 위한 접속정보를 환경변수로 전달
    — Cloud Run의 Environment variables 를 통해 Key = Value 로 등록
    5, 6 에서 생성한 Internal HTTP(S) LB 의 내부 IP 주소를 환경변수로 전달합니다.
  • Cloud Run(productpage) 에서 VPC 네트워크 내의 Internal HTTP(S) LB 의 내부 IP 접근하기 위해 7번에서 생성한 Serverless VPC Access 를 연동합니다.
    — Internal HTTP(S) LB 의 내부 IP 는 RFC 1918 범위이기 때문에, 기본값인 “Route only requests to private IPs through the VPC connector” 를 유지합니다.

https://cloud.google.com/run/docs/configuring/connecting-vpc?hl=ko#configuring

https://cloud.google.com/run/docs/configuring/connecting-vpc?hl=ko#manage

gcloud run deploy productpage \
--image=us-central1-docker.pkg.dev/kwlee-app-eco-sandbox/docker-repo/bookinfo-productpage-v1:1.17.0 \
--allow-unauthenticated \
--port=9080 \
--set-env-vars=\
DETAILS_HOSTNAME=10.1.2.5,\
DETAILS_SERVICE_PORT=80,\
REVIEWS_HOSTNAME=10.1.2.4,\
REVIEWS_SERVICE_PORT=80 \
--ingress=all \
--vpc-connector=projects/kwlee-app-eco-sandbox/locations/us-central1/connectors/bookinfo-vpc-connector \
--region=us-central1

다음과 같이 3개의 Cloud Run 서비스를 배포했고, details 와 reviews 는 내부 네트워크(Internal HTTP(S) LB 포함)로 부터의 요청만 허용되고, productpage는 인터넷으로 부터 들어오는 요청 포함하여 모든 요청이 허용됩니다.

배포된 워크로드의 정상 동작 확인을 위해 Cloud Run(productpage)서비스의 URL 을 확인합니다.

Cloud Run(productpage) 의 URL 로 접속해 보면, 아래와 같이 환경변수로 전달한 Cloud Run(details) 와 Cloud Run(reviews) 앞의 Internal HTTP(S) LB 내부 IP 주소가 정상적으로 확인됩니다.

Cloud Run(productpage) 서비스 URL 에 path 를 추가해서 접속해 보면 아래와 같이 정상적으로 Cloud Run(details) 와 Cloud Run(reviews) 의 값을 가져와서 노출되는 것을 볼 수 있습니다. 화면의 오른쪽 박스가 Cloud Run(details) 를 호출해서 받은 정보이고, 왼쪽 박스가 Cloud Run(reviews) 를 호출해서 받은 정보입니다

마지막으로, Ingress 설정이 internal 로 되어 있기 때문에, Cloud Run(details)을 인터넷 구간에서 직접 호출하면 다음과 같이 Error 결과를 확인할 수 있습니다.

이번 글에서는 Internal HTTP(S) Load Balancer와 Cloud Run 을 조합하여 Cloud Run 서비스 간 내부 통신 하는 방식에 대해 알아 보았습니다.

감사합니다.

Disclaimer: 본 글의 작성자는 Google 직원이지만 Google Cloud 를 공부하는 한 개인으로서 작성된 글입니다. 본 글의 내용, 입장은 Google 을 대변하지 않으며 Google 이 해당 콘텐츠를 보장하지 않습니다.

--

--