[42Seoul] Inception-of-things(IoT) Nested VM

tpwhzla·2024년 4월 9일

42Seoul

목록 보기
15/16

아우터서클 입성 후 두 번째 과제

트센 정리도 안 끝냈는데 벌써 아우터 2번째 과제 글을 적고 있다...

Cloud-1을 끝냈다. 인스턴스를 하나 빌려서 IaC(Ansible)로 배포하는 과제고, DevOps를 위해서는 Terraform은 필수, Ansible은 선택으로 한 번은 거쳐가야 할 과정이었기에 task, roles, inventory, playbook과 같은 문법을 정리하고 관련 글을 쓰려고 하는데... Nested VM 설정 과정에서 상당히 애를 먹었기 때문에 Google cloud를 활용한 Nested VM 설정 방법과 Vagrant 관련 환경 구성을 적어보려고 한다.

Nested VM

중첩 가상화를 말한다.
과제 자체가 가상머신을 통해서 실행 시키도록 되어있고, 가상머신 속에서 Vagrant를 이용하여 가상머신을 2개 작동시키는 과제인만큼 가상화를 중첩시키는 데에 그 의미가 있다.

문제는 이걸 하려고 클러스터 맥 (Intel AMD64)의 Virtualbox, 개인 노트북(M1 Mac ARM64)의 VMWare, AWS의 T2.medium 클라우드를 모두 사용해 보았는데 가상환경 속에서 Vagrant를 실행시킬 때마다

There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["startvm", "81049c5a-9bb0-4998-a3ec-cbbadc8ded1b", "--type", "headless"]

Stderr: VBoxManage: error: VT-x is not available (VERR_VMX_NO_VMX)
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component ConsoleWrap, interface IConsole

라는 에러와 함께 Nested VM이 작동하지 않았다.

이걸 클러스터 맥과 개인 노트북, AWS 인스턴스에 모두 Vagrant + Virtualbox를 설치해서 하려니 시간이 너무 오래 걸렸다.

본인이 대여한 클라우드 인스턴스나 가상환경에서 Nested VM을 지원하는지 확인할 수 있는 방법이 있다.

grep -cw vmx /proc/cpuinfo

해당 명령어를 본인의 linux 운영체제에 입력했을 때, 0이 아닌 다른 숫자가 나와야 한다.

sudo kvm-ok

해당 명령어를 입력해보면, 본인의 cpu가 kvm을 지원하는지 하지 않는지 알 수 있다.

KVM이 뭘까?

Linux 커널을 기반으로 하는 오픈 소스 가상화 기술이다. Linux가 하이퍼바이저로 작동할 수 있게 한다.
이를 사용하면 여러개의 리눅스 / 윈도우가 각각의 독립된 가상 머신으로 실행될 수 있다.

하이퍼바이저는 뭘까?

https://aws.amazon.com/ko/what-is/hypervisor/

구글 클라우드

gcloud CLI를 이용하여 NestedVM이 가능한 인스턴스 생성하기

https://cloud.google.com/compute/docs/instances/nested-virtualization/enabling?hl=ko

gcloud compute instances create iot \
  --zone=asia-northeast3-a \
  --machine-type=n1-standard-4 \
  --boot-disk-size=30GB \
  --image-family=ubuntu-2004-lts \
  --image-project=ubuntu-os-cloud \
  --enable-nested-virtualization

iot라는 이름의 클라우드 인스턴스를 생성한다, 리전은 한국이며 인스턴스 타입은 NestedVM을 지원한다는 N1 인스턴스이다. (그냥 N1을 선택하여 인스턴스를 만든다고 해서 Nested VM이 되는 것은 아니다.)

disk size는 넉넉하게 30GB를 잡았다. GUI 연결까지 하면 얼마나 용량이 필요할지 몰라서 스토리지를 크게 잡았다.
이미지는 virtualbox가 apt package에 이미 있는 ubuntu 20.04 LTS 버전을 선택했고, 인스턴스 생성 과정에서 마지막에 있는
--enable-nested-virtualization을 입력하여 nestedVM이 지원되도록 설정한다.

구글 클라우드 생성 후 ssh 연결하기

로컬 맥에서 구글 클라우드 인스턴스의 사용자와 일치하는 ssh 키를 발급 받는다.

ssh-keygen -t rsa -b 4096 -C "구글@gmail.com"

해당 명령어를 실행하면 키를 저장할 경로를 물어보고, 대화형에서 키의 이름을 입력하면 키.pub과 키 파일이 생성된다.
그 후 키에 대한 passphrase가 생성되는데, 이 때 비밀번호를 입력하도록 하자.

그렇게 하면 기본 경로인

~/.ssh/키.pub 네가제작한키

이렇게 파일이 2개가 생긴다.

구글 클라우드 인스턴스에 접속하기 위해 터미널에

cat ~/.ssh/키.pub

공개 키 파일을 읽어서 이를 복사하고, 나의 클라우드 구글 클라우드 왼쪽에 있는 메뉴 바 중 '메타 데이터' 를 클릭하여 들어간다.

이를 수정하여 cat으로 읽어온 공개키의 내용을 그대로 복사 붙여넣기 한다.

이후 터미널에

ssh -i ~/.ssh/키 구글아이디@외부IP

로 접속을 해보자. 키의 비밀번호를 입력하면 클라우드 인스턴스와 연결할 수 있을 것이다.

Virtualbox / Vagrant 설치하기

ubuntu 20.04 LTS version 기준

sudo apt-get update
sudo apt-get install -y virtualbox
sudo apt-get install -y vagrant

Mac의 Screen Sharing을 이용하여 구글 클라우드 컴퓨터 GUI를 로컬에서 조작하기

sudo apt-get update
sudo apt-get -y install ubuntu-desktop
sudo apt-get -y install tightvncserver
sudo apt-get -y install gnome-panel gnome-settings-daemon metacity nautilus gnome-terminal

ubuntu GUI와 vncserver / 화면 공유를 위한 파일을 설치한다.
클러스터 맥에서는 Screen sharing만 지원하기 때문에 굳이 vncserver를 설치했지만, google cloud는 기본적으로 화면 공유를 지원하는 툴과 포트가 열려있다.

vncserver는 보통 5901 포트를 사용하기 때문에, 나의 구글 클라우드 인스턴스에서 5901 포트를 열어주어야 한다.

구글 클라우드 인스턴스 - 방화벽 규칙 설정 - 방화벽 규칙 만들기로 들어가서 tcp 포트 5901을 열어주자.

5901 포트를 열어주었다면 vncserver를 실행시킨다.

vncserver :1

이후 xstartup 파일을 수정한다.

sudo vi ~/.vnc/xstartup

기존 내용들을 지우고 아래의 내용을 복붙하세요

#!/bin/sh

export XKL_XMODMAP_DISABLE=1
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey

vncconfig -iconic &
gnome-panel &
gnome-settings-daemon &
metacity &
nautilus &
gnome-terminal &

이후 vncserver를 종료하고 다시 시작한다.

vncserver -kill :1
vncserver :1

Mac에 기본적으로 설치되어있는 Screen sharing을 실행시키고 다음의 명령어를 입력한다.

처음 vncserver를 실행시켰을 때 설정했던 비밀번호를 입력하면, 짜잔! 서울 어딘가에 있는 구글 클라우드 컴퓨터를 조작할 수 있다.

profile
DevOps / Infrastructure / Cloud Native / Platform Engineering

0개의 댓글