수동 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를 사용하여 구성하고 설정이 올바르게 작동하는지 확인하는 방법을 설명합니다. 이 프로세스에는 다음이 포함됩니다.
- 테스트 서비스 만들기
- Envoy 프록시를 사용하여 Compute Engine에 간단한 데이터 영역 배포
- Cloud Service Mesh가 Envoy 사이드카 프록시를 구성할 수 있도록 Compute Engine API를 사용하여 Cloud Service Mesh 설정
- 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 호스트에 대해 다음 단계를 수행합니다.
VM에 서비스 계정을 할당합니다.
Google Cloud APIs에 대한 전체 액세스를 허용하도록 VM의 API 액세스 범위를 설정합니다.
- VM을 만들 때 ID 및 API 액세스에서 모든 Cloud APIs에 대한 전체 액세스 허용을 클릭합니다.
gcloud CLI를 사용하여 다음을 지정합니다.
--scopes=https://www.googleapis.com/auth/cloud-platform
.
사이드카 프록시가 gRPC를 통해 Cloud Service Mesh 컨트롤 플레인에 연결될 수 있도록 VM에서
trafficdirector.googleapis.com
(TCP, 포트 443)으로 나가는 연결을 허용합니다. 포트 443에 대한 발신 연결은 기본으로 사용 설정됩니다.xDS 서버로
trafficdirector.googleapis.com:443
를 가리키는 부트스트랩 구성으로 xDS API 호환 사이드카 프록시(예시: Envoy)를 배포합니다. 샘플 부트스트랩 구성 파일을 가져오려면 압축 fil traffic-director-xdsv3.tar.gz를 열고bootstrap_template.yaml
파일을 필요에 맞게 수정합니다.서비스로 향하는 IP 트래픽을 사이드카 프록시 가로채기 리스너 포트로 리디렉션합니다.
- 사이드카 프록시 가로채기 리스너 포트는 프록시의 부트스트랩 메타데이터 구성에
TRAFFICDIRECTOR_INTERCEPTION_PORT
로 정의되며, 이 압축 파일의 샘플 부트스트랩 구성 파일에서는 15001로 설정되어 있습니다. - 압축 파일의 Istio
iptables.sh
스크립트를 사용하여 트래픽 가로채기를 설정할 수 있습니다.
- 사이드카 프록시 가로채기 리스너 포트는 프록시의 부트스트랩 메타데이터 구성에
Hello World
테스트 서비스 만들기
이 섹션에서는 클라이언트에서 요청한 VM의 호스트 이름을 반환하는 간단한 테스트 서비스를 만드는 방법을 보여줍니다. 테스트 서비스는 복잡하지 않습니다. Compute Engine 관리형 인스턴스 그룹 전체에 배포되는 웹 서버입니다.
인스턴스 템플릿 만들기
만든 인스턴스 템플릿은 startup-script
매개변수를 사용하여 샘플 apache2 웹 서버를 구성합니다.
콘솔
Google Cloud 콘솔에서 인스턴스 템플릿 페이지로 이동합니다.
- 인스턴스 템플릿 만들기를 클릭합니다.
- 필드에 다음 정보를 입력합니다.
- 이름:
td-demo-hello-world-template
- 부팅 디스크: Debian GNU/Linux 10(버스터)
- 서비스 계정: Compute Engine 기본 서비스 계정
- 액세스 범위: 모든 Cloud API에 대한 전체 액세스 허용
- 이름:
- 관리, 보안, 디스크, 네트워킹, 단독 임대를 클릭합니다.
- 네트워킹 탭의 네트워크 태그 필드에
td-http-server
태그를 추가합니다. 관리 탭에서 시작 스크립트 필드에 다음 스크립트를 복사합니다.
#! /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
만들기를 클릭합니다.
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는 자동 확장되는 관리형 인스턴스 그룹을 지원합니다.
콘솔
Google Cloud 콘솔에서 인스턴스 그룹 페이지로 이동합니다.
- 인스턴스 그룹 만들기를 클릭합니다.
- 새 관리형 인스턴스 그룹(스테이트리스(Stateless))을 선택합니다. 자세한 내용은 스테이트리스(Stateless) 또는 스테이트풀(Stateful) MIG를 참조하세요.
- 관리형 인스턴스 그룹의 이름으로
td-demo-hello-world-mig
를 입력하고us-central1-a
영역을 선택합니다. - 인스턴스 템플릿에서 사용자가 만든 인스턴스 템플릿인
td-demo-hello-world-template
을 선택합니다. - 자동 확장 모드에서 자동 확장 안함을 선택합니다.
- 인스턴스 수에서 그룹에 만들려는 인스턴스의 수로 두 개 이상을 지정합니다.
- 만들기를 클릭합니다.
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 웹 서비스를 자동으로 구성합니다.
콘솔
Google Cloud 콘솔에서 인스턴스 템플릿 페이지로 이동합니다.
- 인스턴스 템플릿 만들기를 클릭합니다.
다음과 같이 필드를 작성합니다.
- 이름: td-vm-template
- 부팅 디스크: Debian GNU/Linux 10(버스터)
- 서비스 계정: Compute Engine 기본 서비스 계정
- 액세스 범위: 모든 Cloud API에 대한 전체 액세스 허용
방화벽에서 HTTP 트래픽 허용 및 HTTPS 트래픽 허용 체크박스를 선택합니다.
관리, 보안, 디스크, 네트워킹, 단독 임대를 클릭합니다.
관리 탭에서 시작 스크립트 필드에 다음 스크립트를 복사합니다.
#! /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}"
만들기를 클릭하여 템플릿을 만듭니다.
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 템플릿을 사용하여 관리형 인스턴스 그룹을 생성하세요. 이 예시에서는 이전 섹션에서 만든 인스턴스 템플릿을 사용하여 기능을 보여줍니다. 인스턴스 템플릿을 사용할 필요는 없습니다.
콘솔
Google Cloud 콘솔에서 인스턴스 그룹 페이지로 이동합니다.
- 인스턴스 그룹 만들기를 클릭합니다. 기본적으로 관리형 인스턴스 그룹을 만드는 페이지가 표시됩니다.
- 새 관리형 인스턴스 그룹(스테이트리스(Stateless))을 선택합니다. 자세한 내용은 스테이트리스(Stateless) 또는 스테이트풀(Stateful) MIG를 참조하세요.
- 관리형 인스턴스 그룹의 이름으로
td-vm-mig-us-central1
를 입력하고us-central1-a
영역을 선택합니다. - 인스턴스 템플릿에서 자신이 만든 인스턴스 템플릿을 선택합니다.
- 그룹에 만들려는 인스턴스 수를 2로 지정합니다.
- 만들기를 클릭합니다.
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를 구성하는 방법을 보여줍니다. 다음 구성요소를 구성합니다.
- 상태 확인. 상태 점검에 대한 자세한 내용은 상태 점검 개요 및 상태 점검 만들기를 참조하세요.
- 상태 확인 프로브가 백엔드에 도달하도록 사용 설정하는 방화벽 규칙입니다. 자세한 내용은 상태 점검 개요를 참조하세요.
- 백엔드 서비스. 백엔드 서비스에 대한 자세한 내용은 백엔드 서비스 개요를 참조하세요.
- 라우팅 규칙 맵. 여기에는 전달 규칙 및 URL 맵 만들기가 포함됩니다. 자세한 내용은 전달 규칙 개요 및 URL 맵 사용을 참조하세요.
상태 확인 만들기
상태 확인을 만들려면 다음 안내를 따르세요. 자세한 내용은 상태 점검 만들기를 참조하세요.
콘솔
Google Cloud 콘솔에서 상태 점검 페이지로 이동합니다.
- 상태 확인 만들기를 클릭합니다.
- 이름에
td-vm-health-check
를 입력합니다. - 프로토콜에서 HTTP를 선택합니다.
- 만들기를 클릭합니다.
gcloud
상태 확인을 만듭니다.
gcloud compute health-checks create http td-vm-health-check
방화벽 규칙을 만듭니다.
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 템플릿과 함께 관리형 인스턴스 그룹을 사용합니다.
콘솔
Google Cloud 콘솔에서 Cloud Service Mesh 페이지로 이동합니다.
- 서비스 탭에서 서비스 만들기를 클릭합니다.
- 계속을 클릭합니다.
- 서비스 이름으로
td-vm-service
를 입력합니다. - 올바른 VPC 네트워크를 선택합니다.
- 백엔드 유형이 인스턴스 그룹인지 확인합니다.
- 생성한 관리형 인스턴스 그룹을 선택합니다.
- 올바른 포트 번호를 입력합니다.
- 사용률 또는 전송률을 분산 모드로 선택합니다. 기본값은 전송률입니다.
- 완료를 클릭합니다.
- 생성된 상태 확인을 선택합니다.
- 저장 후 계속을 클릭합니다.
- 만들기를 클릭합니다.
gcloud
백엔드 서비스를 만듭니다.
gcloud compute backend-services create td-vm-service \ --global \ --load-balancing-scheme=INTERNAL_SELF_MANAGED \ --health-checks td-vm-health-check
백엔드 서비스에 백엔드를 추가합니다.
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-scheme
가 INTERNAL_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 맵에 연결합니다.
Google Cloud 콘솔에서 Cloud Service Mesh 페이지로 이동합니다.
- 라우팅 규칙 맵 탭에서 라우팅 규칙 맵 만들기를 클릭합니다.
- 이름을 입력합니다.
- 전달 규칙 추가를 클릭합니다.
- 전달 규칙 이름으로
td-vm-forwarding-rule
을 입력합니다. - 네트워크를 선택합니다.
내부 IP를 선택합니다. 내부 IP 주소로 전송된 트래픽은 Envoy 프록시가 가로채서 호스트 및 경로 규칙에 따라 적절한 서비스로 전송합니다.
전달 규칙은
load-balancing-scheme
가INTERNAL_SELF_MANAGED
로 설정된 글로벌 전달 규칙으로 생성됩니다.커스텀 IP 필드에
10.0.0.1
을 입력합니다. VM이 해당 IP 주소로 전송하면 Envoy 프록시는 이를 가로채고 URL 맵에 정의된 트래픽 관리 규칙에 따라 적절한 백엔드 서비스의 엔드포인트로 전송합니다.VPC 네트워크의 각 전달 규칙은 VPC 네트워크마다 고유한 IP 주소와 포트가 있어야 합니다. 특정 VPC 네트워크에서 동일한 IP 주소와 포트를 사용하여 전달 규칙을 2개 이상 만들면 첫 번째 전달 규칙만 유효합니다. 나머지는 무시됩니다. 네트워크에서
10.0.0.1
을 사용할 수 없는 경우 다른 IP 주소를 선택하세요.포트가
80
으로 설정되었는지 확인합니다.저장을 클릭합니다.
라우팅 규칙 섹션에서 단순한 호스트 및 경로 규칙을 선택합니다.
호스트 및 경로 규칙 섹션에서
td-vm-service
를 서비스로 선택합니다.호스트 및 경로 규칙 추가를 클릭합니다.
호스트에
hello-world
를 입력합니다.서비스에서
td-vm-service
를 선택합니다.저장을 클릭합니다.
gcloud
백엔드 서비스를 사용하는 URL 맵을 만듭니다.
gcloud compute url-maps create td-vm-url-map \ --default-service td-vm-service
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
대상 HTTP 프록시를 만듭니다.
gcloud compute target-http-proxies create td-vm-proxy \ --url-map td-vm-url-map
전달 규칙을 만듭니다. 전달 규칙은 글로벌이어야 하며
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으로 해당 요청을 라우팅합니다.
먼저 다음 단계에 따라 백엔드가 정상 상태인지 확인합니다.
콘솔
Google Cloud 콘솔에서 Cloud Service Mesh 페이지로 이동합니다.
요약에서 서비스가 정상 상태인지 여부를 알 수 있습니다.
- 서비스 이름을 클릭합니다. 서비스 세부정보 페이지에 백엔드의 상태에 대한 정보가 있습니다.
- 백엔드가 비정상 상태인 경우 백엔드 이름을 클릭한 후 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
요청을 검사하고 해결할 서비스가 무엇인지 결정하며 요청을 서비스와 연결된 백엔드로 전송합니다.
콘솔
Google Cloud 콘솔에서 인스턴스 그룹 페이지로 이동합니다.
td-vm-mig-us-central1
인스턴스 그룹을 선택합니다.- 연결에서 SSH를 클릭합니다.
클라이언트 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 템플릿을 사용하는 경우 다음 단계에 따라 구성을 확인하세요.
- 사이드카 프록시가 설치된 VM 호스트 중 하나에 로그인합니다.
- 명령어
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
입니다.
다음 단계
- 고급 트래픽 관리 알아보기
- Cloud Service Mesh 배포 문제 해결 방법 알아보기
- Envoy로 관측 가능성 설정 방법 알아보기