Cloud Run용 Cloud Service Mesh 구성

이 페이지에서는 Cloud Run 서비스의 다양한 컴퓨팅 인프라에서 실행되도록 Cloud Service Mesh를 구성하는 방법을 보여줍니다.

Cloud Service Mesh를 사용하면 가중치가 적용된 트래픽 분할 및 전역 부하 분산과 같은 메시 고급 트래픽 관리 기능을 설정할 수 있으며 하나의 Cloud Run 서비스에서 다른 서비스로의 트래픽에 대한 관측 가능성 및 보안 정책도 사용 설정할 수 있습니다. 또한 자체 서비스 메시 사이드카를 유지보수하는 운영 부담을 없애주는 완전 관리형 데이터 영역 솔루션도 제공합니다.

시작하기 전에

  1. Cloud Service Mesh를 숙지합니다.

  2. 프로젝트를 설정합니다.

    gcloud config set core/project PROJECT_ID
  3. Google Cloud 콘솔에서 프로젝트에 다음 API를 사용 설정합니다.

  4. gcloud 구성요소를 최신 버전(488.0.0 이상)으로 업데이트합니다.

    gcloud components update

필요한 역할

Cloud Run 서비스를 구성하고 배포하는 데 필요한 권한을 얻으려면 관리자에게 다음 IAM 역할을 부여해 달라고 요청하세요.

Cloud Run 클라이언트의 서비스 계정에는 다음 역할도 포함되어야 합니다.

Cloud Run과 연결된 IAM 역할 및 권한 목록은 Cloud Run IAM 역할Cloud Run IAM 권한을 참조하세요. Cloud Run 서비스가 Cloud 클라이언트 라이브러리와 같은 Google Cloud API와 상호작용하는 경우에는 서비스 ID 구성 가이드를 참조하세요. 역할 부여에 대한 자세한 내용은 배포 권한액세스 관리를 참조하세요.

Cloud Service Mesh를 사용하여 Cloud Run 서비스 간 호출

Cloud Run은 Cloud Service Mesh 서비스 라우팅 API를 사용합니다. 이러한 API를 사용하면 Cloud Run 서비스가 제공된 run.app URL 대신 맞춤설정된 URL을 사용하여 다른 Cloud Run 서비스를 호출할 수 있습니다. 또한 Cloud Run은 대상 Cloud Run 서비스에 자동으로 인증하므로 요청 사용자 인증 정보를 다른 Cloud Run 서비스에 연결하기 위해 자체 인증을 구성할 필요가 없습니다.

Cloud Service Mesh를 사용하여 한 Cloud Run 서비스에서 다른 Cloud Run 서비스를 호출하려면 다음 단계를 따르세요.

  1. Cloud Service Mesh 설정
  2. Cloud DNS 설정
  3. 대상 Cloud Run 서비스 만들기
  4. 서버리스 NEG 만들기
  5. 클라이언트 Cloud Run 서비스 만들기
  6. 메시 클라이언트에서 서비스 호출

Cloud Service Mesh 설정

  1. 기본 URL을 사용하여 서비스 경로를 만들려면 Mesh 사양을 mesh.yaml 파일에 저장합니다.

    name: MESH_NAME

    MESH_NAME메시 리소스 이름으로 바꿉니다.

  2. 다음 명령어를 실행하여 사양에서 Mesh 리소스를 가져옵니다.

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

    MESH_NAME메시 리소스 이름으로 바꿉니다.

Cloud DNS 설정

비공개 IP 주소만 캡처되기 때문에 전체 run.app URL 주소가 있는 Private Service Connect 엔드포인트를 호스트 이름으로 사용하는 경우 Cloud DNS 설정을 건너뛰고 다음 섹션으로 이동할 수 있습니다.

메시 클라이언트가 대상 서비스를 호출할 때 요청에 사용된 호스트 이름은 DNS를 통해 확인할 수 있어야 합니다. 사이드카는 이러한 IP 주소 범위에 대한 모든 IP 트래픽을 캡처하고 적절하게 리디렉션하므로 유효한 RFC 1918 IP 주소는 모두 허용됩니다.

다음 예시에서는 Cloud DNS 영역에서 단일 IP 주소로 확인되는 와일드 카드 * 항목을 만드는 방법을 보여줍니다. 배타적인 Cloud DNS 영역을 사용하지 않으려면 원하는 Cloud Run 서비스에 해당하는 모든 호스트 이름에 대해 Cloud DNS 항목을 만듭니다.

  • 배타적 영역에서 Cloud DNS 레코드를 만들려면 다음 명령어를 실행합니다.

    1. 서비스 메시를 위해 Cloud DNS에서 비공개 관리형 DNS 영역을 만듭니다.

      gcloud dns managed-zones create MESH_NAME \
      --description="Domain for DOMAIN_NAME service mesh routes" \
      --dns-name=DOMAIN_NAME. \
      --networks=VPC_NETWORK_NAME \
      --visibility=private
    2. 새로 만든 비공개 관리 영역 내에 DNS 레코드를 만듭니다. IP 주소 10.0.0.1이 사용되지 않았는지 확인합니다.

      gcloud dns record-sets create "*.DOMAIN_NAME." \
      --type=A \
      --zone="MESH_NAME" \
      --rrdatas=10.0.0.1 \
      --ttl=3600

      다음을 바꿉니다.

      • DOMAIN_NAME: DNS 도메인 이름입니다.
      • MESH_NAME: 메시 리소스 이름입니다.
      • VPC_NETWORK_NAME: VPC 네트워크의 이름입니다(예: 'default').

Cloud Service Mesh로 내부 서비스에 액세스

Cloud Run을 사용하면 수신 네트워크 트래픽을 '내부'로 제한할 수 있습니다. 서비스에 이 인그레스 제한이 사용 설정된 경우 Cloud Run에 대한 액세스 경로를 사용 설정하면 메시에서 가상 프라이빗 클라우드(VPC) 네트워크를 통해 전송되는 트래픽을 '내부'로 설정할 수 있습니다.

Cloud Service Mesh로 내부 서비스에 액세스하려면 다음 방법 중 하나를 사용하세요.

대상 Cloud Run 서비스 만들기

Cloud Run 대상은 기본 URL을 사용 중지할 수 없습니다.

  1. 신규 또는 기존 Cloud Run 서비스를 배포합니다.

    gcloud run deploy DESTINATION_SERVICE_NAME \
    --no-allow-unauthenticated \
    --region=REGION \
    --image=IMAGE_URL 

    다음을 바꿉니다.

    • DESTINATION_SERVICE_NAME: 대상 Cloud Run 서비스의 이름입니다.
    • REGION: 리전의 이름입니다.
    • IMAGE_URL: 컨테이너 이미지에 대한 참조(예: us-docker.pkg.dev/cloudrun/container/hello:latest)입니다.

서버리스 네트워크 엔드포인트 그룹(NEG) 만들기

  1. 다음 명령어를 실행하여 대상 NEG를 만듭니다.

    gcloud compute network-endpoint-groups create DESTINATION_SERVICE_NAME-neg \
    --region=REGION \
    --network-endpoint-type=serverless \
    --cloud-run-service=DESTINATION_SERVICE_NAME

    다음을 바꿉니다.

    • REGION: 리전의 이름입니다.
    • DESTINATION_SERVICE_NAME: 대상 Cloud Run 서비스의 이름입니다.
  2. 서버리스 NEG를 참조하는 내부 자체 관리형 백엔드 서비스를 만듭니다.

    1. 백엔드 서비스를 만듭니다.

      gcloud compute backend-services create DESTINATION_SERVICE_NAME-REGION \
      --global \
      --load-balancing-scheme=INTERNAL_SELF_MANAGED

      DESTINATION_SERVICE_NAME을 대상 서비스 이름으로 바꾸고 REGION을 리전 이름으로 바꿉니다.

    2. 백엔드 서비스에 서버리스 백엔드를 추가합니다.

      gcloud compute backend-services add-backend DESTINATION_SERVICE_NAME-REGION \
      --global \
      --network-endpoint-group=DESTINATION_SERVICE_NAME-neg \
      --network-endpoint-group-region=REGION

      DESTINATION_SERVICE_NAME을 대상 서비스 이름으로 바꾸고 REGION을 리전 이름으로 바꿉니다.

  3. 백엔드 서비스를 참조하는 HTTP 경로를 만듭니다.

    Mesh 리소스 및 서비스가 구성됩니다. 호스트 이름을 백엔드 서비스에 연결하는 HTTPRoute 리소스로 연결합니다.

    1. HTTPRoute 사양을 만들고 http_route.yaml 파일에 저장합니다.

      name: "DESTINATION_SERVICE_NAME-route"
      hostnames:
      - "DESTINATION_SERVICE_NAME.DOMAIN_NAME"
      meshes:
      - "projects/PROJECT_ID/locations/global/meshes/MESH_NAME"
      rules:
      - action:
         destinations:
         - serviceName: "projects/PROJECT_ID/locations/global/backendServices/DESTINATION_SERVICE_NAME-REGION"
      

      호스트 이름을 서비스 주소를 지정하는 데 사용할 이름으로 설정합니다. 동일한 서비스 메시 내의 모든 클라이언트는 호출자의 리전 및 프로젝트와 관계없이 http://<HOSTNAME> URL을 사용하여 이 서비스를 호출할 수 있습니다. 비공개 IP 주소를 사용하도록 Cloud DNS를 설정한 경우 경로 호스트 이름은 전체 run.app URL 주소일 수도 있습니다. 이 경우 Cloud DNS 설정 단계를 건너뛸 수 있습니다.

      다음을 바꿉니다.

      • DESTINATION_SERVICE_NAME: 대상 Cloud Run 서비스의 이름입니다.
      • DOMAIN_NAME: DNS 도메인 이름입니다.
      • PROJECT_ID: 프로젝트 ID입니다.
      • MESH_NAME: 메시의 이름입니다.
      • REGION: 리전의 이름입니다.
    2. http_route.yaml 파일의 사양을 사용하여 HTTPRoute 리소스를 만듭니다.

      gcloud network-services http-routes import DESTINATION_SERVICE_NAME-route \
      --source=http_route.yaml \
      --location=global
      
    3. 다음 명령어를 실행하여 Cloud Run 대상 서비스에 Cloud Run 호출자 역할(roles/iam.invoker)을 부여합니다.

      gcloud run services add-iam-policy-binding DESTINATION_SERVICE_NAME \
      --region REGION \
      --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
      --role=roles/run.invoker

      다음을 바꿉니다.

      • DESTINATION_SERVICE_NAME: 대상 Cloud Run 서비스의 이름입니다.
      • REGION: 리전의 이름입니다.
      • PROJECT_NUMBER: 프로젝트의 번호입니다.

클라이언트 Cloud Run 서비스 만들기

클라이언트 Cloud Run 서비스를 만들면 QPS 및 총 구성 크기와 관련된 리소스가 포함된 Envoy 사이드카가 생성됩니다. 대부분의 경우 CPU 사용량은 vCPU의 1% 미만이고 메모리 사용량은 50MB 미만입니다.

가상 프라이빗 클라우드(VPC) 네트워크에 대한 네트워크 이그레스 액세스 권한이 있어야 합니다.

  • 테스트용 클라이언트 서비스를 만들려면 Cloud Run에 fortio 앱을 배포하여 트래픽을 HTTP 경로로 전달하도록 허용합니다.

    gcloud beta run deploy CLIENT_SERVICE_NAME \
    --region=REGION \
    --image=fortio/fortio \
    --network=VPC_NETWORK_NAME \
    --subnet=SUBNET_NAME \
    --mesh="projects/PROJECT_ID/locations/global/meshes/MESH_NAME"

    다음을 바꿉니다.

    • CLIENT_SERVICE_NAME: 클라이언트 Cloud Run 서비스의 이름입니다.
    • REGION: 리전 이름입니다.
    • VPC_NETWORK_NAME: VPC 네트워크의 이름입니다(예: 'default').
    • SUBNET_NAME: 서브넷의 이름입니다(예: 'default').
    • PROJECT_ID: 프로젝트의 ID입니다.
    • MESH_NAME: 메시 리소스 이름입니다.

메시 클라이언트에서 서비스 호출

이전 클라이언트 서비스 만들기 섹션의 fortio 테스트 앱을 사용하여 요청을 대상 경로로 전달하려면 다음 단계를 따르세요.

  1. 다음 명령어를 실행하여 만든 Cloud Run 클라이언트 서비스의 URL을 가져옵니다.

    TEST_SERVICE_URL=$(gcloud run services describe CLIENT_SERVICE_NAME \
    --region=REGION --format="value(status.url)" \
    --project=PROJECT_ID)

    다음을 바꿉니다.

    • CLIENT_SERVICE_NAME: 클라이언트 Cloud Run 서비스의 이름입니다.
    • REGION: 리전 이름입니다.
    • PROJECT_ID: 프로젝트의 ID입니다.
  2. curl 명령어를 사용하여 이전 단계의 fortio 엔드포인트의 대상 경로에 요청을 전송합니다.

    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" "$TEST_SERVICE_URL/fortio/fetch/DESTINATION_SERVICE_NAME.DOMAIN_NAME"

    다음을 바꿉니다.

    • DESTINATION_SERVICE_NAME: 대상 Cloud Run 서비스의 이름입니다.
    • DOMAIN_NAME: DNS 도메인 이름입니다.

Cloud Run에서 Compute Engine 백엔드 호출

관리형 인스턴스 그룹을 백엔드로 사용하여 Compute Engine 및 Cloud Service Mesh 서비스 경로를 배포하려면 Cloud Service Mesh에서 Compute Engine 기반 HTTP 서버를 구성하세요. 그러면 Cloud Run 클라이언트가 이 백엔드 서비스 경로를 사용하여 Compute Engine 인스턴스에 직접 요청을 보낼 수 있습니다.

다음 단계