Vagrant 와 Virtual Box 로 간단하게 가상화 환경 구축하기 (Window OS 기준)

식빵·2023년 10월 25일
0

CI CD

목록 보기
4/8
post-thumbnail

참고로 Vagrant 세팅 과정은 제 컴퓨터의 운영체제인 Window 기준 방식입니다.
Vagrant 는 Mac 과 Window 의 세팅법이 많이 다를 수 있습니다.
Mac 사용자시면 멀티OS 사용을 위한 가상화 환경 구축 가이드 (Docker + Kubernetes)
강의를 참고하기 바랍니다. 무료이니 부담없이 들을 수 있습니다.


가상화란?

컴퓨터에서 사용되는 물리적인 cpu, storage, network(NIC) 등을 소프트웨어화하는 것이다. 이때 소프트웨어화라는 표현을 우리는 "가상화"라고도 한다.
ex: 클라우드 컴퓨팅

그런데 가상화는 경우 따라 물리적인 컴퓨터 자원의 영역을 넘어서기도 한다.

가상화의 영역은 컴퓨터 자원과 그 위에서 실행되는 운영체제까지 포함될 수도 있고,
심지어는 컴퓨터 자원 + 운영체제 + application 까지도 포함될 수 있다.

그러므로 가상화의 영역은 어떤 문맥에서 사용하냐에 따라 다를 수 있다.
바로 다음 목차에서 보는 HyperVisor 의 경우에는
운영체제까지가 바로 가상화의 영역이다.




HyperVisor

물리적인 server 또는 Host OS 위에 설치되는 소프트웨어이며,
server 또는 Host OS 가 사용하는 물리적인 CPU, RAM, NETWORK 등의 컴퓨터 자원을
미리 pooling 하고, 가상 운영체제 환경에 할당해주는 소프트웨어다.

HyperVisor 제품들은 주로 물리적인 컴퓨터 자원을 미리 설정할 수 있는
기능을 제공한다.

또한 추가적으로 각 가상 운영체제 환경이 서로의 자원에 침범(Conflict) 하는 현상을
미연에 방지하는 보안적인 환경도 기본으로 제공한다.

이러한 HyperVisor (이 글에서는 Type2 HyperVisor) 제품으로는
Oracle VirtualBox, VmWare 등이 있다.

이 글에서는 Vagrant 와 연동을 하기 위해서 Oracle VirtualBox
내용을 진행할 예정이다.

Vagrant + VmWare 조합도 가능은 하지만 사용하려면 돈을 내야 한다.


좀 더 보충하기 위해서 아래 영상을 참고하자.
많은 걸 배울 수 있다.




Vagrant

가상화 인스턴스 관리 SW 이며, Provisioning Tool 이다.
Provisioning 은 IT 인프라를 생성, 설정하는 프로세스이다.
다양한 리소스에 대한 사용자 및 시스템 액세스를 관리하는 데 필요한 단계를 포함하며,
사용자 요구에 맞게 시스템 자원을 할당, 배치, 배포가 가능케 해준다.

말이 화려하지만 단순하게 말하자면
Oracle VirtualBox 만 쓰면 일일이 해야되는 수작업들을 좀 더 자동화해주고,
결과적으로 VM Instance 의 관리에서 많은 편의성을 제공받는다.




Vagrant + Oracle VirtualBox 설치(Window 기준)

Vagrant 설치


참고: AMD64, I868 중 어떤 걸 다운로드 받아야할지 모르면?
ChatGPT 에게 물어보면 된다. 아래는 ChatGPT 의 친절한 답변이다.

  • 자기가 64 비트 체계 시스템이면 무조건 AMD64 를 선택하면 된다는 거다.

이후에는 설치 프로그램이 생기면, 해당 프로그램을 실행시켜서 계속 Next, Next 를
클릭해서 설치를 완료해주자. 다 설치하고 나서 컴퓨터 껐다가 키라고 한다.
껐다가 켜주자.

참고로 Vagrant 는 UI 를 제공하지 않는다.
오로지 CLI 에서만 사용하도록 만들어진 프로그램이다.


Virtual Box 설치

이후에 설치 파일이 다운로드 되는데,
바로 실행시켜서 계속 Next, Next 클릭 하다보면 설치된다.




VirtualBox - VM Instance 생성법

이 글은 Vagrant 를 통해서 VM Instance 를 생성할 예정이므로,
이 목차는 생략한다. 궁금하신 분들은 이 글을 참고하길 바란다.




Vagrant 로 VM Instance 생성하기

여기서는 최대한 중요한 것만 추려서 작성했지만
필요하다면 Vagrant 공식문서를 참고하길 바란다.

Vagrant BOX 선정

먼저 vagrant 가 인스턴스화할 운영체제, 즉 BOX 를 먼저 선정해야 한다.
BOX 는 Vagrant 가 Vm Instance 생성 시 사용할 운영체제라고 생각하면 된다.
BOX 는 https://app.vagrantup.com/boxes/search 에서 검색해서 선정하면 된다.

BOX 의 명칭은 바로 다음에 볼 Vagrantfile 작성 에서
config.vm.box = 'generic/ubuntu2004' 처럼 사용된다.

VM Instance 를 생성하고, 그 위에 운영체제를 generic/ubuntu2004 Box
를 사용해서 설치하겠다는 의미다.


Vagrantfile 작성

Vagrant 는 Vagrantfile 이라는 스크립트를 작성해서
필요한 Vm Instance 생성 관련 설정들을 작성하고 실행시킬 수 있다.
지금부터 이 Vagrantfile 이라는 것을 작성해보자.

먼저 자기 컴퓨터에서 아무 디렉토리를 만들고,
그 안에 Vagrantfile 라는 명칭의 파일을 을 생성한다.
그리고나서 해당 파일을 편집기로 열고 생성할 VM 에 대한 설정을 작성해주면 된다.

다만 VM Instance 를 한 개 생성할지, 한 개 이상을 생성할 지에 따라서
약간 설정법이 다르다. 2가지 방식 모두 기재했으니 참고하기 바란다.


VM 한 개만 생성할 때

Vagrant_API_Version="2"
Vagrant.configure(Vagrant_API_Version) do |config|
  config.vm.box = 'generic/ubuntu2004'
  config.vm.hostname = 'webserver'
  config.vm.provider:virtualbox do |vb|
  	vb.name="K8s-Master"
    vb.cpus = 2
    vb.memory = 2048
    # vb.customize [ "modifyvm", :id, "--uartmode1", "disconnected" ]
    # vb.customize [ "modifyvm", :id, "--uartmode1", "file", File::NULL ]
    # vb.customize [ "modifyvm", :id, "--uart1", "0x3F8", "4" ]
    # vb.customize [ "modifyvm", :id, "--cableconnected1", "on" ]
  end
  config.vm.synced_folder ".", "/vagrant"
  config.vm.network "private_network", ip: "192.168.32.10"
  config.vm.provision "shell", path: "sshd_config.sh"
  config.vm.network "forwarded_port", guest: 22, host: 21022, auto_correct: false, id: "ssh"
end



VM 한 개 이상 생성할 때

출처: https://github.com/joneconsulting/vagrant/blob/main/scripts/Vagrantfile

# -*- mode: ruby -*- 
# vi: set ft=ruby :

Vagrant_API_Version="2"

Vagrant.configure(Vagrant_API_Version) do |config|
  # Node01
  config.vm.define "k8s-node01" do |cfg|
    cfg.vm.box = "generic/ubuntu2004"
    cfg.vm.box_version = "3.1.16"
    cfg.vm.provider:virtualbox do |vb|
      vb.name = "K8s-Node01"
      vb.cpus = 1
      vb.memory = 1024
      # vb.customize [ "modifyvm", :id, "--uartmode1", "disconnected" ]
      # vb.customize [ "modifyvm", :id, "--uartmode1", "file", File::NULL ]
      # vb.customize [ "modifyvm", :id, "--uart1", "0x3F8", "4" ]
      # vb.customize [ "modifyvm", :id, "--cableconnected1", "on" ]
    end
    cfg.vm.hostname = "k8s-node01"
    cfg.vm.network "private_network", ip: "192.168.32.11"
    cfg.vm.network "forwarded_port", guest: 22, host: 24022, auto_correct: false, id: "ssh"
    # cfg.vm.network "forwarded_port", guest: 80, host: 40080
    cfg.vm.provision "shell", path: "sshd_config.sh"
  end

  # Master
  config.vm.define:"k8s-master" do |cfg|
    cfg.vm.box = "generic/ubuntu2004"
    cfg.vm.provider:virtualbox do |vb|
        vb.name="K8s-Master"
        vb.cpus = 2
        vb.memory = 2048
        # vb.customize [ "modifyvm", :id, "--uartmode1", "disconnected" ]
        # vb.customize [ "modifyvm", :id, "--uartmode1", "file", File::NULL ]
        # vb.customize [ "modifyvm", :id, "--uart1", "0x3F8", "4" ]
        # vb.customize [ "modifyvm", :id, "--cableconnected1", "on" ]
    end
    cfg.vm.hostname = "k8s-master"
    cfg.vm.synced_folder ".", "/vagrant"
    cfg.vm.network "private_network", ip: "192.168.32.10"
    cfg.vm.network "forwarded_port", guest: 22, host: 21022, auto_correct: false, id: "ssh"
    cfg.vm.provision "shell", path: "sshd_config.sh"
  end
end

참고1 : vb.customize 설정

여기서 주석처리한 vb.customize 설정들은 모두
SSH auth method: private key 실행 시 멈춤 현상 때문에 기재한 것이다. 가끔 이상하게 SSH auth method:~ 라고 나오는 부분에서
VM Instance 생성이 완전히 멈춰버리는 현상이 생기는 경우가 있다.
만약에 자신이 그렇다면 위 주석처리한 설정을 활성화해서 다시 vagrant up 하자.

참고2 : Vagrantfile 에서 사용된 sshd_config.sh 의 내용은 아래와 같다.

#! /usr/bin/env bash

now=$(date +"%m_%d_%Y")
cp /etc/ssh/sshd_config /etc/ssh/sshd_config_$now.backup
sed -i -e 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
systemctl restart sshd

이는 ssh 접속이 허용되도록 하기 위한 세팅 쉘 스크립트다.
이 파일은 Vagrantfile 과 동일한 디렉토리에 넣어줘야 한다.




vagrant 명령어

이제 Vagrantfile 이 있는 경로 상에서 cmd(또는 pwsh) 을 실행시켜서
Vagrant 명령어를 사용해보자.


1. vagrant status

현재 vm instance 의 운영상태를 보여준다.
vagrant status 를 통해서 나오는 명칭(화면 좌측에 나오는 문구)들은
다음부터 사용될 명령어들에 덧붙여서 사용될 수 있다.

  • ex) Multi VM 의 경우: vagrant up k8s-master
  • ex) Single VM 의 경우: vagrant up default

참고: 현재 명령어를 실행하는데 사용하는 Vagrantfile 에 정의되어 있진 않지만,
다른 경로의 Vagrantfile 에 의해서 실행중인 vm instance 가 있는지
확인하고 싶다면 vagrant global-status 로 조회할 수 있다.

이 명령어를 통해서 ID 를 얻을 수 있는데,
vagrant destroy ID 처럼 사용해서 VM Instance 를 관리할 수 있다.


2. vagrant up

이 명령어를 사용하면 vm instance 가 생성된다.
또한 이미 생성되어 있지만 멈춰있는 인스턴스가 있다면 재실행시켜 준다.

참고:
Downloading: https://vagrantcloud.com/generice/... 라는 문구에서
다음으로 진행이 안되고 멈춘 거 같은 느낌을 받을 수 있다.
파일 크기가 1G 가 넘어서 느린 것 뿐이니 안심하길 바란다.
나의 경우에는 3~4분 정도 걸린듯하다.

virtual box ui 를 켜보면 확인할 수 있다.



3. vagrant halt

vm instance 를 shut down 시킨다 (=전원 OFF).



4. vagrant suspend

vm instance 를 중지시킨다.
다시 실행시키고 싶으면 vagrant up 명칭 을 입력하면 된다.



5. vagrant destory

vm instance 를 삭제한다.



6. vagrant ssh

vagrant 를 통해서 vm instance 에 ssh 프로토콜을 사용한 로그인이 가능하다.

# ssh 다음에 입력하는 명칭은 vagrant status 를 입력했을 때 
# 나오는 명칭을 입력하면 된다.
vagrant ssh k8s-master

이후에 비번을 입력하라고 하는데,
기본적으로 passwordvagrant 이다.


7. (응용) host 로 파일 복사

vagrant ssh -c "sudo cat /etc/ssh/sshd_config" > sshd_config

가끔 필요하다. 반대로 host -> vm 으로 파일 전송이 필요하면 이 링크를 참조하자.




참고 링크

profile
백엔드를 계속 배우고 있는 개발자입니다 😊

0개의 댓글