0부터 시작하는 KVM 공부 - Virt-customize & Virt-builder 를 이용한 인스턴스 배포하기

Jaehong Lee·2022년 8월 10일
1
post-thumbnail

1. 인스턴스 & VM 을 만드는 방법

    1. ISO 파일을 이용한 설치
    1. 클라우드 환경에서는 사용자별 필요한 볼륨의 사이즈, 컴퓨팅 자원 뿐만 아니라 필요한 Key-Pair 등을 설치시 즉시 제공할 수 있어야 한다
      • 볼륨 사이즈 지정 + 웹서버 배포 + index.html 배포
      • virt-customize 는 볼륨 사이즈에 대한 조절이 없다
      • virt-builder 는 virt-customize 의 기능과 virt-resize 의 기능이 포함되어 있어 원하는 크기의 볼륨 지정 및 패스워크, 패키지 설치등이 가능하다

2. Virt-builder 를 사용해보자

  • virt-builder -l 을 통해 사용 가능한 이미지 리스트를 확인할 수 있다. 우리는 x86_64 를 선택 해야 한다

virt-builder 의 기능

  1. 인터넷에 있는 클라우드 이미지 다운로드 하기 -> 이를 통해 centos-7.0 클라우드 이미지를 다운 받았다
  2. virt-resize 기능이 포함되어 있다 -> 이를 통해 클라우드 이미지 ( 볼륨 ) 사이즈를 확장할 수 있다
  3. 볼륨 내에 설치되어 있는 centos 의 root password 설정 가능
  4. 볼륨 내에 미리 필요한 패키지를 설치 가능 -> 이는 yum 을 사용해 패키지를 설치하는 것과 같다

클라우드 이미지 수정

  • 볼륨 사이즈를 20GB 로 지정하고, 포맷을 qcow2 로 하며, output 은 remote 디렉터리의 test1.qcow2 로 저장한다. 비밀번호를 지정하기 위해 root 계정에 대한 password 를 설정하였으며, 추가 패키지를 설치하고 싶으므로, install 을 통해 2가지 패키지를 설치하게 설정하여 새 볼륨 파일을 생성하자
  • selinux-relabel 을 통해 selinux 도 추가하였다
  • 지정한 설정에 따라 customize 하는 것을 확인 가능하다

배포하기

  • virt-install 을 이용하여 수정한 이미지를 통해 인스턴스를 배포해보자
  • noautoconsole 을 사용하지 않았으므로, 명령어를 실행하면 자동으로 해당 인스턴스로 들어간다. 만약 빠져나오고 싶으면 Ctrl + ] 을 통해 빠져나올 수 있다
  • virsh console ' 인스턴스 이름 ' 으로 생성한 인스턴스에 접속할 수 있다
  • 생성한 인스턴스이 Network 정보를 확인하자. net-tools 패키지를 설치했기에 ifconfig 명령어를 사용 가능하며, Ip 가 잘 할당되었다
  • 생성한 인스턴스를 삭제해주자

3. Virt-builder 옵션

  • 다음 링크를 통해 virt-builder 의 옵션들을 확인할 수 있다 ( https://libguestfs.org/virt-builder.1.html )
  • 위와 같이 다양한 옵션이 존재한다
    • upload 옵션 : local 파일을 원격 이미지에 저장할 수 있다. 즉, local 에 있는 파일을 볼륨 안에 넣을 수 있는 옵션이다. 앞에는 로컬 파일, 뒤에는 저장할 위치를 지정한다. 만약, 패키지 관련된 파일이라면 미리 관련된 패키지를 install 을 통해 설치하게 설정 해야 한다
    • install 옵션 : 패키지를 설치하는 옵션이다. , 를 통해 다수의 패키지를 설치할 수 있다. 이는, 볼륨 자체에 필요한 패키지를 설치하는 옵션이다. 즉, 패키지가 디스크 ( 볼륨 ) 자체에 설치된다
    • firstboot-install 옵션 : virt-install 을 통해 인스턴스로 배포될 때, 처음 부팅하면서 설치할 패키지를 설정하는 옵션이다. 즉, 패키지가 인스턴스가 처음 부팅이 될 때 설치된다
    • run 옵션 : 다음에 스크립트 파일이 온다. Host 에 스크립트를 작성해두고, 이 내용을 디스크 ( 볼륨 ) 에 적용 하는 옵션이다. 즉, 스크립트에 작성된 명령을 볼륨에 적용시킬 수 있다. 이는, 볼륨 내에 여러 명령어를 적용시키고자 할 때 유용하다
    • run-command 옵션 : 다음에 명령어가 온다. 명령어를 볼륨에 적용시킨다. 이는, 한 개 정도의 간단한 명령어를 볼륨에 적용하고자 하는 경우에 유용하다
    • firstboot-command 옵션 : 다음에 명령어가 온다. 인스턴스가 처음 부팅될 때, 인스턴스 내에서 실행할 명령어를 지정하는 옵션이다
    • mkdir DIR 옵션 : 볼륨 내에 필요한 디렉터리를 미리 생성하는 옵션이다
    • selinux-relabel 옵션 : selinux 활성화하는 옵션이다
virt-builder os-version -o /remote/centos1.qcow2 --size 20G --format qcow2 --install httpd,nfs-utils,vim --upload index.html:/var/www/html/index.html
  • 주로, 위와 같은 형태로 많이 사용한다

4. Quiz - 옵션을 사용해보자

사용자는 생성된 이미지가 인스턴스화 될때, 자동으로 웹서비스가 실행되도록 하고 싶다

  • --install httpd --run-command 'systemctl enable httpd' : 볼륨에 명령어를 적용하는 것이므로, enable 을 통해 인스턴스가 배포되어 실행된다면, httpd 가 자동 실행되게 설정 해야 한다
  • --install httpd --firstboot-command 'systemctl start httpd' : 인스턴스에 명령을 실행하는 것 이므로, start 를 시켜줘야 한다

실습 Quiz

  1. local 에 index.html 파일을 간단히 제작
  2. test2.qcow2 를 생성하되, 20GB 이고, 미리 httpd 패키지를 설치
  3. 로컬에 있는 index.html 파일을 웹서버의 기본 홈 디렉터리로 이동
  4. 웹서버는 인스턴스로 실행과 동시에 동작해야 하며, 외부에서 해당 Ip 주소로 접속했을 때 웹페이지가 보여야 한다
  5. root 의 password 는 test123 으로 설정한다

  • 간단한 html 파일 생성
  • 패키지 설치, index.html upload, 명령어 실행 옵션을 추가하여 이미지 파일을 수정해서 새로 생성하자. 방화벽 종료까지 추가 해야 되므로 실행할 명령어를 'systemctl enable httpd&&systemctl disable firewalld' 로 작성하자
  • test 2 인스턴스를 배포해주자
  • 잘 접속된다
  • index.html 도 잘 upload 됬다
  • firewalld 를 따로 종료하지 않거나, httpd 를 따로 실행하지 않아도, 자동으로 실행되는 것을 확인할 수 있다

5. Quiz - 볼륨에 Ip 지정과 SSH 연결 설정

  • 위의 Quiz 를 통해 생성된 인스턴스에서는 dhcp 에서 Ip 를 할당 받아오므로, 원하는 Ip 를 사용할 수 없다. 원하는 Ip 를 사용하기 위해서는 해당 ifcfg-eth0 파일을 수정 해야 한다

사용자는 인스턴스를 하나 더 만들고자 하는데, 아래 조건을 만족해야 한다

  • Ip 주소는 211.183.3.222 를 사용
  • Host 의 ~/.ssh/authorized_keys 파일을 가져와서 Public Key 를 인스턴스에도 입력해서 Host 에서 Private key 를 통해 인스턴스에 접근할 수 있어야 한다
  • password 는 사용하지 않는다
  • Ip 주소 변경을 위해 해야 할 것 -> ifcfg-eth0 에 BOOTPROTO=NONE 으로 설정하고, IPADDR=211.183.3.222 , PREFIX=24 , DEFUALT_GATEWAY , DNS 를 설정해줘야 한다

  • SSH 연결을 위해 해야 할 것 -> HOST 에서 SSH_CONFIG 설정 , 인스턴스에 .ssh 폴더 생성 및 authorized_keys 복사 , sshd_config 설정

Host ssh_config 설정

  • 위와 같이 전에 생성한 0802.pem key 를 사용하여 접속하게 설정하자

명령 스크립트 생성

  • 스크립트 파일을 하나 생성하자
#!/bin/bash

systemctl enable httpd
systemctl disable firewalld

cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME="eth0"
DEVICE="eth0"
ONBOOT=yes
IPADDR=211.183.3.222
PREFIX=24
GATEWAY=211.183.3.2
DNS=8.8.8.8
EOF

ifdown eth0
ifup eth0

sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/g' /etc/ssh/sshd_config
sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config

chmod 700 /root/.ssh
  • 코드는 위와 같다. Ip 를 설정해주고, sshd_config 의 설정을 변경해준다. 또한 .ssh 폴더가 없으므로 생성 후 권한을 700으로 변경해준다. Ip 는 변경 후 Interface 를 재실행 해준다

  • 위와 같이 입력하고 저장하자

이미지 파일 수정 및 생성

virt-builder centos-7.0 --size 20G --format qcow2 -o /remote/test3.qcow2 --install httpd,net-tools --mkdir /root/.ssh --upload /root/index.html:/var/www/html/index.html --upload /root/.ssh/authorized_keys:/root/.ssh/authorized_keys --run /root/createinstance.sh --selinux-relabel

  • 위 명령어를 통해 이미지 파일을 수정 및 생성하자. Quiz 1 부분에서 password 지정 옵션을 제거하고, .ssh 디렉터리 생성 옵션 , Public Key Upload 옵션 , 스크립트 파일 실행 옵션을 추가하였다

인스턴스 배포

virt-install --name test3 --vcpus 1 --ram 1024 --network bridge:vswitch01,model=virtio,virtualport_type=openvswitch --disk /remote/test3.qcow2 --import --graphics none 

  • 위 명령어를 통해 인스턴스를 배포하자. 우리는 스크립트 파일의 명령을 통해 Password login 을 막았으므로 접속이 안되는 것이 맞다

  • 설치가 끝나면 Ctrl + ] 로 나오자

SSH 접속

  • Host 의 ssh_config 에 지정한대로 ssh test3 를 입력하면, ssh 접속이 된다
  • Ip 를 확인해보면, 지정한 Ip 가 잘 설정됬다

  • domifaddr 로 Ip 를 확인해보면 나오지 않는다. 이는 default network 를 사용하면 확인되지만, 우리는 vswitch network 를 사용하기에 인스턴스의 network 정보가 출력되지 않는게 정상이다
profile
멋진 엔지니어가 될 때까지

0개의 댓글