이 튜토리얼에서는 서비스 프로듀서가 내부 패스 스루 네트워크 부하 분산기를 사용하는 간단한 서비스를 만드는 방법을 보여줍니다. 기본적으로 내부 패스 스루 네트워크 부하 분산기는 호스팅하는 VPC 네트워크 내에서만 사용할 수 있습니다.
이 튜토리얼은 클라우드 설계자, 네트워크 설계자, 네트워크 관리자, IT 관리자를 대상으로 합니다.
목표
- 서비스 프로듀서 리소스의 네트워킹 구성
- 부하 분산기 백엔드의 VM 리소스 만들기
- 부하 분산기 구성요소 구성
- 부하 분산기 액세스 테스트
비용
이 문서에서는 비용이 청구될 수 있는 Google Cloud구성요소를 사용합니다.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용합니다.
이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.
시작하기 전에
- 서비스 생산자 리소스에 사용할 프로젝트를 만들거나 선택합니다.
이 프로젝트는 이후 튜토리얼에서
PRODUCER_PROJECT로 참조됩니다. -
In the Google Cloud console, go to the project selector page.
-
Select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Enable the Compute Engine API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. -
Make sure that you have the following role or roles on the project: Compute Engine > Compute Network Admin, Compute Engine > Compute Security Admin, Compute Engine > Compute Instance Admin
Check for the roles
-
In the Google Cloud console, go to the IAM page.
Go to IAM - Select the project.
-
In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.
- For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.
Grant the roles
-
In the Google Cloud console, go to the IAM page.
IAM으로 이동 - 프로젝트를 선택합니다.
- 액세스 권한 부여를 클릭합니다.
-
새 주 구성원 필드에 사용자 식별자를 입력합니다. 일반적으로 Google 계정의 이메일 주소입니다.
- 역할 선택을 클릭한 후 역할을 검색합니다.
- 역할을 추가로 부여하려면 다른 역할 추가를 클릭하고 각 역할을 추가합니다.
- 저장을 클릭합니다.
-
네트워킹 구성
다음 섹션에서는 서비스의 네트워크, 서브넷, 방화벽 규칙을 만드는 방법을 설명합니다.
네트워크 및 서브넷 구성
부하 분산기의 서비스 네트워크와 서브넷을 만들려면 다음 섹션의 단계를 완료하세요.
콘솔
Google Cloud 콘솔에서 VPC 네트워크 페이지로 이동합니다.
VPC 네트워크 만들기를 클릭합니다.
이름에
service-network를 입력합니다.서브넷 생성 모드에 커스텀을 선택합니다.
새 서브넷 섹션에 다음 정보를 입력합니다.
- 이름에
service-subnet를 입력합니다. - 리전에서 사용할 리전을 선택합니다.
- IP 스택 유형에 IPv4(단일 스택)를 선택합니다.
- IPv4 범위에
10.10.10.0/24를 입력합니다. - 완료를 클릭합니다.
- 이름에
만들기를 클릭합니다.
gcloud
커스텀 모드 VPC 네트워크를 만듭니다.
gcloud compute networks create service-network --subnet-mode=custom
service-network네트워크에서 서브넷을 만듭니다.gcloud compute networks subnets create service-subnet \ --network=service-network \ --range=10.10.10.0/24 \ --region=REGIONREGION을 사용하려는 리전으로 바꿉니다.
방화벽 규칙 구성
다음 트래픽을 허용하는 방화벽 규칙을 만듭니다.
fw-allow-subnet:10.10.10.0/24의 트래픽이10.10.10.0/24의 다른 리소스에 도달하도록 허용합니다.fw-allow-ssh:0.0.0.0/0의 SSH 트래픽이allow-ssh네트워크 태그가 있는 VM에 도달하도록 허용합니다.fw-allow-healthcheck: Google Cloud상태 점검 시스템의 트래픽이allow-healthcheck네트워크 태그가 있는 VM에 도달하도록 허용합니다.
콘솔
Google Cloud 콘솔에서 방화벽 정책 페이지로 이동합니다.
서브넷 트래픽을 허용하려면 방화벽 규칙 만들기를 클릭하고 다음 설정을 사용합니다.
- 이름에
fw-allow-subnet를 입력합니다. - 네트워크에서
service-network를 선택합니다. - 우선순위에
1000을 입력합니다. - 트래픽 방향으로 수신을 선택합니다.
- 일치 시 작업으로 허용을 선택합니다.
- 대상으로 네트워크의 모든 인스턴스를 선택합니다.
- 소스 필터에 대해 IPv4 범위를 선택합니다.
- 소스 IPv4 범위에
10.10.10.0/24을 입력합니다. - 프로토콜 및 포트로 모두 허용을 선택합니다.
- 이름에
만들기를 클릭합니다.
수신 SSH 연결을 허용하려면 방화벽 규칙 만들기를 클릭하고 다음 설정을 사용합니다.
- 이름에
fw-allow-ssh를 입력합니다. - 네트워크에서
service-network를 선택합니다. - 우선순위에
1000을 입력합니다. - 트래픽 방향으로 수신을 선택합니다.
- 일치 시 작업으로 허용을 선택합니다.
- 대상으로 지정된 대상 태그를 선택합니다.
- 대상 태그에
allow-ssh를 입력합니다. - 소스 필터에 대해 IPv4 범위를 선택합니다.
- 소스 IPv4 범위에
0.0.0.0/0을 입력합니다. - 프로토콜 및 포트에서 지정된 프로토콜 및 포트를 선택하고 TCP 체크박스를 선택합니다. 포트에
22을 입력합니다.
- 이름에
만들기를 클릭합니다.
Google Cloud 상태 점검을 허용하려면 방화벽 규칙 만들기를 클릭하고 다음 설정을 사용합니다.
- 이름에
fw-allow-healthcheck를 입력합니다. - 네트워크에서
service-network를 선택합니다. - 우선순위에
1000을 입력합니다. - 트래픽 방향으로 수신을 선택합니다.
- 일치 시 작업으로 허용을 선택합니다.
- 대상으로 지정된 대상 태그를 선택합니다.
- 대상 태그에
allow-healthcheck를 입력합니다. - 소스 필터에 대해 IPv4 범위를 선택합니다.
- 소스 IPv4 범위에
130.211.0.0/22및35.191.0.0/16을 입력합니다. - 프로토콜 및 포트로 모두 허용을 선택합니다.
- 이름에
만들기를 클릭합니다.
gcloud
fw-allow-subnet방화벽 규칙을 만들어 서브넷 내의 통신을 허용합니다.gcloud compute firewall-rules create fw-allow-subnet \ --network=service-network \ --action=allow \ --direction=ingress \ --source-ranges=10.10.10.0/24 \ --rules=tcp,udp,icmp
allow-ssh네트워크 태그를 사용해 VM으로 가는 SSH 연결을 허용하는fw-allow-ssh방화벽 규칙을 만듭니다.gcloud compute firewall-rules create fw-allow-ssh \ --network=service-network \ --action=allow \ --direction=ingress \ --source-ranges=0.0.0.0/0 \ --target-tags=allow-ssh \ --rules=tcp:22
Google Cloud상태 점검을 허용하는
fw-allow-healthcheck규칙을 만듭니다.gcloud compute firewall-rules create fw-allow-healthcheck \ --network=service-network \ --action=allow \ --direction=ingress \ --target-tags=allow-healthcheck \ --source-ranges=130.211.0.0/22,35.191.0.0/16 \ --rules=tcp,udp,icmp
부하 분산기 백엔드의 VM 리소스 만들기
부하 분산기와 함께 사용할 VM과 인스턴스 그룹을 만듭니다.
백엔드 VM 만들기
만들려는 서비스는 가용성을 높이기 위해 vm-1 및 vm-2의 두 VM에서 실행됩니다. VM은 동일한 영역에 있지만 프로덕션 환경에서는 여러 영역을 사용하는 것이 좋습니다.
VM을 만드는 것 외에도 다음 단계를 따르면 다음 작업을 수행할 수 있습니다.
- 방화벽 규칙에서 타겟으로 구성한 네트워크 태그와 나중에 사용되는 추가 네트워크 태그 (
allow-nat)를 사용하도록 VM을 구성합니다. Apache 서비스를 설치, 구성, 시작합니다.
콘솔
Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.
인스턴스 만들기를 클릭합니다.
이름에
vm-1를 입력합니다.리전 및 영역에서 리전과 해당 리전 내의 영역을 선택합니다.
탐색 메뉴에서 OS 및 스토리지로 이동합니다.
운영체제 및 스토리지 창에서 부팅 디스크로 Debian GNU/Linux 12 (bookworm)이 선택되어 있는지 확인합니다. 다른 이미지를 선택해야 하는 경우 변경을 클릭합니다.
탐색 메뉴에서 네트워킹으로 이동합니다.
네트워크 태그에
allow-ssh,allow-healthcheck,allow-nat을 입력합니다.네트워크 인터페이스에 다음을 선택합니다.
- 네트워크에서
service-network를 선택합니다. - 서브넷으로
service-subnet을 선택합니다. - IP 스택 유형에 IPv4(단일 스택)를 선택합니다.
- 기본 내부 IPv4 주소에 임시 (자동)을 선택합니다.
- 외부 IPv4 주소에 임시를 선택합니다.
- 네트워크에서
탐색 메뉴에서 고급으로 이동합니다.
자동화 섹션의 시작 스크립트 필드에 다음 스크립트를 입력합니다.
#! /bin/bash if [ -f /etc/startup_script_completed ]; then exit 0 fi apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl file_ports="/etc/apache2/ports.conf" file_http_site="/etc/apache2/sites-available/000-default.conf" file_https_site="/etc/apache2/sites-available/default-ssl.conf" http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088" http_vh_prts="*:80 *:8008 *:8080 *:8088" https_listen_prts="Listen 443\nListen 8443" https_vh_prts="*:443 *:8443" vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://metadata.google.internal/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html prt_conf="$(cat "$file_ports")" prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")" prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")" echo "$prt_conf" | tee "$file_ports" http_site_conf="$(cat "$file_http_site")" http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")" echo "$http_site_conf_2" | tee "$file_http_site" https_site_conf="$(cat "$file_https_site")" https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")" echo "$https_site_conf_2" | tee "$file_https_site" systemctl restart apache2 touch /etc/startup_script_completed만들기를 클릭합니다.
이 단계를 반복하여
vm-1과 동일한 리전 및 영역에vm-2라는 다른 VM을 만듭니다.
gcloud
다음 명령어를 실행하여 VM 두 개를 만듭니다.
gcloud compute instances create vm-1 \ --zone=ZONE \ --image-family=debian-12 \ --image-project=debian-cloud \ --tags=allow-ssh,allow-healthcheck,allow-nat \ --subnet=service-subnet \ --metadata=startup-script='#! /bin/bash if [ -f /etc/startup_script_completed ]; then exit 0 fi apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl file_ports="/etc/apache2/ports.conf" file_http_site="/etc/apache2/sites-available/000-default.conf" file_https_site="/etc/apache2/sites-available/default-ssl.conf" http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088" http_vh_prts="*:80 *:8008 *:8080 *:8088" https_listen_prts="Listen 443\nListen 8443" https_vh_prts="*:443 *:8443" vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://metadata.google.internal/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html prt_conf="$(cat "$file_ports")" prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")" prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")" echo "$prt_conf" | tee "$file_ports" http_site_conf="$(cat "$file_http_site")" http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")" echo "$http_site_conf_2" | tee "$file_http_site" https_site_conf="$(cat "$file_https_site")" https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")" echo "$https_site_conf_2" | tee "$file_https_site" systemctl restart apache2 touch /etc/startup_script_completed'gcloud compute instances create vm-2 \ --zone=ZONE \ --image-family=debian-12 \ --image-project=debian-cloud \ --tags=allow-ssh,allow-healthcheck,allow-nati \ --subnet=service-subnet \ --metadata=startup-script='#! /bin/bash if [ -f /etc/startup_script_completed ]; then exit 0 fi apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl file_ports="/etc/apache2/ports.conf" file_http_site="/etc/apache2/sites-available/000-default.conf" file_https_site="/etc/apache2/sites-available/default-ssl.conf" http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088" http_vh_prts="*:80 *:8008 *:8080 *:8088" https_listen_prts="Listen 443\nListen 8443" https_vh_prts="*:443 *:8443" vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://metadata.google.internal/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html prt_conf="$(cat "$file_ports")" prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")" prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")" echo "$prt_conf" | tee "$file_ports" http_site_conf="$(cat "$file_http_site")" http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")" echo "$http_site_conf_2" | tee "$file_http_site" https_site_conf="$(cat "$file_https_site")" https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")" echo "$https_site_conf_2" | tee "$file_https_site" systemctl restart apache2 touch /etc/startup_script_completed'ZONE을 사용하려는 영역으로 바꿉니다.
인스턴스 그룹 만들기
부하 분산기 백엔드에서 VM을 사용하려면 VM을 인스턴스 그룹에 추가해야 합니다.
콘솔
Google Cloud 콘솔에서 인스턴스 그룹 페이지로 이동합니다.
인스턴스 그룹 만들기를 클릭합니다.
탐색 창에서 새 비관리형 인스턴스 그룹을 클릭합니다.
이름에
ig-1를 입력합니다.위치 섹션에서 VM과 동일한 리전 및 영역을 선택합니다.
네트워크에
service-network를 선택합니다.서브네트워크에
service-subnet을 선택합니다.VM 인스턴스 섹션에서
vm-1및vm-2를 인스턴스 그룹에 추가합니다.만들기를 클릭합니다.
gcloud
비관리형 인스턴스 그룹을 만듭니다.
gcloud compute instance-groups unmanaged create ig-1 \ --zone=ZONEZONE을 VM이 포함된 영역으로 바꿉니다.VM을 인스턴스 그룹에 추가합니다.
gcloud compute instance-groups unmanaged add-instances ig-1 \ --zone=ZONE \ --instances=vm-1,vm-2
부하 분산기 구성요소 구성
상태 점검 및 백엔드 서비스로 시작된 내부 패스 스루 네트워크 부하 분산기의 모든 구성요소와 프런트엔드 구성요소를 차례로 구성합니다.
상태 점검. HTTP
200 OK상태 코드를 확인하는 HTTP 상태 점검을 사용합니다.백엔드 서비스. 내부 부하 분산기를 통해 HTTP 트래픽을 전달해야 하므로 UDP가 아닌 TCP를 사용해야 합니다.
전달 규칙. 단일 내부 전달 규칙
service-rule을 만듭니다.내부 IP 주소 전달 규칙을 만들 때 내부 IP 주소
10.10.10.99를 지정합니다.
콘솔
구성 시작
Google Cloud 콘솔에서 부하 분산 페이지로 이동합니다.
- 부하 분산기 만들기를 클릭합니다.
- 부하 분산기 유형에 네트워크 부하 분산기(TCP/UDP/SSL)를 선택하고 다음을 클릭합니다.
- 프록시 또는 패스 스루에서 패스 스루 부하 분산기를 선택하고 다음을 클릭합니다.
- 공개 또는 내부에서 내부를 선택하고 다음을 클릭합니다.
- 구성을 클릭합니다.
기본 구성
내부 패스 스루 네트워크 부하 분산기 만들기 페이지에서 다음 정보를 입력합니다.
- 부하 분산기 이름에
service-lb를 입력합니다. - 리전에서 VM과 동일한 리전을 선택합니다.
- 네트워크에서
service-network를 선택합니다.
백엔드 구성
- 백엔드 구성을 클릭합니다.
- 상태 점검 목록에서 상태 점검 만들기를 클릭하고 다음 정보를 입력합니다.
- 이름:에
hc-http-80을 입력합니다. - 프로토콜:에서
HTTP를 선택합니다. - 포트:에
80을 입력합니다. - 프록시 프로토콜:에서
NONE를 선택합니다. - 요청 경로:에
/을 입력합니다.
- 이름:에
- 만들기를 클릭합니다.
- 백엔드의 새 백엔드 섹션에서 IPv4 (단일 스택)을 선택합니다.
- 인스턴스 그룹에서
ig-1인스턴스 그룹을 선택하고 완료를 클릭합니다. - 계속하기 전에 백엔드 구성 옆에 파란색 체크표시가 있는지 확인합니다.
프런트엔드 구성
- 프런트엔드 구성을 클릭합니다.
- 새 프런트엔드 IP 및 포트 섹션에서 다음을 수행합니다.
- 이름에
service-rule를 입력합니다. - 서브네트워크로
service-subnet을 선택합니다. - 내부 IP 용도 섹션의 IP 주소 목록에서 IP 주소 만들기를 선택하고 다음 정보를 입력합니다.
- 이름에
service-rule-ip를 입력합니다. - IP 버전에서 IPv4를 선택합니다.
- 고정 IP 주소에서 직접 선택을 선택합니다.
- 커스텀 IP 주소에
10.10.10.99를 입력합니다.
- 이름에
- 예약을 클릭합니다.
- 포트에 단일을 선택한 후 포트 번호에
80을 입력합니다. - 완료를 클릭합니다.
- 계속하기 전에 프런트엔드 구성 옆에 파란색 체크표시가 있는지 확인합니다.
- 이름에
구성 검토
- 검토 및 완료를 클릭합니다.
- 부하 분산기 구성 설정을 검토합니다.
- 만들기를 클릭합니다.
gcloud
새 리전 HTTP 상태 확인을 만들어 포트 80에서 VM에 대한 HTTP 연결을 테스트합니다.
gcloud compute health-checks create http hc-http-80 \ --region=REGION \ --port=80REGION을 백엔드 VM과 동일한 리전으로 바꿉니다.HTTP 트래픽에 대한 백엔드 서비스를 만듭니다.
gcloud compute backend-services create service-lb \ --load-balancing-scheme=internal \ --protocol=tcp \ --region=REGION \ --health-checks=hc-http-80 \ --health-checks-region=REGIONREGION을 백엔드 VM과 동일한 리전으로 바꿉니다.인스턴스 그룹을 백엔드 서비스에 추가합니다.
gcloud compute backend-services add-backend service-lb \ --region=REGION \ --instance-group=ig-1 \ --instance-group-zone=ZONE다음을 바꿉니다.
REGION: 백엔드 VM과 동일한 리전ZONE: 백엔드 VM과 동일한 영역입니다.
백엔드 서비스에 대한 전달 규칙을 만듭니다.
gcloud compute forwarding-rules create service-rule \ --region=REGION \ --load-balancing-scheme=internal \ --network=service-network \ --subnet=service-subnet \ --address=10.10.10.99 \ --ip-protocol=TCP \ --ports=80 \ --backend-service=service-lb \ --backend-service-region=REGIONREGION을 백엔드 VM과 동일한 리전으로 바꿉니다.
부하 분산기 액세스 테스트
부하 분산기가 작동하는지 테스트하려면 테스트 VM을 만들고 VM에서 부하 분산기로 요청을 전송합니다.
테스트용 클라이언트 VM 만들기
백엔드 (서버) VM과 동일한 리전에 클라이언트 VM을 만듭니다.
콘솔
Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.
인스턴스 만들기를 클릭합니다.
이름에
producer-test를 입력합니다.리전에 대해 백엔드 VM과 동일한 리전을 선택합니다.
영역에서 해당 리전의 영역을 선택합니다.
네트워킹을 클릭하고 다음 필드를 구성합니다.
- 네트워크 태그에
allow-ssh를 입력합니다. - 네트워크 인터페이스에 다음을 선택합니다.
- 네트워크에서
service-network를 선택합니다. - 서브넷으로
service-subnet을 선택합니다.
- 네트워크에서
- 네트워크 태그에
만들기를 클릭합니다.
gcloud
gcloud compute instances create producer-test \
--zone=ZONE \
--image-family=debian-12 \
--image-project=debian-cloud \
--tags=allow-ssh \
--subnet=service-subnet
ZONE을 백엔드 VM과 동일한 리전에 있는 영역으로 바꿉니다.
연결 테스트
이 테스트에서는 클라이언트 VM에서 부하 분산기에 연결합니다. 예상되는 동작은 트래픽이 부하 분산기의 백엔드 VM에 분산되는 것입니다.
- 클라이언트 VM 인스턴스에 연결합니다.
gcloud compute ssh producer-test --zone=ZONE
ZONE을 클라이언트 VM의 영역으로 바꿉니다. curl을 사용하여 부하 분산기에 대한 웹 요청을 만들어 IP 주소에 연결합니다. 다른 백엔드 VM에서 응답을 볼 수 있도록 요청을 반복합니다. 응답을 생성하는 VM의 이름은 각 백엔드 VM에 있는/var/www/html/index.html의 콘텐츠에 따라 HTML 응답에 텍스트로 표시됩니다. 예를 들어 예상 응답은Page served from: vm-1및Page served from: vm-2와 같습니다.curl -s http://10.10.10.99