EMD Blog

[GCP] Compute Engine에 대해 알아보자(1) - VM Instance 본문

Public Cloud/GCP

[GCP] Compute Engine에 대해 알아보자(1) - VM Instance

EmaDam 2022. 1. 2. 18:07

Compute Engine

GCP Compute Engine은 GCP에서 제공하는 컴퓨팅 및 호스팅 서비스이다. 사용자들은 이 Compute Engine 서비스를 통해 쉽게 원하는 사양의 VM을 생성할 수 있으며 그에 따른 다양한 서비스들을 제공하고 있다. 아무래도 GCP내에서 말 그대로 컴퓨터를 담당하고 있기 때문에 Cloud를 처음 접한다면 IAM보다 일찍 접하게 되는게 이 Compute Engine 서비스가 될 것이다. 

 

 이 서비스를 사용하기에 앞서 먼저 생각해야 할 것이 있다. Cloud를 사용하고자 하는 이유는 공부일 수도 있고, 회사에서 마이그레이션 하려는 이유일 수도 있고, 그 외에도 다양한 이유가 있을 것이지만 중요한 것은 마냥 가격이 저렴해서 사용하는 것은 아니라는 걸 명심하자. 만약에 랜딩 페이지 같은 가벼운 것을 배포하는 것이 목적이라면 그냥 카페24같은 곳에서 웹호스팅을 하는 것이 더 저렴하다. 

 

그럼 Compute Engine에서 제공하는 서비스 들을 하나씩 알아보자. 

 

VM Instance

 VM Instance.. 정말 이름이 명확하다. 말 그대로 가상 머신 인스탄스다. 가상 머신을 사용했던 사람이라면 굳이 설명이 필요없겠지만 가상 머신을 사용해보지 않았다면 다음과 같은 상황을 생각해보자. 지금 Windows10이 설치된 컴퓨터를 사용하고 있는데 갑자기 리눅스가 사용하고 싶어졌다고 생각해보자. 이유는 뭐 별거없다 그냥 리눅스 공부가 하고싶어졌다 치자. 그렇다고 Windows를 밀어버리는 것은 싫다. 그럴 때는 가상 머신이란 것을 사용해서 해당 OS를 추가로 설치해 사용할 수 있다. 중요한 것은 부트캠프 처럼 디스크 자체를 파티션으로 나눠버리는 것이 아니라 가상 머신이라는 소프트웨어에서 OS가 실행중인 동안 하드웨어 자원을 빌려주는 방식이라는 것이다. 

 

 GCP는 여러 Region 내, 여러 zone에 굉장히 큰 데이터 센터를 운영하고 있고 여기서 위와 같은 방법으로 사용자의 요구사항에 맞춰 VM Instance를 만들어 주고 있다. 자세하게 살펴보면 굉장히 복잡하겠지만 간단하게 보면 이렇다. 그렇다면 이렇게 퍼블릭 클라우드 회사에서 제공해주는 VM Instance를 쓰면 본인 컴퓨터나 회사 IDC에서 운영 중인 서버를 사용하는 것에 비해 어떤 장점이 존재할까? 뻔하지만 사용이 편하고, 고가용성을 보장하고, 자원을 유연하게 사용할 수 있다. 자세한 것은 아래의 링크로 들어가서 영상들을 쭉 보고오자. AWS의 영상이긴 하지만 대부분 Public Cloud가 추구하고자 하는 궁극적인 목표는 같기 때문에 상관없다. 또한 영상이 굉장히 잘 되어 있어서 보기에도 지루하지 않다. 스마트폰으로도 가볍게 볼 수 있으니 참고하자. 

 

AWS의 Cloud 기초 영상

 

VM Instance 생성

 그럼 이번에도 목표를 잡고 진행을 해보자. 이번 목표는 리눅스 서버 (Ubuntu)와 윈도우 서버를 만들고 로드밸런서를 연결하는 것이다. 

 

먼저 VM Instance를 만들기 전에 고려해야하는 것들을 생각해보자. 

 

- OS : 아마도 제일 먼저 생각하게 되는 것이지 싶다. 단순하게 Linux를 사용할 것이다, Windows를 사용할 것이다 이렇게 보다는 좀 깊게 생각할 필요가 있다. OS에는 버전이 존재하고 단순히 공부 용도가 아니라면 EOL 등의 문제가 있기 때문에 배포 및 설치할 어플리케이션에 대해 OS 의존성이 존재하는 지 잘 확인해야한다. 생각보다 OS들의 EOL이 짧아서 익숙하다고 너무 옛날 버전을 사용하면 나중에 귀찮은 일이 발생할 수 있다. 또한 일부 유료 OS같은 경우 라이선스가 포함되어 있는 지 확인해봐야한다. 라이선스를 GCP에서 과금하는 방식이라면 지원도 GCP에서 해주며, 라이선스를 직접 구매해서 사용한다면 지원은 구매처에서 받아야한다. 추가로 라이선스에 대해 더 얘기해보면 서드 파티 솔루션의 경우도 GCP에서 관리하는 이미지가 종종 있기 때문에 잘 확인하면 편하게 관리할 수 있으니 이미지 마켓에서 꼭 확인해보자. 대표적인 예로 MS SQL Server가 있다. 

- 머신 유형 : 우리가 설치(또는 배포)할 어플리케이션의 요구사항이나 예상 트래픽을 생각해 CPU나 메모리를 어떻게 구성할 지 생각해야한다. 머신 유형은 크게 범용, 컴퓨팅 최적화, 메모리 최적화, 가속기 최적화로 나뉘는 데 특별한 하드웨어 요구사항이 없는 경우라면 범용(가성비), CPU 성능이 중요하면 컴퓨팅 최적화, 메모리가 많이 필요하면 메모리 최적화, 머신러닝이나 고성능 컴퓨팅을 원하면 가속기 최적화를 사용하면 된다. 위에서는 크게 4가지로만 구분해서 나눴지만 그 하위에 종류가 굉장히 많기 때문에 이 정도로만 알고 있고 나머지는 요구 사항을 먼저 확인 후 거기에 맞는 유형을 찾아서 적용하는 것이 좋다.(커스텀으로 스스로 조절할 수도 있다.) 그래도 문서는 한번 훑어 보는 것을 추천한다.

 

머신 계열 문서

 

- 스토리지 : 보통 Instance를 생성할 때는 OS가 설치될 루트 볼륨을 생성해서 장착하고 필요에 따라 추가 디스크를 장착하거나 Cloud Storage를 사용할 수도 있다. 또한 NFS 같은 파일 스토리지를 만들어 마운트해 사용할 수도 있다. 이 부분은 아래 설명하기 보다는 아래의 문서를 보고 자신이 필요한 유형의 스토리지를 선택하는 것이 좋다. 

 

스토리지 옵션 문서

Cloud Storage 클래스 문서

 

이 외에도 네트워크나 보안적인 부분을 생각해야하지만 그것까지 다루면 너무 양이 많아지니 일단 이렇게만 생각하고 구성해보자.

 

우리는 공부 용도이기 때문에 딱히 성능이나 용량을 신경쓸 필요가 없다. 그렇기 때문에 머신 유형은 범용에서 가장 저렴한 것을 쓰기로 하자. 스토리지도 딱히 쓸일이 없으므로 OS 이미지의 최소 요구사항만 만족하는 용량으로 설정하도록 한다. OS는 위에서 말한 것처럼 Ubuntu와 Windows이며, 버전의 경우 Ubuntu는 20.04, Windows Server는 2019를 사용하기로 하자.  

 

Linux VM을 생성하는 방법은 이 포스팅을 참고해서 진행하자. 만약 따로 IAP설정이 되어있다면 아래 명령어를 사용해 VM만 만들자.

gcloud compute instances create 명령어

$ gcloud compute instances create study-web-dev-1 \
--zone=asia-northeast3-a \
--machine-type=f1-micro \
--image=ubuntu-minimal-2004-focal-v20211209 \
--image-project=ubuntu-os-cloud \
--boot-disk-size=10GB \
--boot-disk-type=pd-balanced \
--boot-disk-device-name=study-web-dev-1


NAME             ZONE               MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP       EXTERNAL_IP      STATUS
study-web-dev-1  asia-northeast3-a  f1-micro                   xxx.xxx.xxx.xxx   xxx.xxx.xxx.xxx  RUNNING

아래 명령어로 인스턴스가 잘 생성 되어 있는지 확인해보자. 

gcloud compute instances list 명령어

$ gcloud compute instances list

NAME             ZONE               MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP       EXTERNAL_IP      STATUS
study-web-dev-1  asia-northeast3-a  f1-micro                   xxx.xxx.xxx.xxx   xxx.xxx.xxx.xxx  RUNNING

인스턴스가 잘 생성된 것이 보인다. 이제 여기에 IAP 터널링을 통해 접속해보자. 외부 IP가 지정되어 있으니 꼭  --tunnel-through-iap 옵션을 사용해주어야한다.  --tunnel-through-iap 옵션은 강제로 터널링을 사용하도록 하게 해주는 옵션이다.

gcloud compute ssh 명령어

$ gcloud compute ssh study-web-dev-1 --tunnel-through-iap

인스턴스만 띄워 놓으면 허전하니까 WEB 서버를 띄워놓자.  WEB Server는 apache를 띄우겠다.

# 패키지 업데이트 후 apache2 설치
$ sudo apt update
$ sudo apt install apache2

# 재부팅 후 자동실행이 되도록 설정되어 있는지 확인 (enabled로 표시되면 자동실행)
$ sudo systemctl is-enabled apache2.service

# 만약 자동실행 되지 않는다면 enabled
$ sudo systemctl enable apache2.service

# apache 서버 실행
$ sudo systemctl start apache2.service

WEB 페이지가 잘 표시되는지 확인해보자.

$ curl localhost
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
...

 

리눅스 VM은 생성했으니 이제 Windows Server를 생성하자. Windows Server의 경우 2019버전을 사용할 것이다. 참고로 Windows 이미지는 Windows 라이선스가 포함되어 있다. 

 

그럼 먼저 Windows Server 이미지를 확인해보자. 어떻게 검색해야 될지 모를때는 그냥 넓게 검색해서 원하는 걸 찾도록 하자. 검색은 아래 명령어로 할 수 있다.

gcloud compute images list 명령어

$ gcloud compute images list | grep windows
windows-server-2004-dc-core-v20211216                 windows-cloud        windows-2004-core                             READY
windows-server-2012-r2-dc-core-v20211216              windows-cloud        windows-2012-r2-core                          READY
windows-server-2012-r2-dc-v20211216                   windows-cloud        windows-2012-r2                               READY
windows-server-2016-dc-core-v20211216                 windows-cloud        windows-2016-core                             READY
sql-2012-enterprise-windows-2012-r2-dc-v20211216      windows-sql-cloud    sql-ent-2012-win-2012-r2                      READY
sql-2012-standard-windows-2012-r2-dc-v20211216        windows-sql-cloud    sql-std-2012-win-2012-r2                      READY
sql-2012-web-windows-2012-r2-dc-v20211216             windows-sql-cloud    sql-web-2012-win-2012-r2                      READY
....

windows 단어로만 검색했으니 결과가 엄청나게 많이 나올 것이다. 그래도 원하는 이미지 찾는건 어렵지 않으니 한번 뒤져보자. 우리가 찾는 것은 2019이다. 걸러서 골라보면 아래 정도로 추릴 수 있다.

windows-server-2019-dc-core-for-containers-v20211216  windows-cloud        windows-2019-core-for-containers              READY
windows-server-2019-dc-core-v20211216                 windows-cloud        windows-2019-core                             READY
windows-server-2019-dc-for-containers-v20211216       windows-cloud        windows-2019-for-containers                   READY
windows-server-2019-dc-v20211216                      windows-cloud        windows-2019                                  READY
sql-2019-enterprise-windows-2019-dc-v20211216         windows-sql-cloud    sql-ent-2019-win-2019                         READY
sql-2019-standard-windows-2019-dc-v20211216           windows-sql-cloud    sql-std-2019-win-2019                         READY
sql-2019-web-windows-2019-dc-v20211216                windows-sql-cloud    sql-web-2019-win-2019                         READY

같은 2019인데도 뭐가 많은데 이름을 잘 확인하면 원하는 것을 최종적으로 골라낼 수 있다. 먼저 보이는 이미지는 core가 붙어 있다. core는 GUI가 없고 훨씬 가벼운 버전이라고 생각하면 된다. 자세한 내용은 이 문서를 확인하자. 그럼 core는 일단 넘어가고, container인데 일단 container를 사용할 일은 없으니 이것도 넘어가자. 이번엔 sql이다. sql은 SQL Server 라이선스가 포함되어 있어 금액이 비싸니 꼭 필요한 경우가 아니면 넘어가도록 하자. 그러면 windows-server-2019-dc-v20211216 하나만 남게 된다. 이 이미지로 VM을 만들어 보도록 하자. 위에서 만들었던 VM에서 몇 가지 정보만 변경해주면 된다.

 

Container 워크로드를 위한 이미지란?

더보기

GCP에서는 Container 워크로드를 위한 Container-Optimized OS 이미지를 제공한다. 이 이미지는 기본적으로 Docker 런타임과 Cloud-init이 미리 설치되어 있으며, 구글에서 유지 관리하고 오픈소스인 Chromium OS 프로젝트를 기반으로 하고 있다. Container-Optimized OS 이미지를 사용하기 위해서는 이미지 프로젝트로 cos-cloud를 검색하거나 이미지 명으로 cos를 검색하면 된다. Container-Optimized OS 이미지는 접두사로 cos가 붙는다.

 

참고로 Container에 최적화 되었다고 해서 무조건 Container-Optimized OS인 것은 아니고 위의 두 번째 문장에 있는 조건을 만족하는 OS들만 Container-Optimized OS라고 부른다. 그렇기 때문에 다른 회사에서 제공하는 Container 최적화 이미지는 cos-cloud 프로젝트에 속해 있지 않으며 접두사도 붙지 않는다. Container 최적화 이미지를 회사별로 보고 싶다면 아래 문서를 확인하자. 

Container 최적화 VM 이미지 

 

그리고 Container-Optimized OS에 대해 궁금하다면 아래 문서들을 보도록 하자.

Container-Optimized OS 개요

Container-Optimized OS 인스턴스 만들기

$ gcloud compute instances create study-web-dev-2 \
--zone=asia-northeast3-a \
--machine-type=f1-micro \
--image=windows-server-2019-dc-v20211216 \
--image-project=windows-cloud \
--boot-disk-size=50GB \
--boot-disk-type=pd-balanced \
--boot-disk-device-name=study-web-dev-2


NAME             ZONE               MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP       EXTERNAL_IP      STATUS
study-web-dev-2  asia-northeast3-a  f1-micro                   xxx.xxx.xxx.xxx   xxx.xxx.xxx.xxx  RUNNING

바뀐 부분 중 신경써야할 부분은 disk-size가 50GB가 된 것이다. 이미지마다 최소 요구 사이즈가 다르니 확인하도록 하자. 만약에 너무 낮게 잡아서 생성하면 높이라고 메세지가 출력된다. 친절하게 필요 용량까지 알려주니 그대로 반영하도록 하자. 

 

그럼 계정 설정을 해보자. Windows의 계정 설정은 아래처럼 하면 된다.

gcloud compute reset-windows-password 명령어

# 비밀번호 리셋
gcloud compute reset-windows-password <WINDOWS_VM_NAME> 

# 정보 확인
This command creates an account and sets an initial password for the
user [<username>] if the account does not already exist.
If the account already exists, resetting the password can cause the
LOSS OF ENCRYPTED DATA secured with the current password, including
files and stored passwords.

For more information, see:
https://cloud.google.com/compute/docs/operating-systems/windows#reset

Would you like to set or reset the password for [<username>] (Y/n)? Y

# 비밀번호 확인
Resetting and retrieving password for [<username>] on [<instance-name>]
Updated [https://www.googleapis.com/compute/v1/projects/project-name/zones/zone/instances/instance-name].
ip_address: <ip-address>
password:   <password>
username:   <username>

 

이렇게 VM이 생성되었다면 접속을 해보자. Windows는 RDP를 사용한다. RDP 포트는 3389이며, 역시나 IAP를 사용할 것이기 때문에 방화벽을 설정해주어야한다.

gcloud compute firewall-rules create 명령어

$ gcloud compute firewall-rules create allow-rdp-ingress-from-iap \
  --direction=INGRESS \
  --action=allow \
  --rules=tcp:3389 \
  --source-ranges=35.235.240.0/20

이전에 설정된 ssh 방화벽을 수정해도 상관없다. 그럴때는 gcloud compute firewall-rules update 명령어를 사용하자. 

$ gcloud compute firewall-rules update allow-ssh-ingress-from-iap \
  --rules=tcp:22,tcp:3389

이제 접속을 위한 클라이언트 프로그램을 설치하자. mac Appstore에서 Microsoft Remote Desktop을 검색해 설치한다.

다른 OS도 RDP를 지원하는 클라이언트 프로그램을 아무거나 사용하면 된다. 설치했으면 gcloud compute start-ipa-tunnel 명령어를 사용해 암호화된 포트를 생성한다.

$ gcloud compute start-iap-tunnel <WINDOWS_VM_NAME> 3389 \
    --local-host-port=localhost:<LOCAL_PORT> \
    --zone=asia-northeast3-a

<WINDOWS_VM_NAME>에는 아까 생성한 Windows VM 명을, <LOCAL_PORT>에는 로컬에서 연결할 포트를 입력하자. 포트는 현재 사용중이지 않은 포트를 입력하면 되며, 포트에 0을 입력하면 자동으로 사용중이지 않은 포트를 찾아 사용하게 된다. 

Picking local unused port [xxxx].
Testing if tunnel connection works.
Listening on port [xxxx].

위 처럼 표시된다면 성공적으로 연결된 것이다. 이제 RDP 클라이언트를 실행해 localhost:<LOCAL_PORT>로 연결하자 <LOCAL_PORT>를 0으로 했다면 L:istening on port 옆에 표시된 포트를 입력하면 된다. 그러면 계정과 비밀번호를 입력하라고 표시될텐데 위에서 설정한 계정과 비밀번호를 입력하면 성공적으로 접속되는 것을 볼 수 있다.

 

이렇게 간단하게 리눅스 VM과 윈도우 VM을 생성해보았다. 다음 포스팅에서는 MIG에 대해 알아보고 설정 해보자.