IaC(Vagrant)로 가상 머신(CentOS) 생성하기

이전 포스팅에는 Vagrant 환경을 구축하고 가상머신(CenOS)을 생성해, SSH로 가상머신에 접속하는 실습을 진행하였습니다. 이번시간에는 Vagrant을 통해 가상머신 구성(Config)이 자동으로 설정되어 생성되는 실습을 진행하겠습니다.

 

IaC(Vagrant) 실습 환경 구축및 테스트 for Windows

Vagrant란?가상 머신(VM)이나 컨테이너 환경을 쉽게 설정하고 관리할 수 있도록 도와주는 IaC도구이다. 대표적인 IaC도구는 Terraform, Vagrant, Ansible등이 존재하는데, Vagrant는 로컬환경에서 가상머신(VM)

rybbit-life-debugging.tistory.com

 

 

1. 가상머신(CentOS)에 호스트네임, IP등을 자동으로 설정

아래 링크를 통해 실습파일을 다운로드할수있습니다.

 

_Book_k8sInfra/ch2/2.2.1 at main · sysnet4admin/_Book_k8sInfra

< 컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 >. Contribute to sysnet4admin/_Book_k8sInfra development by creating an account on GitHub.

github.com

 

Vagrantfile

# Vagrant 설정 파일을 루비 문법을 사용하여 작성.
# Vagrant API 버전 2를 사용하여 설정 시작
Vagrant.configure("2") do |config| 

  # "m-k8s"라는 이름의 VM 정의
  config.vm.define "m-k8s" do |cfg|

    # "sysnet4admin/CentOS-k8s"라는 Vagrant 박스를 사용하여 VM 생성
    cfg.vm.box = "sysnet4admin/CentOS-k8s"

    # VirtualBox를 프로바이더로 지정
    cfg.vm.provider "virtualbox" do |vb|

      # VirtualBox 상에서의 VM 이름 설정
      vb.name = "m-k8s(github_SysNet4Admin)"

      # VM에 할당할 CPU 코어 수 설정
      vb.cpus = 2

      # VM에 할당할 메모리 용량(MB) 설정
      vb.memory = 2048

      # VirtualBox VM을 "k8s-SM(github_SysNet4Admin)" 그룹에 배치
      vb.customize ["modifyvm", :id, "--groups", "/k8s-SM(github_SysNet4Admin)"]
    end

    # VM의 호스트 이름을 "m-k8s"로 설정
    cfg.vm.host_name = "m-k8s"

    # VM의 네트워크 설정: private network로 구성하고 IP 주소를 "192.168.1.10"으로 설정
    cfg.vm.network "private_network", ip: "192.168.1.10"

    # SSH 포트(22번 포트)를 호스트의 60010번 포트로 포워딩
    cfg.vm.network "forwarded_port", guest: 22, host: 60010, auto_correct: true, id: "ssh"

    # 호스트의 "../data" 폴더를 VM의 "/vagrant" 경로와 동기화하지 않도록 설정
    cfg.vm.synced_folder "../data", "/vagrant", disabled: true
  end
end

 

관리자 권한으로 명령 프롬프트를 실행후, C:\Program Files\Vagrant에 이동하여 프로비저닝을 수행합니다.

cd C:\Program Files\Vagrant
vagrant up --provider virtualbox

 

VirtualBox에 실행중인 가상머신(VM)이 확인되므로, 정상적으로 동작한것을 확인할수있습니다.

 

해당 가상머신에 SSH접속을 하고, 설정한 IP주소(192.168.1.10)을 확인합니다.

vargrant ssh
ip addr show eth1

 

SSH 접속을 종료하고, 가상머신(CentOS)을 삭제합니다. (-f는 가상머신을 강제종료하는 명령어)

exit
vagrant destroy -f

 

VirtualBox에 가상머신(CentOS)이 삭제된것을 확인할수있습니다.

 

2. CentOS에 추가 패키지 설치

아래 링크를 통해 실습파일을 다운로드할수있습니다.

 

 

_Book_k8sInfra/ch2/2.2.2 at main · sysnet4admin/_Book_k8sInfra

< 컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 >. Contribute to sysnet4admin/_Book_k8sInfra development by creating an account on GitHub.

github.com

 

Vagrantfile

Vagrant가 자동으로 "install_pkg.sh" 스크립트를 실행하여 추가적인 설정이나 패키지 설치 작업을 수행하는 코드입니다.

# Vagrant 설정 파일을 루비 문법을 사용하여 작성.
# Vagrant API 버전 2를 사용하여 설정 시작
Vagrant.configure("2") do |config| 

  # "m-k8s"라는 이름의 VM 정의
  config.vm.define "m-k8s" do |cfg|

    # "sysnet4admin/CentOS-k8s"라는 Vagrant 박스를 사용하여 VM 생성
    cfg.vm.box = "sysnet4admin/CentOS-k8s"

    # VirtualBox를 프로바이더로 지정
    cfg.vm.provider "virtualbox" do |vb|

      # VirtualBox 상에서의 VM 이름 설정
      vb.name = "m-k8s(github_SysNet4Admin)"

      # VM에 할당할 CPU 코어 수 설정
      vb.cpus = 2

      # VM에 할당할 메모리 용량(MB) 설정
      vb.memory = 2048

      # VirtualBox VM을 "k8s-SM(github_SysNet4Admin)" 그룹에 배치
      vb.customize ["modifyvm", :id, "--groups", "/k8s-SM(github_SysNet4Admin)"]
    end

    # VM의 호스트 이름을 "m-k8s"로 설정
    cfg.vm.host_name = "m-k8s"

    # VM의 네트워크 설정: private network로 구성하고 IP 주소를 "192.168.1.10"으로 설정
    cfg.vm.network "private_network", ip: "192.168.1.10"

    # SSH 포트(22번 포트)를 호스트의 60010번 포트로 포워딩
    cfg.vm.network "forwarded_port", guest: 22, host: 60010, auto_correct: true, id: "ssh"

    # 호스트의 "../data" 폴더를 VM의 "/vagrant" 경로와 동기화하지 않도록 설정
    cfg.vm.synced_folder "../data", "/vagrant", disabled: true

    # "install_pkg.sh"라는 셸 스크립트를 실행하여 패키지 설치 등 프로비저닝 작업 수행
    cfg.vm.provision "shell", path: "install_pkg.sh"  # 프로비저닝 스크립트 추가
  end
end

 

install_pkg.sh
Bash 스크립트를 C:\Program Files\Vagrant 디렉토리에 저장합니다.
*Bash 스크립트 파일은 .sh  확장자를 가지고있음
 

 

해당 스크립트는 EPEL(Extra Packages for Enterprise Linux) 저장소와 코드 하이라이트를 위한 Vim의 추가 기능을 설치하는 스크립트입니다.

#!/usr/bin/env bash

# CentOS repo change from mirror to vault 
sed -i -e 's/mirrorlist=/#mirrorlist=/g' /etc/yum.repos.d/CentOS-*
sed -i -e 's/mirrorlist=/#mirrorlist=/g' /etc/yum.conf
sed -E -i -e 's/#baseurl=http:\/\/mirror.centos.org\/centos\/\$releasever\/([[:alnum:]_-]*)\/\$basearch\//baseurl=https:\/\/vault.centos.org\/7.9.2009\/\1\/\$basearch\//g' /etc/yum.repos.d/CentOS-*
sed -E -i -e 's/#baseurl=http:\/\/mirror.centos.org\/centos\/\$releasever\/([[:alnum:]_-]*)\/\$basearch\//baseurl=https:\/\/vault.centos.org\/7.9.2009\/\1\/\$basearch\//g' /etc/yum.conf

# install packages 
yum install epel-release -y
yum install vim-enhanced -y

 

 

관리자 권한으로 명령 프롬프트를 실행후, C:\Program Files\Vagrant에 이동하여 프로비저닝을 수행합니다.

cd C:\Program Files\Vagrant
vagrant up --provider virtualbox

 

VirtualBox에 가상머신이 생성된것을 확인할수 있습니다.

 

SSH를 통해 가상머신(CentOS)에 접속합니다.

vagrant ssh

 

EPEL 저장소가 구성되었는지 확인합니다.

yum repolist

 

vi에디터에 하이라이트가 적용되었는지 확인합니다.

vi .bashrc

 

코드에 하이라이트가 적용된것을 확인합니다.

 

ESC를 누르고 :q를 입력후 vi에디터를 종료합니다.

 

 ssh접속을 해제하고, 가상머신(VM)을 삭제합니다.

exit
vagrant destroy -f

 

VirtualBox에 가상머신이 삭제된것을 확인합니다.

 

3. 가상머신 여러대 구성하기

Vagrant의 강점은 한 대의 가상머신뿐만 아니라 여러 대의 가상머신을 동시에 손쉽게 구성할 수 있습니다.

 

해당 실습을 통해 여러대의 가상머신을 구성 및 설치하고, 각각의 가상머신들이 네트워크 통신이 원할하게 작동하는지 확인해보겠습니다.

 

아래 링크를 통해 실습파일을 다운로드할수있습니다.

 

_Book_k8sInfra/ch2/2.2.3 at main · sysnet4admin/_Book_k8sInfra

< 컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 >. Contribute to sysnet4admin/_Book_k8sInfra development by creating an account on GitHub.

github.com

 

 

Vagrantfile

마스터 노드 1대와 워커 노드 3대를 생성하는 Kubernetes 클러스터를 구성하는 Vagrant 설정하는 코드입니다.

# Vagrant 설정 파일을 루비 문법을 사용하여 작성.
# Vagrant API 버전 2를 사용하여 설정 시작
Vagrant.configure("2") do |config| 

  # "m-k8s"라는 이름의 마스터 VM 정의
  config.vm.define "m-k8s" do |cfg|

    # "sysnet4admin/CentOS-k8s"라는 Vagrant 박스를 사용하여 VM 생성
    cfg.vm.box = "sysnet4admin/CentOS-k8s"

    # VirtualBox를 프로바이더로 지정
    cfg.vm.provider "virtualbox" do |vb|

      # VirtualBox 상에서의 VM 이름 설정
      vb.name = "m-k8s(github_SysNet4Admin)"

      # VM에 할당할 CPU 코어 수 설정 (2개)
      vb.cpus = 2

      # VM에 할당할 메모리 용량(MB) 설정 (2GB)
      vb.memory = 2048

      # VirtualBox VM을 "k8s-SM(github_SysNet4Admin)" 그룹에 배치
      vb.customize ["modifyvm", :id, "--groups", "/k8s-SM(github_SysNet4Admin)"]
    end

    # VM의 호스트 이름을 "m-k8s"로 설정
    cfg.vm.host_name = "m-k8s"

    # VM의 네트워크 설정: private network로 구성하고 IP 주소를 "192.168.1.10"으로 설정
    cfg.vm.network "private_network", ip: "192.168.1.10"

    # SSH 포트(22번 포트)를 호스트의 60010번 포트로 포워딩
    cfg.vm.network "forwarded_port", guest: 22, host: 60010, auto_correct: true, id: "ssh"

    # 호스트의 "../data" 폴더를 VM의 "/vagrant" 경로와 동기화하지 않도록 설정
    cfg.vm.synced_folder "../data", "/vagrant", disabled: true

    # "install_pkg.sh" 스크립트를 실행하여 필요한 패키지 설치 및 설정 수행
    cfg.vm.provision "shell", path: "install_pkg.sh"

    # "ping_2_nds.sh" 파일을 호스트에서 VM으로 복사
    cfg.vm.provision "file", source: "ping_2_nds.sh", destination: "ping_2_nds.sh"

    # "config.sh" 스크립트를 실행하여 추가 설정 작업 수행
    cfg.vm.provision "shell", path: "config.sh"
  end
  
  #=============#
  # Added Nodes #
  #=============#

  # 1부터 3까지 반복하여 3개의 워커 노드 생성
  (1..3).each do |i| 
    config.vm.define "w#{i}-k8s" do |cfg|  # "w1-k8s", "w2-k8s", "w3-k8s"라는 이름으로 VM 정의
      cfg.vm.box = "sysnet4admin/CentOS-k8s"

      # VirtualBox 프로바이더 설정
      cfg.vm.provider "virtualbox" do |vb|

        # 각각의 워커 노드 VM 이름 설정 (예: "w1-k8s")
        vb.name = "w#{i}-k8s(github_SysNet4Admin)"

        # 워커 노드에 할당할 CPU 코어 수 설정 (1개)
        vb.cpus = 1

        # 워커 노드에 할당할 메모리 용량(MB) 설정 (1GB)
        vb.memory = 1024

        # VirtualBox VM을 "k8s-SM(github_SysNet4Admin)" 그룹에 배치
        vb.customize ["modifyvm", :id, "--groups", "/k8s-SM(github_SysNet4Admin)"]
      end

      # 워커 노드의 호스트 이름 설정 (예: "w1-k8s", "w2-k8s", "w3-k8s")
      cfg.vm.host_name = "w#{i}-k8s"

      # 워커 노드 네트워크 설정: IP 주소를 각 노드에 맞게 설정 (예: "192.168.1.101", "192.168.1.102", "192.168.1.103")
      cfg.vm.network "private_network", ip: "192.168.1.10#{i}"

      # SSH 포트 포워딩 설정: 각 노드에 맞게 포트 번호 설정 (예: 60101, 60102, 60103)
      cfg.vm.network "forwarded_port", guest: 22, host: "6010#{i}", auto_correct: true, id: "ssh"

      # 호스트의 "../data" 폴더를 VM의 "/vagrant" 경로와 동기화하지 않도록 설정
      cfg.vm.synced_folder "../data", "/vagrant", disabled: true

      # "install_pkg.sh" 스크립트를 실행하여 패키지 설치 수행
      cfg.vm.provision "shell", path: "install_pkg.sh"
    end
  end
end

 

install_pkg.sh

CentOS 7에서 기본 리포지토리로 사용되는 미러(mirror) URL을 vault.centos.org로 변경하여, 더 이상 지원되지 않는 CentOS 버전에 필요한 패키지들을 설치할 수 있도록 설정하는 작업을 합니다. 이후에는 EPEL 리포지토리와 vim-enhanced 패키지를 설치하여 기본 기능을 확장합니다.

#!/usr/bin/env bash

# CentOS 리포지토리를 mirror에서 vault로 변경하는 설정

# /etc/yum.repos.d 디렉토리 내 CentOS 관련 설정 파일에서 'mirrorlist='을 주석 처리
sed -i -e 's/mirrorlist=/#mirrorlist=/g' /etc/yum.repos.d/CentOS-*

# /etc/yum.conf 파일에서 'mirrorlist='을 주석 처리
sed -i -e 's/mirrorlist=/#mirrorlist=/g' /etc/yum.conf

# /etc/yum.repos.d 내 CentOS 관련 설정 파일에서 주석 처리된 'baseurl='을 'vault.centos.org'로 변경
sed -E -i -e 's/#baseurl=http:\/\/mirror.centos.org\/centos\/\$releasever\/([[:alnum:]_-]*)\/\$basearch\//baseurl=https:\/\/vault.centos.org\/7.9.2009\/\1\/\$basearch\//g' /etc/yum.repos.d/CentOS-*

# /etc/yum.conf 파일에서 주석 처리된 'baseurl='을 'vault.centos.org'로 변경
sed -E -i -e 's/#baseurl=http:\/\/mirror.centos.org\/centos\/\$releasever\/([[:alnum:]_-]*)\/\$basearch\//baseurl=https:\/\/vault.centos.org\/7.9.2009\/\1\/\$basearch\//g' /etc/yum.conf

# 패키지 설치

# EPEL(Extra Packages for Enterprise Linux) 리포지토리를 설치 (추가 패키지를 설치할 수 있도록 설정)
yum install epel-release -y

# vim의 확장된 기능을 제공하는 vim-enhanced 패키지를 설치
yum install vim-enhanced -y

 

ping_2_nds.sh

각 노드(192.168.1.101, 192.168.1.102, 192.168.1.103)에 대해 3번씩 ping 명령어를 사용하여 네트워크 연결 상태를 확인합니다.

# 각 노드에 대해 3번씩 ping을 실행

# IP 주소 192.168.1.101로 3번 ping을 실행
ping 192.168.1.101 -c 3

# IP 주소 192.168.1.102로 3번 ping을 실행
ping 192.168.1.102 -c 3

# IP 주소 192.168.1.103로 3번 ping을 실행
ping 192.168.1.103 -c 3

 

config.sh

ping_2_nds.sh 파일의 권한을 chmod 744 명령어로 수정합니다.

#!/usr/bin/env bash

# 파일의 권한을 744로 수정
# 744 권한: 소유자는 읽기, 쓰기, 실행 가능. 그룹 및 다른 사용자는 읽기만 가능.
chmod 744 ./ping_2_nds.sh

 

 

관리자 권한으로 명령 프롬프트를 실행후, C:\Program Files\Vagrant에 이동하여 프로비저닝을 수행합니다.

cd C:\Program Files\Vagrant
vagrant up --provider virtualbox

 

 

VirtualBox에 4대의 가상머신이 생성된것을 확인할수 있습니다.

 

m-k8s에 SSH로 접속합니다.

vagrant ssh m-k8s

 

참고

여러대의 가상머신이 실행중일때, 가상머신의 이름을 지정하지 않으면 오류가 발생합니다.

 

ping_2_dns.sh 스크립트를 통해 3대의 가상머신(CentOS)가 통신하는지 확인합니다.

./ping_2_dns.sh

 

 

ssh접속을 해제하고, 가상머신(VM)을 삭제합니다.

exit
vagrant destroy -f

 

VirtualBox에 가상머신이 삭제된것을 확인합니다.