수동 Envoy 배포를 사용하여 VM 설정

이 문서는 Cloud Service Mesh를 수동으로 설정하려는 네트워크 관리자를 대상으로 합니다. 수동 프로세스는 부하 분산 API로 Cloud Service Mesh를 설정하는 고급 사용자에게만 의도된 레거시 메커니즘입니다.

이전의 부하 분산 API 대신 서비스 라우팅 API를 사용하여 Cloud Service Mesh를 설정하는 것이 좋습니다. 부하 분산 API를 사용해야 하는 경우 이 페이지에 설명된 수동 프로세스 대신 자동화된 Envoy 배포를 사용하는 것이 좋습니다.

이 가이드의 안내를 따르기 전에 Envoy 및 프록시리스 워크로드로 서비스 라우팅 API 설정 준비에 설명된 필수 작업을 완료하세요.

이 가이드에서는 Compute Engine 가상 머신(VM)과 함께 Envoy 사이드카 프록시로 구성된 데이터 영역을 수동으로 배포하고 Cloud Service Mesh를 사용하여 구성하고 설정이 올바르게 작동하는지 확인하는 방법을 설명합니다. 이 프로세스에는 다음이 포함됩니다.

  1. 테스트 서비스 만들기
  2. Envoy 프록시를 사용하여 Compute Engine에 간단한 데이터 영역 배포
  3. Cloud Service Mesh가 Envoy 사이드카 프록시를 구성할 수 있도록 Compute Engine API를 사용하여 Cloud Service Mesh 설정
  4. Envoy 프록시를 실행하는 VM에 로그인하고 Envoy 프록시를 통해 부하 분산된 백엔드로 요청 전송

이 문서의 구성 예시는 데모용입니다. 프로덕션 환경의 경우 환경 및 요구사항에 따라 추가 구성요소를 배포해야 할 수 있습니다.

구성 프로세스 개요

이 섹션에서는 Compute Engine VM에서 실행되는 서비스의 수동 구성 프로세스를 제공합니다. 클라이언트 VM의 구성 프로세스는 사이드카 프록시 설정 및 Compute Engine VM 호스트의 트래픽 가로채기로 구성됩니다. 그런 다음 Google Cloud 부하 분산 API를 사용하여 부하 분산을 구성합니다.

이 섹션에서는 Google에서 관리하지 않는 타사 소스에서 Envoy 프록시를 가져오고 삽입하는 방법에 대한 정보를 제공합니다.

애플리케이션이 Cloud Service Mesh에 구성된 서비스로 트래픽을 전송하면 트래픽 가로채기를 당하고 xDS API 호환 사이드카 프록시로 리디렉션된 다음 Google Cloud 부하 분산 구성요소의 구성에 따라 백엔드로 부하가 분산됩니다. 호스트 네트워킹 및 트래픽 가로채기에 대한 자세한 내용은 Cloud Service Mesh의 사이드카 프록시 트래픽 가로채기를 참조하세요.

Cloud Service Mesh 서비스에 액세스해야 하는 각 VM 호스트에 대해 다음 단계를 수행합니다.

  1. VM에 서비스 계정을 할당합니다.

  2. Google Cloud APIs에 대한 전체 액세스를 허용하도록 VM의 API 액세스 범위를 설정합니다.

    • VM을 만들 때 ID 및 API 액세스에서 모든 Cloud APIs에 대한 전체 액세스 허용을 클릭합니다.

      VM 인스턴스 페이지로 이동

    • gcloud CLI를 사용하여 다음을 지정합니다.

      --scopes=https://www.googleapis.com/auth/cloud-platform.

  3. 사이드카 프록시가 gRPC를 통해 Cloud Service Mesh 컨트롤 플레인에 연결될 수 있도록 VM에서 trafficdirector.googleapis.com(TCP, 포트 443)으로 나가는 연결을 허용합니다. 포트 443에 대한 발신 연결은 기본으로 사용 설정됩니다.

  4. xDS 서버로 trafficdirector.googleapis.com:443를 가리키는 부트스트랩 구성으로 xDS API 호환 사이드카 프록시(예시: Envoy)를 배포합니다. 샘플 부트스트랩 구성 파일을 가져오려면 압축 fil traffic-director-xdsv3.tar.gz를 열고 bootstrap_template.yaml 파일을 필요에 맞게 수정합니다.

  5. 서비스로 향하는 IP 트래픽을 사이드카 프록시 가로채기 리스너 포트로 리디렉션합니다.

Hello World 테스트 서비스 만들기

이 섹션에서는 클라이언트에서 요청한 VM의 호스트 이름을 반환하는 간단한 테스트 서비스를 만드는 방법을 보여줍니다. 테스트 서비스는 복잡하지 않습니다. Compute Engine 관리형 인스턴스 그룹 전체에 배포되는 웹 서버입니다.

인스턴스 템플릿 만들기

만든 인스턴스 템플릿은 startup-script 매개변수를 사용하여 샘플 apache2 웹 서버를 구성합니다.

콘솔

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

    인스턴스 템플릿으로 이동

  2. 인스턴스 템플릿 만들기를 클릭합니다.
  3. 필드에 다음 정보를 입력합니다.
    • 이름: td-demo-hello-world-template
    • 부팅 디스크: Debian GNU/Linux 10(버스터)
    • 서비스 계정: Compute Engine 기본 서비스 계정
    • 액세스 범위: 모든 Cloud API에 대한 전체 액세스 허용
  4. 관리, 보안, 디스크, 네트워킹, 단독 임대를 클릭합니다.
  5. 네트워킹 탭의 네트워크 태그 필드에 td-http-server 태그를 추가합니다.
  6. 관리 탭에서 시작 스크립트 필드에 다음 스크립트를 복사합니다.

    #! /bin/bash
    sudo apt-get update -y
    sudo apt-get install apache2 -y
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>'`/bin/hostname`'</h1></body></html>' | sudo tee /var/www/html/index.html
    
  7. 만들기를 클릭합니다.

gcloud

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

gcloud compute instance-templates create td-demo-hello-world-template \
  --machine-type=n1-standard-1 \
  --boot-disk-size=20GB \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --scopes=https://www.googleapis.com/auth/cloud-platform \
  --tags=td-http-server \
  --metadata=startup-script="#! /bin/bash
sudo apt-get update -y
sudo apt-get install apache2 -y
sudo service apache2 restart
sudo mkdir -p /var/www/html/
echo '<!doctype html><html><body><h1>'`/bin/hostname`'</h1></body></html>' | sudo tee /var/www/html/index.html"

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

이 섹션에서는 관리형 인스턴스 그룹에 항상 테스트 서비스의 인스턴스 두 개가 있도록 지정합니다. 이는 데모용입니다. Cloud Service Mesh는 자동 확장되는 관리형 인스턴스 그룹을 지원합니다.

콘솔

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

    인스턴스 그룹으로 이동

  2. 인스턴스 그룹 만들기를 클릭합니다.
  3. 새 관리형 인스턴스 그룹(스테이트리스(Stateless))을 선택합니다. 자세한 내용은 스테이트리스(Stateless) 또는 스테이트풀(Stateful) MIG를 참조하세요.
  4. 관리형 인스턴스 그룹의 이름으로 td-demo-hello-world-mig를 입력하고 us-central1-a 영역을 선택합니다.
  5. 인스턴스 템플릿에서 사용자가 만든 인스턴스 템플릿인 td-demo-hello-world-template을 선택합니다.
  6. 자동 확장 모드에서 자동 확장 안함을 선택합니다.
  7. 인스턴스 수에서 그룹에 만들려는 인스턴스의 수로 두 개 이상을 지정합니다.
  8. 만들기를 클릭합니다.

gcloud

gcloud CLI를 사용하여 이전에 만든 인스턴스 템플릿으로 관리형 인스턴스 그룹을 만듭니다.

gcloud compute instance-groups managed create td-demo-hello-world-mig \
  --zone us-central1-a \
  --size=2 \
  --template=td-demo-hello-world-template

Envoy가 배포된 인스턴스 템플릿 및 관리형 인스턴스 그룹 만들기

이 섹션의 안내에 따라 Cloud Service Mesh의 인스턴스 템플릿 및 관리형 인스턴스 그룹을 수동으로 만듭니다. 관리형 인스턴스 그룹은 자동 확장을 사용하여 새 백엔드 VM을 만듭니다.

이 예시에서는 다음을 수행하는 방법을 보여줍니다.

  • 전체 Envoy 구성 및 HTTP 프로토콜을 사용해 호스트 이름을 제공하는 샘플 서비스가 포함된 VM 템플릿을 만듭니다.
  • 이 템플릿을 사용하여 관리형 인스턴스 그룹을 구성합니다.

인스턴스 템플릿 만들기

먼저 Compute Engine VM 인스턴스 템플릿을 만듭니다. 이 템플릿은 startup-script 매개변수를 통해 Envoy 사이드카 프록시 및 샘플 apache2 웹 서비스를 자동으로 구성합니다.

콘솔

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

    인스턴스 템플릿으로 이동

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

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

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

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

    #! /usr/bin/env bash
    
    # Set variables
    export ENVOY_USER="envoy"
    export ENVOY_USER_UID="1337"
    export ENVOY_USER_GID="1337"
    export ENVOY_USER_HOME="/opt/envoy"
    export ENVOY_CONFIG="${ENVOY_USER_HOME}/config.yaml"
    export ENVOY_PORT="15001"
    export ENVOY_ADMIN_PORT="15000"
    export ENVOY_TRACING_ENABLED="false"
    export ENVOY_XDS_SERVER_CERT="/etc/ssl/certs/ca-certificates.crt"
    export ENVOY_ACCESS_LOG="/dev/stdout"
    export ENVOY_NODE_ID="$(cat /proc/sys/kernel/random/uuid)~$(hostname -i)"
    export BOOTSTRAP_TEMPLATE="${ENVOY_USER_HOME}/bootstrap_template.yaml"
    export GCE_METADATA_SERVER="169.254.169.254/32"
    export INTERCEPTED_CIDRS="*"
    export GCP_PROJECT_NUMBER=PROJECT_NUMBER
    export VPC_NETWORK_NAME=NETWORK_NAME
    export GCE_ZONE=$(curl -sS -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/zone | cut -d"/" -f4)
    
    # Create system user account for Envoy binary
    sudo groupadd ${ENVOY_USER} \
     --gid=${ENVOY_USER_GID} \
     --system
    sudo adduser ${ENVOY_USER} \
     --uid=${ENVOY_USER_UID} \
     --gid=${ENVOY_USER_GID} \
     --home=${ENVOY_USER_HOME} \
     --disabled-login \
     --system
    
    # Download and extract the Cloud Service Mesh tar.gz file
    cd ${ENVOY_USER_HOME}
    sudo curl -sL https://storage.googleapis.com/traffic-director/traffic-director-xdsv3.tar.gz -o traffic-director-xdsv3.tar.gz
    sudo tar -xvzf traffic-director-xdsv3.tar.gz traffic-director-xdsv3/bootstrap_template.yaml \
     -C bootstrap_template.yaml \
     --strip-components 1
    sudo tar -xvzf traffic-director-xdsv3.tar.gz traffic-director-xdsv3/iptables.sh \
     -C iptables.sh \
     --strip-components 1
    sudo rm traffic-director-xdsv3.tar.gz
    
    # Generate Envoy bootstrap configuration
    cat "${BOOTSTRAP_TEMPLATE}" \
     | sed -e "s|ENVOY_NODE_ID|${ENVOY_NODE_ID}|g" \
     | sed -e "s|ENVOY_ZONE|${GCE_ZONE}|g" \
     | sed -e "s|VPC_NETWORK_NAME|${VPC_NETWORK_NAME}|g" \
     | sed -e "s|CONFIG_PROJECT_NUMBER|${GCP_PROJECT_NUMBER}|g" \
     | sed -e "s|ENVOY_PORT|${ENVOY_PORT}|g" \
     | sed -e "s|ENVOY_ADMIN_PORT|${ENVOY_ADMIN_PORT}|g" \
     | sed -e "s|XDS_SERVER_CERT|${ENVOY_XDS_SERVER_CERT}|g" \
     | sed -e "s|TRACING_ENABLED|${ENVOY_TRACING_ENABLED}|g" \
     | sed -e "s|ACCESSLOG_PATH|${ENVOY_ACCESS_LOG}|g" \
     | sed -e "s|BACKEND_INBOUND_PORTS|${BACKEND_INBOUND_PORTS}|g" \
     | sudo tee "${ENVOY_CONFIG}"
    
    # Install Envoy binary
    curl -sL "https://deb.dl.getenvoy.io/public/gpg.8115BA8E629CC074.key" | sudo gpg --dearmor -o /usr/share/keyrings/getenvoy-keyring.gpg
    echo a077cb587a1b622e03aa4bf2f3689de14658a9497a9af2c427bba5f4cc3c4723 /usr/share/keyrings/getenvoy-keyring.gpg | sha256sum --check
    echo "deb [arch=amd64 signed-by=/usr/share/keyrings/getenvoy-keyring.gpg] https://deb.dl.getenvoy.io/public/deb/debian $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/getenvoy.list
    sudo apt update
    sudo apt -y install getenvoy-envoy
    
    # Run Envoy as systemd service
    sudo systemd-run --uid=${ENVOY_USER_UID} --gid=${ENVOY_USER_GID} \
     --working-directory=${ENVOY_USER_HOME} --unit=envoy.service \
     bash -c "/usr/bin/envoy --config-path ${ENVOY_CONFIG} | tee"
    
    # Configure iptables for traffic interception and redirection
    sudo ${ENVOY_USER_HOME}/iptables.sh \
     -p "${ENVOY_PORT}" \
     -u "${ENVOY_USER_UID}" \
     -g "${ENVOY_USER_GID}" \
     -m "REDIRECT" \
     -i "${INTERCEPTED_CIDRS}" \
     -x "${GCE_METADATA_SERVER}"
    
  7. 만들기를 클릭하여 템플릿을 만듭니다.

gcloud

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

gcloud compute instance-templates create td-vm-template \
  --scopes=https://www.googleapis.com/auth/cloud-platform \
  --tags=http-td-tag,http-server,https-server \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --metadata=startup-script='#! /usr/bin/env bash

# Set variables
export ENVOY_USER="envoy"
export ENVOY_USER_UID="1337"
export ENVOY_USER_GID="1337"
export ENVOY_USER_HOME="/opt/envoy"
export ENVOY_CONFIG="${ENVOY_USER_HOME}/config.yaml"
export ENVOY_PORT="15001"
export ENVOY_ADMIN_PORT="15000"
export ENVOY_TRACING_ENABLED="false"
export ENVOY_XDS_SERVER_CERT="/etc/ssl/certs/ca-certificates.crt"
export ENVOY_ACCESS_LOG="/dev/stdout"
export ENVOY_NODE_ID="$(cat /proc/sys/kernel/random/uuid)~$(hostname -i)"
export BOOTSTRAP_TEMPLATE="${ENVOY_USER_HOME}/bootstrap_template.yaml"
export GCE_METADATA_SERVER="169.254.169.254/32"
export INTERCEPTED_CIDRS="*"
export GCP_PROJECT_NUMBER=PROJECT_NUMBER
export VPC_NETWORK_NAME=NETWORK_NAME
export GCE_ZONE=$(curl -sS -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/zone | cut -d"/" -f4)

# Create system user account for Envoy binary
sudo groupadd ${ENVOY_USER} \
  --gid=${ENVOY_USER_GID} \
  --system
sudo adduser ${ENVOY_USER} \
  --uid=${ENVOY_USER_UID} \
  --gid=${ENVOY_USER_GID} \
  --home=${ENVOY_USER_HOME} \
  --disabled-login \
  --system
# Download and extract the Cloud Service Mesh tar.gz file
cd ${ENVOY_USER_HOME}
sudo curl -sL https://storage.googleapis.com/traffic-director/traffic-director-xdsv3.tar.gz -o traffic-director-xdsv3.tar.gz
sudo tar -xvzf traffic-director-xdsv3.tar.gz traffic-director-xdsv3/bootstrap_template.yaml \
  -C bootstrap_template.yaml \
  --strip-components 1
sudo tar -xvzf traffic-director-xdsv3.tar.gz traffic-director-xdsv3/iptables.sh \
  -C iptables.sh \
  --strip-components 1
sudo rm traffic-director-xdsv3.tar.gz

# Generate Envoy bootstrap configuration
cat "${BOOTSTRAP_TEMPLATE}" \
  | sed -e "s|ENVOY_NODE_ID|${ENVOY_NODE_ID}|g" \
  | sed -e "s|ENVOY_ZONE|${GCE_ZONE}|g" \
  | sed -e "s|VPC_NETWORK_NAME|${VPC_NETWORK_NAME}|g" \
  | sed -e "s|CONFIG_PROJECT_NUMBER|${GCP_PROJECT_NUMBER}|g" \
  | sed -e "s|ENVOY_PORT|${ENVOY_PORT}|g" \
  | sed -e "s|ENVOY_ADMIN_PORT|${ENVOY_ADMIN_PORT}|g" \
  | sed -e "s|XDS_SERVER_CERT|${ENVOY_XDS_SERVER_CERT}|g" \
  | sed -e "s|TRACING_ENABLED|${ENVOY_TRACING_ENABLED}|g" \
  | sed -e "s|ACCESSLOG_PATH|${ENVOY_ACCESS_LOG}|g" \
  | sed -e "s|BACKEND_INBOUND_PORTS|${BACKEND_INBOUND_PORTS}|g" \
  | sudo tee "${ENVOY_CONFIG}"

# Install Envoy binary
curl -sL "https://deb.dl.getenvoy.io/public/gpg.8115BA8E629CC074.key" | sudo gpg --dearmor -o /usr/share/keyrings/getenvoy-keyring.gpg
echo a077cb587a1b622e03aa4bf2f3689de14658a9497a9af2c427bba5f4cc3c4723 /usr/share/keyrings/getenvoy-keyring.gpg | sha256sum --check
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/getenvoy-keyring.gpg] https://deb.dl.getenvoy.io/public/deb/debian $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/getenvoy.list
sudo apt update
sudo apt -y install getenvoy-envoy

# Run Envoy as systemd service
sudo systemd-run --uid=${ENVOY_USER_UID} --gid=${ENVOY_USER_GID} \
  --working-directory=${ENVOY_USER_HOME} --unit=envoy.service \
  bash -c "/usr/bin/envoy --config-path ${ENVOY_CONFIG} | tee"

# Configure iptables for traffic interception and redirection
sudo ${ENVOY_USER_HOME}/iptables.sh \
  -p "${ENVOY_PORT}" \
  -u "${ENVOY_USER_UID}" \
  -g "${ENVOY_USER_GID}" \
  -m "REDIRECT" \
  -i "${INTERCEPTED_CIDRS}" \
  -x "${GCE_METADATA_SERVER}"
'

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

서비스가 실행 중인 관리형 인스턴스 그룹이 없는 경우 이전 섹션에서 설명한 것과 같은 VM 템플릿을 사용하여 관리형 인스턴스 그룹을 생성하세요. 이 예시에서는 이전 섹션에서 만든 인스턴스 템플릿을 사용하여 기능을 보여줍니다. 인스턴스 템플릿을 사용할 필요는 없습니다.

콘솔

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

    인스턴스 그룹으로 이동

  2. 인스턴스 그룹 만들기를 클릭합니다. 기본적으로 관리형 인스턴스 그룹을 만드는 페이지가 표시됩니다.
  3. 새 관리형 인스턴스 그룹(스테이트리스(Stateless))을 선택합니다. 자세한 내용은 스테이트리스(Stateless) 또는 스테이트풀(Stateful) MIG를 참조하세요.
  4. 관리형 인스턴스 그룹의 이름으로 td-vm-mig-us-central1를 입력하고 us-central1-a 영역을 선택합니다.
  5. 인스턴스 템플릿에서 자신이 만든 인스턴스 템플릿을 선택합니다.
  6. 그룹에 만들려는 인스턴스 수를 2로 지정합니다.
  7. 만들기를 클릭합니다.

gcloud

gcloud CLI를 사용하여 이전에 만든 인스턴스 템플릿으로 관리형 인스턴스 그룹을 만듭니다.

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

Google Cloud 부하 분산 구성요소로 Cloud Service Mesh 구성

이 섹션의 안내에서는 Envoy 프록시가 2개의 백엔드 인스턴스 간에 아웃바운드 트래픽의 부하를 분산하도록 Cloud Service Mesh를 구성하는 방법을 보여줍니다. 다음 구성요소를 구성합니다.

상태 확인 만들기

상태 확인을 만들려면 다음 안내를 따르세요. 자세한 내용은 상태 점검 만들기를 참조하세요.

콘솔

  1. Google Cloud 콘솔에서 상태 점검 페이지로 이동합니다.

    상태 점검으로 이동

  2. 상태 확인 만들기를 클릭합니다.
  3. 이름에 td-vm-health-check를 입력합니다.
  4. 프로토콜에서 HTTP를 선택합니다.
  5. 만들기를 클릭합니다.

gcloud

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

    gcloud compute health-checks create http td-vm-health-check
    
  2. 방화벽 규칙을 만듭니다.

    gcloud compute firewall-rules create fw-allow-health-checks \
      --action ALLOW \
      --direction INGRESS \
      --source-ranges 35.191.0.0/16,130.211.0.0/22 \
      --target-tags http-td-tag,http-server,https-server \
      --rules tcp
    

백엔드 서비스 만들기

Google Cloud CLI를 사용하는 경우 백엔드 서비스를 INTERNAL_SELF_MANAGED의 부하 분산 스킴을 사용하는 전역 백엔드 서비스로 지정해야 합니다. 백엔드 서비스에 상태 확인과 관리형 또는 비관리형 인스턴스 그룹을 추가합니다. 이 예시에서는 관리형 인스턴스 그룹 만들기에서 만든 샘플 HTTP 서비스가 실행되는 Compute Engine VM 템플릿과 함께 관리형 인스턴스 그룹을 사용합니다.

콘솔

  1. Google Cloud 콘솔에서 Cloud Service Mesh 페이지로 이동합니다.

    Cloud Service Mesh로 이동

  2. 서비스 탭에서 서비스 만들기를 클릭합니다.
  3. 계속을 클릭합니다.
  4. 서비스 이름으로 td-vm-service를 입력합니다.
  5. 올바른 VPC 네트워크를 선택합니다.
  6. 백엔드 유형인스턴스 그룹인지 확인합니다.
  7. 생성한 관리형 인스턴스 그룹을 선택합니다.
  8. 올바른 포트 번호를 입력합니다.
  9. 사용률 또는 전송률분산 모드로 선택합니다. 기본값은 전송률입니다.
  10. 완료를 클릭합니다.
  11. 생성된 상태 확인을 선택합니다.
  12. 저장 후 계속을 클릭합니다.
  13. 만들기를 클릭합니다.

gcloud

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

    gcloud compute backend-services create td-vm-service \
      --global \
      --load-balancing-scheme=INTERNAL_SELF_MANAGED \
      --health-checks td-vm-health-check
    
  2. 백엔드 서비스에 백엔드를 추가합니다.

    gcloud compute backend-services add-backend td-vm-service \
       --instance-group td-demo-hello-world-mig \
       --instance-group-zone us-central1-a \
       --global
    

라우팅 규칙 맵 만들기

라우팅 규칙 맵은 Cloud Service Mesh가 메시의 트래픽을 라우팅하는 방법을 정의합니다.

다음 안내에 따라 Cloud Service Mesh 구성의 라우팅 규칙, 전달 규칙, 대상 프록시, 내부 IP 주소를 만듭니다.

내부 IP 주소로 전송되는 트래픽은 Envoy 프록시에 의해 가로채기를 당하고 호스트 및 경로 규칙에 따라 적절한 서비스로 전송됩니다.

전달 규칙은 load-balancing-schemeINTERNAL_SELF_MANAGED로 설정된 글로벌 전달 규칙으로 생성됩니다.

전달 규칙의 주소를 0.0.0.0으로 설정할 수 있습니다. 그러면 요청의 실제 대상 IP 주소와 관계없이 URL 맵에 구성된 HTTP 호스트 이름 및 경로 정보를 기반으로 트래픽이 라우팅됩니다. 이 경우 호스트 규칙에 구성된 대로 서비스의 호스트 이름이 서비스 메시 구성 내에서 고유해야 합니다. 즉, 동일한 호스트 이름을 사용하면서 백엔드 집합이 서로 다른 두 개의 상이한 서비스가 있을 수 없습니다.

또는, 서비스의 실제 대상 VIP를 기반으로 라우팅을 사용 설정할 수 있습니다. 서비스의 VIP를 전달 규칙의 address 매개변수로 구성하면 이 주소로 전송되는 요청만 URL 맵에 지정된 HTTP 매개변수를 기반으로 라우팅됩니다.

이 예시에서는 10.0.0.1을 주소 매개변수로 사용합니다. 즉, 서비스의 라우팅이 서비스의 실제 대상 VIP를 기반으로 수행됩니다.

콘솔

Google Cloud 콘솔에서 대상 프록시가 전달 규칙과 결합됩니다. 전달 규칙을 만들면 Google Cloud가 자동으로 대상 HTTP 프록시를 만들어 URL 맵에 연결합니다.

  1. Google Cloud 콘솔에서 Cloud Service Mesh 페이지로 이동합니다.

    Cloud Service Mesh로 이동

  2. 라우팅 규칙 맵 탭에서 라우팅 규칙 맵 만들기를 클릭합니다.
  3. 이름을 입력합니다.
  4. 전달 규칙 추가를 클릭합니다.
  5. 전달 규칙 이름으로 td-vm-forwarding-rule을 입력합니다.
  6. 네트워크를 선택합니다.
  7. 내부 IP를 선택합니다. 내부 IP 주소로 전송된 트래픽은 Envoy 프록시가 가로채서 호스트 및 경로 규칙에 따라 적절한 서비스로 전송합니다.

    전달 규칙은 load-balancing-schemeINTERNAL_SELF_MANAGED로 설정된 글로벌 전달 규칙으로 생성됩니다.

  8. 커스텀 IP 필드에 10.0.0.1을 입력합니다. VM이 해당 IP 주소로 전송하면 Envoy 프록시는 이를 가로채고 URL 맵에 정의된 트래픽 관리 규칙에 따라 적절한 백엔드 서비스의 엔드포인트로 전송합니다.

    VPC 네트워크의 각 전달 규칙은 VPC 네트워크마다 고유한 IP 주소와 포트가 있어야 합니다. 특정 VPC 네트워크에서 동일한 IP 주소와 포트를 사용하여 전달 규칙을 2개 이상 만들면 첫 번째 전달 규칙만 유효합니다. 나머지는 무시됩니다. 네트워크에서 10.0.0.1을 사용할 수 없는 경우 다른 IP 주소를 선택하세요.

  9. 포트80으로 설정되었는지 확인합니다.

  10. 저장을 클릭합니다.

  11. 라우팅 규칙 섹션에서 단순한 호스트 및 경로 규칙을 선택합니다.

  12. 호스트 및 경로 규칙 섹션에서 td-vm-service를 서비스로 선택합니다.

  13. 호스트 및 경로 규칙 추가를 클릭합니다.

  14. 호스트hello-world를 입력합니다.

  15. 서비스에서 td-vm-service를 선택합니다.

  16. 저장을 클릭합니다.

gcloud

  1. 백엔드 서비스를 사용하는 URL 맵을 만듭니다.

    gcloud compute url-maps create td-vm-url-map \
       --default-service td-vm-service
    
  2. URL 맵 경로 일치자와 호스트 규칙을 만들어 호스트 이름과 경로를 기반으로 서비스 트래픽을 라우팅합니다. 이 예시에서는 service-test를 서비스 이름으로 사용하고 이 호스트(/*)의 모든 경로 요청과 일치하는 기본 경로 일치자를 사용합니다.

    gcloud compute url-maps add-path-matcher td-vm-url-map \
       --default-service td-vm-service --path-matcher-name td-vm-path-matcher
    
    gcloud compute url-maps add-host-rule td-vm-url-map --hosts service-test \
       --path-matcher-name td-vm-path-matcher \
       --hosts hello-world
    
  3. 대상 HTTP 프록시를 만듭니다.

    gcloud compute target-http-proxies create td-vm-proxy \
       --url-map td-vm-url-map
    
  4. 전달 규칙을 만듭니다. 전달 규칙은 글로벌이어야 하며 load-balancing-scheme 값을 INTERNAL_SELF_MANAGED로 설정하여 만들어야 합니다.

    gcloud compute forwarding-rules create td-vm-forwarding-rule \
       --global \
       --load-balancing-scheme=INTERNAL_SELF_MANAGED \
       --address=10.0.0.1 \
       --target-http-proxy=td-vm-proxy \
       --ports 80 \
       --network default
    

이 시점에서 Cloud Service Mesh는 관리형 인스턴스 그룹의 백엔드에서 URL 맵에 지정된 서비스의 트래픽 부하를 분산하도록 구성됩니다.

구성 확인

Compute Engine VM용 Cloud Service Mesh 설정 가이드의 마지막 부분에서는 클라이언트 VM에서 전달 규칙 VIP로 전송된 트래픽이 가로채기를 당하고 Envoy 프록시로 리디렉션되는지 테스트합니다. 그런 다음 Envoy 프록시는 Hello World 서비스를 호스팅하는 VM으로 해당 요청을 라우팅합니다.

먼저 다음 단계에 따라 백엔드가 정상 상태인지 확인합니다.

콘솔

  1. Google Cloud 콘솔에서 Cloud Service Mesh 페이지로 이동합니다.

    Cloud Service Mesh로 이동

    요약에서 서비스가 정상 상태인지 여부를 알 수 있습니다.

  2. 서비스 이름을 클릭합니다. 서비스 세부정보 페이지에 백엔드의 상태에 대한 정보가 있습니다.
  3. 백엔드가 비정상 상태인 경우 백엔드 이름을 클릭한 후 VM 인스턴스 세부정보 페이지에서 재설정을 클릭하면 이를 재설정할 수 있습니다.

gcloud

compute backend-services get-health 명령어를 사용하여 백엔드가 정상인지 확인합니다.

gcloud compute backend-services get-health td-vm-service \
    --global \
    --format=get(name, healthStatus)

백엔드 상태를 확인한 후 트래픽을 가로채서 Envoy로 리디렉션하도록 구성된 클라이언트 VM에 로그인합니다. curl 요청을 라우팅 규칙 맵과 연결된 VIP로 전송합니다. Envoy가 curl 요청을 검사하고 해결할 서비스가 무엇인지 결정하며 요청을 서비스와 연결된 백엔드로 전송합니다.

콘솔

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

    인스턴스 그룹으로 이동

  2. td-vm-mig-us-central1 인스턴스 그룹을 선택합니다.
  3. 연결에서 SSH를 클릭합니다.
  4. 클라이언트 VM에 로그인한 후 curl 도구를 사용하여 Envoy를 통해 Hello World 서비스에 요청을 보냅니다.

    curl -H "Host: hello-world" http://10.0.0.1/
    

이 명령어를 반복해서 실행하면 Hello World 관리형 인스턴스 그룹에 백엔드의 호스트 이름이 포함된 다른 HTML 응답이 표시됩니다. 이는 Hello World 서비스의 백엔드로 트래픽을 전송할 때 Envoy가 기본 부하 분산 알고리즘인 라운드 로빈 부하 분산을 사용하기 때문입니다.

구성이 완료되면 사이드카 프록시가 있는 각 Compute Engine VM은 HTTP 프로토콜을 사용하여 Cloud Service Mesh에 구성된 서비스에 액세스할 수 있습니다.

이 가이드의 특정 예시를 따라 데모 HTTP 서버 및 서비스 호스트 이름 service-test과 함께 Compute Engine VM 템플릿을 사용하는 경우 다음 단계에 따라 구성을 확인하세요.

  1. 사이드카 프록시가 설치된 VM 호스트 중 하나에 로그인합니다.
  2. 명령어 curl -H 'Host: service-test' 10.0.0.1를 실행합니다. 이 요청은 요청을 제공한 관리형 인스턴스 그룹 백엔드의 호스트 이름을 반환합니다.

2단계에서는 모든 IP 주소를 사용할 수 있습니다. 예를 들어 curl -I -H 'Host: service-test' 1.2.3.4 명령어는 2단계에서 작동합니다.

이는 전달 규칙에 주소 매개변수가 0.0.0.0으로 설정되어 있기 때문에 Cloud Service Mesh가 URL 맵에 정의된 호스트를 기준으로 일치하도록 지시하기 때문입니다. 구성 예시에서 호스트 이름은 service-test입니다.

다음 단계