[LB] Use an Internal Application Load Balancer

yejin·2026년 4월 28일

Google Skills

목록 보기
30/46

Course

Implementing Cloud Load Balancing for Compute Engine

Lab

목록


🌠 Use an Internal Application Load Balancer

개요

내부 애플리케이션 부하 분산기는 비즈니스 운영을 지원하기 위해 강력하고 안전하며 관리하기 쉬운 내부 애플리케이션을 빌드하는 필수 요소이다.
가상 머신(VM)을 공개 인터넷에 직접 노출하지 않고도 프라이빗 클라우드 네트워크 내에서 네트워크 트래픽을 분산하는 방법을 알아보자!

실습과정

1. 기본 리전 및 영역 설정

gcloud config set compute/region Region
gcloud config set compute/zone Zone

2. 가상 환경 만들기

(1) virtualenv 환경 설치

sudo apt-get install -y virtualenv

➡️ 빠르게 별도의 외부 도구를 설치

(2) 가상 환경 빌드

python3 -m venv venv

➡️ 파이썬에 내장된 모듈(venv) 사용

(3) 가상 환경 활성화

source venv/bin/activate

3. Gemini Code Assist 사용 설정

(1) Gemini for Google Cloud API 사용 설정

gcloud services enable cloudaicompanion.googleapis.com

(2) 프로젝트 선택


➡️ 하단 상태 표시줄에서 Cloud Code - No Project > Select a Google Cloud project > 프로젝트 ID 선택
➡️ 상태 표시줄의 Cloud Code 상태 메시지에 Google Cloud 프로젝트(프로젝트 ID)가 표시되는지 확인


4. 백엔드 관리형 인스턴스 그룹 만들기

(1) 백엔드 스크립트 생성

touch ~/backend.sh
# backend 스크립트 내용
sudo chmod -R 777 /usr/local/sbin/
sudo cat << EOF > /usr/local/sbin/serveprimes.py
import http.server

def is_prime(a): return a!=1 and all(a % i for i in range(2,int(a**0.5)+1))

class myHandler(http.server.BaseHTTPRequestHandler):
  def do_GET(s):
    s.send_response(200)
    s.send_header("Content-type", "text/plain")
    s.end_headers()
    s.wfile.write(bytes(str(is_prime(int(s.path[1:]))).encode('utf-8')))

http.server.HTTPServer(("",80),myHandler).serve_forever()
EOF
nohup python3 /usr/local/sbin/serveprimes.py >/dev/null 2>&1 &

(2) Gemini에게 스크립트 내용 설명 요청 (Optional)

As an Application Developer at Cymbal AI, explain the backend.sh startup script to a new team member.
This script is used to run a small Python web server written in a Python file serveprimes.py. 
Provide a detailed breakdown of the script's key components and explain the function of each command.

For the suggested improvements, don't make any changes to the file's content.

Cymbal AI의 애플리케이션 개발자로서 신규 팀원에게 backend.sh 시작 스크립트를 설명합니다.
이 스크립트는 Python 파일인 serveprimes.py에 작성된 작은 Python 웹 서버를 실행하는 데 사용합니다.
스크립트의 주요 구성요소를 자세히 분류하고 각 명령어의 기능을 설명합니다.

추천 개선 사항인 경우 파일 내용을 변경해선 안 됩니다.

(3) 인스턴스 템플릿 생성

# --no-address 옵션: 백엔드 VM이 보안상의 이유로 공개 인터넷에 액세스할 수 없음을 의미
gcloud compute instance-templates create primecalc \
--metadata-from-file startup-script=backend.sh \
--no-address --tags backend --machine-type=e2-medium

(4) 방화벽 열기

gcloud compute firewall-rules create http --network default --allow=tcp:80 \
--source-ranges IP --target-tags backend

(5) 인스턴스 그룹 생성

gcloud compute instance-groups managed create backend \
--size 3 \
--template primecalc \
--zone ZONE

(6) 인스턴스 생성 확인


➡️ 메뉴: Compute Engine > VM instances
➡️ 인스턴스 그룹에서 --size 3 설정을 통해, 인스턴스 3개가 생성됐다.


5. 내부 부하 분산기 설정

참고✨

현재 내부 서비스를 위한 단일 비공개 VIP 출입구를 만들고 있다. 이렇게 하면 활성 상태이거나 사용 가능한 특정 백엔드 VM을 모르더라도 다른 내부 애플리케이션이 '소수 계산기'에 안정적으로 도달할 수 있다.

이 작업에서는 내부 부하 분산기를 설정하고 방금 만든 인스턴스 그룹에 연결해보자!

내부 부하 분산기 구성 요소:

  • 전달 규칙(Forwarding Rule): 다른 내부 서비스가 요청을 전송하는 실제 비공개 IP 주소로, 이 규칙은 트래픽을 백엔드 서비스로 '전달'한다.
  • 백엔드 서비스(Backend Service): 부하 분산기가 VM 인스턴스에 트래픽을 분산하는 방법을 정의한다. (상태 점검 포함)
  • 상태 점검(Health Check): 백엔드 VM의 '상태'를 지속적으로 모니터링한다.

다음 다이어그램은 서로 다른 영역의 여러 백엔드 그룹에 있는 다수의 인스턴스를 사용하여 인스턴스의 부하를 분산하는 방법을 보여준다.

(1) 상태 점검 생성

gcloud compute health-checks create http ilb-health --request-path /2

(2) 백엔드 서비스 생성

# Region 변경 필요
gcloud compute backend-services create prime-service \
--load-balancing-scheme internal --region=REGION \
--protocol tcp --health-checks ilb-health

(3) 백엔드 서비스에 인스턴스 그룹 추가

# Region, Zone 변경 필요
gcloud compute backend-services add-backend prime-service \
--instance-group backend --instance-group-zone=ZONE \
--region=REGION

(4) 전달 규칙 생성

# IP 변경 필요
gcloud compute forwarding-rules create prime-lb \
--load-balancing-scheme internal \
--ports 80 --network default \
--region=REGION --address IP \
--backend-service prime-service

6. 부하 분산기 테스트

(1) 테스트 인스턴스 생성

# Zone 변경 필요
gcloud compute instances create testinstance \
--machine-type=e2-standard-2 --zone ZONE

(2) SSH 연결

# Zone 변경 필요
gcloud compute ssh testinstance --zone ZONE

(3) 부하 분산기 쿼리 실행

curl IP/2
curl IP/4
curl IP/5

➡️ IP: 로드밸런서의 IP 주소
➡️ /n: 숫자를 붙여서, 백엔드 VM에 n이 소수인지 판별하여 True/False라는 텍스트를 응답한다.

참고

부하 분산기의 Frontend IP 확인하는 명령어

gcloud compute forwarding-rules describe web-map-http \
    --global \
    --format="get(IPAddress)"

(4) 테스트 인스턴스 삭제

gcloud compute instances delete testinstance --zone=ZONE

7. 공개 웹 서버 만들기

참고✨

내부 애플리케이션 부하 분산기를 통해 내부 '소수 계산기' 서비스를 사용하여 소수 행렬을 표시하는 공개 웹 서버 만들기!

(1) 프론트엔드 스크립트 생성

sudo chmod -R 777 /usr/local/sbin/
sudo cat << EOF > /usr/local/sbin/getprimes.py
import urllib.request
from multiprocessing.dummy import Pool as ThreadPool
import http.server
PREFIX="http://IP/" #HTTP Load Balancer IP로 수정 필요
def get_url(number):
    return urllib.request.urlopen(PREFIX+str(number)).read().decode('utf-8')
class myHandler(http.server.BaseHTTPRequestHandler):
  def do_GET(s):
    s.send_response(200)
    s.send_header("Content-type", "text/html")
    s.end_headers()
    i = int(s.path[1:]) if (len(s.path)>1) else 1
    s.wfile.write("<html><body><table>".encode('utf-8'))
    pool = ThreadPool(10)
    results = pool.map(get_url,range(i,i+100))
    for x in range(0,100):
      if not (x % 10): s.wfile.write("<tr>".encode('utf-8'))
      if results[x]=="True":
        s.wfile.write("<td bgcolor='#00ff00'>".encode('utf-8'))
      else:
        s.wfile.write("<td bgcolor='#ff0000'>".encode('utf-8'))
      s.wfile.write(str(x+i).encode('utf-8')+"</td> ".encode('utf-8'))
      if not ((x+1) % 10): s.wfile.write("</tr>".encode('utf-8'))
    s.wfile.write("</table></body></html>".encode('utf-8'))
http.server.HTTPServer(("",80),myHandler).serve_forever()
EOF
nohup python3 /usr/local/sbin/getprimes.py >/dev/null 2>&1 &

(2) Gemini에게 스크립트 내용 설명 요청 (Optional)

You are an Application Developer at Cymbal AI.
A new team member needs help understanding this startup script, which is used to run a public-facing web server written in the Python file getprimes.py.
Explain the frontend.sh script in detail. Break down its key components, the commands used, and their function within the script.

For suggested improvements, do not make any changes to the file's content.

귀하는 심벌 AI의 애플리케이션 개발자입니다.
새로운 팀원이 Python 파일 getprimes.py 로 작성된 공개 웹 서버를 실행하는 데 사용되는 이 시작 스크립트를 이해하는 데 도움이 필요합니다. 
frontend.sh 스크립트에 대해 자세히 설명합니다.
스크립트의 주요 구성 요소, 사용된 명령어 및 스크립트 내 기능을 세분화합니다.

제안된 개선 사항을 위해 파일의 내용을 변경하지 마십시오.

(3) Frontend 인스턴스 생성

# Zone 수정 필요
gcloud compute instances create frontend --zone=ZONE \
--metadata-from-file startup-script=frontend.sh \
--tags frontend --machine-type=e2-standard-2

(4) Frontend 방화벽 설정

gcloud compute firewall-rules create http2 --network default --allow=tcp:80 \
--source-ranges 0.0.0.0/0 --target-tags frontend

➡️ 이 서버는 공개 서버이므로 다음 명령어를 실행하여 인터넷의 모든 위치(0.0.0.0/0)에서 포트 80의 트래픽이 이동할 수 있도록 방화벽을 열어야 한다.

(5) Frontend 인스턴스 생성 확인


➡️ Compute Engine > VM instances


8. 웹 브라우저에서 실행

(1) Default


➡️ 행렬이 표시되며 100까지의 모든 소수가 녹색으로 표시된다.

(2) 경로에 숫자 추가


➡️ 경로에 넣은 숫자부터 시작하는 모든 소수를 확인할 수 있다.

참고✅

이전 포스팅의 부하 분산기와 동일하게 L7 Application 부하 분산기인데 다른 점은, 이전 포스팅의 부하 분산기는 인터넷상의 일반 사용자를 타켓으로 하고 이번 포스팅의 부하 분산기는 VPC 내부의 다른 VM을 타켓으로 한다는 점이다.
따라서, 이전 포스팅의 부하 분산기는 전 세계 어디서나 접속이 가능하지만 이번 포스팅의 부하 분산기는 같은 네트워크 내 VM끼리만 통신이 가능하다.

  • 이전 포스팅: 사용자가 브라우저에 주소를 치고 들어오면, 여러 대의 lb-backend-group 서버 중 하나로 연결하여,이때 사용자는 Page served from: vm-name이라는 문구를 보게 된다.
  • 이번 포스팅: 이 웹 페이지가 단순히 텍스트만 보여주는 게 아니라, "복잡한 계산(소수 판별)"이 필요하기 때문에 웹 서버가 직접 계산하는 게 아니라, 로드밸런서가 계산만 전문으로 하는 내부 서버들에게 할당한다.
profile
새싹 개발자

0개의 댓글