본문 바로가기

Biusiness Insight/Computer Science

[구글 클라우드 플랫폼] 네트워크 및 HTTP 부하 분산 설정하기

반응형

source : GCP qwiklabs

 

Google Cloud Shell 활성화하기

 

1. GCP Console의 오른쪽 상단 툴바에서 Cloud Shell 열기 버튼을 클릭

 

2. 계속 (Continue) 클릭

 

3. 연결 확인

 

사용 중인 계정 이름 목록 표시

gcloud auth list

 

출력:

Credentialed accounts: - <myaccount>@<mydomain>.com (active)

 

출력 예:

Credentialed accounts: - google1623327_student@qwiklabs.net

 

프로젝트 ID 목록 표시

gcloud config list project

 

출력:

[core] project = <project_ID>

 

출력 예:

[core] project = qwiklabs-gcp-44776a13dea667a6

 

기본 리전 및 영역(zone) 설정

 

Cloud Shell에서 기본 영역 설정

gcloud config set compute/zone us-central1-a

 

기본 리전 설정

gcloud config set compute/region us-central1

 

- 리전 및 영역 관련 참고 : 리전 및 영역 문서

- 참고: 내 머신에서 gcloud를 실행하면 다른 세션에서도 config 설정이 유지됨. Cloud Shell에서는 신규 세션 시작 또는 재연결 시마다 새로 설정해야 함.

 

 

다중 웹 서버 인스턴스 만들기

- 머신 클러스터 제공을 시뮬레이션 : 인스턴스 템플릿  관리형 인스턴스 그룹을 사용하여 정적 콘텐츠를 제공하는 간단한 Nginx 웹 서버 클러스터를 생성.

- 인스턴스 템플릿 : 클러스터의 모든 가상 머신(디스크, CPU, 메모리 등)의 스타일 정의

- 관리형 인스턴스 그룹 : 인스턴스 템플릿을 사용하여 여러 가상 머신 인스턴스를 인스턴스화 함

 

Nginx 웹 서버 클러스터 생성

  • 모든 가상 머신 인스턴스 시작 시 Nginx 서버를 설정하는 데 사용할 시작 스크립트
  • 시작 스크립트를 사용하기 위한 인스턴스 템플릿
  • 대상 풀
  • 인스턴스 템플릿을 사용하는 관리형 인스턴스 그룹

Cloud Shell에서 모든 가상 시스템 인스턴스에서 사용할 시작 스크립트 생성 (스크립트는 시작 시 Nginx 서버 설정)

cat << EOF > startup.sh 
#! /bin/bash 
apt-get update 
apt-get install -y nginx 
service nginx start 
sed -i -- 's/nginx/Google Cloud Platform - 
'"\$HOSTNAME"'/' /var/www/html/index.nginx-debian.html 
EOF

 

시작 스크립트를 사용하는 인스턴스 템플릿 생성

gcloud compute instance-templates create nginx-template \ 
--metadata-from-file startup-
script=startup.sh

 

출력 : 

Created [...]. 
NAME MACHINE_TYPE PREEMPTIBLE 
CREATION_TIMESTAMP nginx-template n1-standard-1 2015-11-09T08:44:59.007-08:00

 

대상 풀 생성

대상 풀은 그룹의 모든 인스턴스에 단일 액세스 포인트를 사용할 수 있도록 하며 이후 단계에서 부하를 분산할 때 필요

gcloud compute target-pools create nginx-pool

 

출력 : 

Created [...]. 
NAME REGION SESSION_AFFINITY BACKUP 
HEALTH_CHECKS 
nginx-pool us-central1

 

인스턴스 템플릿을 사용하는 관리형 인스턴스 그룹 생성

gcloud compute instance-groups managed create 
nginx-group \ 
         --base-instance-name nginx \ 
         --size 2 \ 
         --template nginx-template \ 
         --target-pool nginx-pool

 

출력 : 

Created [...]. 
NAME LOCATION SCOPE 
BASE_INSTANCE_NAME SIZE TARGET_SIZE 
INSTANCE_TEMPLATE AUTOSCALED 
nginx-group us-central1-a zone nginx 
0 2 nginx-template no

 

이름이 nginx-로 시작되는 2개의 가상 머신 인스턴스가 생성됨 (몇 분 정도 소요될 수 있음)

 

Compute Engine 인스턴스 목록을 출력 (위에서 생성한 모든 인스턴스가 표시됨)

gcloud compute instances list

 

(결과)

NAME ZONE MACHINE_TYPE PREEMPTIBLE 
INTERNAL_IP EXTERNAL_IP STATUS 
nginx-7wvi us-central1-a n1-standard-1 
10.240.X.X X.X.X.X RUNNING 
nginx-9mwd us-central1-a n1-standard-1 
10.240.X.X X.X.X.X RUNNING

 

EXTERNAL_IP 주소를 통해 포트 80으로 머신과 연결할 수 있도록 방화벽을 구성

gcloud compute firewall-rules create www-firewall --allow tcp:80

 

위의 명령어를 실행함으로써 표시되는 외부 IP 주소(http://EXTERNAL_IP/)를 통해 각 인스턴스에 연결 가능.

 

 

네트워크 부하 분산기 만들기

- 네트워크 부하 분산을 사용하면 주소, 포트, 프로토콜 유형과 같은 수신 IP 프로토콜 데이터를 기준으로 시스템의 부하를 분산할 수 있으며, HTTP/HTTPS 부하 분산을 통해 제공되지 않는 옵션을 사용할 수 있음.

- 예 : SMTP 트래픽과 같은 추가 TCP/UDP 기반 프로토콜의 부하를 분산 가능하며, 애플리케이션이 TCP 연결 관련 특성을 사용하는 경우 네트워크 부하 분산을 통해 패킷을 검사할 수 있음. 이에 반해 HTTP/HTTPS 부하 분산은 이와 같은 작업을 지원하지 않음

(참조 : 네트워크 부하 분산 설정)

 

인스턴스 그룹을 대상으로 하는 L3 네트워크 부하 분산기 생성

gcloud compute forwarding-rules create nginx-lb \ 
          --region us-central1 \ 
          --ports=80 \ 
          --target-pool nginx-pool

 

출력 :

Created
[https://www.googleapis.com/compute/v1/projects/...].

 

프로젝트의 모든 Google Compute Engine 전달 규칙의 목록 출력

gcloud compute forwarding-rules list

 

출력 : 

NAME REGION IP_ADDRESS IP_PROTOCOL TARGET 
nginx-lb us-central1 X.X.X.X TCP us-central1/targetPools/nginx-pool

 

브라우저에서 http://IP_ADDRESS/로 부하 분산기에 접속 가능. IP_ADDRESS는 위 명령어를 실행하면 표시되는 주소

 

 

HTTP/HTTPS 부하 분산기 만들기

- HTTP/HTTPS 부하 분산은 인스턴스를 대상으로 하는 HTTP(S) 요청에 관한 글로벌 부하 분산을 제공.

- 일부 URL을 여러 특정 인스턴스로 전달하고 다른 URL은 다른 인스턴스로 전달하도록 URL 규칙을 구성할 수 있음

- 그룹의 용량이 충분하고 요청에 적합하다면 요청은 언제나 사용자와 가장 가까운 인스턴스 그룹으로 전달. 가장 가까운 그룹에 용량이 부족하다면 요청은 충분한 용량이 있는 그룹 중에서 가장 가까운 그룹으로 전송됨

- 참조 : HTTP/HTTPS 부하 분산기

 

상태 확인 생성

- 상태 확인을 통해 인스턴스가 HTTP/HTTPS 트래픽에 응답하는지 확인할 수 있음.

gcloud compute http-health-checks create http-basic-check

 

출력 : 

Created 
[https://www.googleapis.com/compute/v1/projects/...]. 
NAME HOST PORT REQUEST_PATH 
http-basic-check 80 /

 

인스턴스 그룹에 관한 HTTP 서비스를 정의하고 관련 포트에 포트 이름을 매핑 : 부하 분산 서비스가 이름이 지정된 포트로 트래픽을 전달함)

gcloud compute instance-groups managed \ 
       set-named-ports nginx-group \ 
       --named-ports http:80

 

출력 : 

Updated 
[https://www.googleapis.com/compute/v1/projects/...].

 

백엔드 서비스 생성

gcloud compute backend-services create nginx-backend \ 
        --protocol HTTP --http-health-checks http-basic-check --global

 

출력 : 

Created 
[https://www.googleapis.com/compute/v1/projects/...]. 
NAME BACKENDS PROTOCOL 
nginx-backend HTTP

 

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

gcloud compute backend-services add-backend nginx-backend \ 
       --instance-group nginx-group \ 
       --instance-group-zone us-central1-a \ 
       --global

 

출력 : 

Updated 
[https://www.googleapis.com/compute/v1/projects/...].

 

수신되는 모든 요청을 모든 내 인스턴스로 전달하는 기본 URL 맵을 만듬

gcloud compute url-maps create web-map \ 
       --default-service nginx-backend

 

출력 : 

Created 
[https://www.googleapis.com/compute/v1/projects/...].
NAME    DEFAULT_SERVICE
Web-map nginx-backend

 

- 요청된 URL에 따라 트래픽을 여러 인스턴스로 보내려면 콘텐츠 기반 라우팅을 참조

 

대상 HTTP 프록시를 만들어 URL 맵에 요청을 라우팅

gcloud compute target-http-proxies create http-lb-proxy \ 
      --url-map web-map

 

출력 : 

Created 
[https://www.googleapis.com/compute/v1/projects/...]. 
NAME URL_MAP
http-lb-proxy web-map

 

들어오는 요청을 처리하고 라우팅하는 글로벌 전달 규칙 생성

- 전달 규칙 : 명시된 IP 주소, IP 프로토콜 및 포트에 따라서 특정 대상 HTTP/HTTPS 프록시로 트래픽을 전송

- 글로벌 전달 규칙은 다중 포트를 지원하지 않음

gcloud compute forwarding-rules create http-content-rule \ 
       --global \ 
       --target-http-proxy http-lb-proxy \ 
       --ports 80

 

출력 : 

Created
[https://www.googleapis.com/compute/v1/projects/...].

 

전역 전달 규칙을 만든 후에 구성이 적용되는 데 몇 분 정도 소요될 수 있음

gcloud compute forwarding-rules list

 

출력 : 

NAME REGION IP_ADDRESS IP_PROTOCOL TARGET 
http-content-rule X.X.X.X TCP http-lb-proxy 
nginx-lb us-central1 X.X.X.X TCP us-central1/....

 

- 전달 규칙에 사용할 http-content-rule의 IP_ADDRESS를 기록해 두고, 브라우저에서 http://IP_ADDRESS/로 연결

- 3~5분정도 소요 (연결되지 않으면 잠시 기다렸다가 브라우저를 새로고침)

 

반응형