[클라우드 컴퓨팅] 실습 수업 요약

돗치·2024년 1월 29일

sudo -i : 원활한 실습을 위해 루트 권한 로그인

우분투 클라우드 이미지 웹사이트: https://cloud-images.ubuntu.com/

Ubuntu 클라우드 이미지 다운로드

wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img

apt update : 패키지 목록 정보 업데이트

apt install guestfs-tools libvirt-clients libvirt-daemon-system qemu-kvm virtinst cloudimage-utils bridge-utils -y : 필요한 패키지 설치

cloud-init에서 참고하는 파일

  • user-data
  • meta-data
  • vendor-data
  • network-config

user-data

#cloud-config
hostname: vm01
	manage_etc_hosts: true
users:
- name: ubuntu
sudo:
- ALL=(ALL) NOPASSWD:ALL
groups:
- users
- admin
home: /home/ubuntu
shell: /bin/bash
lock_passwd: false
ssh_pwauth: true
disable_root: false
chpasswd:
list:
- ubuntu:1111
expire: false

hostname: 인스턴스의 호스트 이름을 설정

manage_etc_hosts: 인스턴스의 /etc/hosts 파일을 관리할지 여부 결정 : true이니 IP주소와 호스트 이름이 /etc/hosts에 자동으로 추가 됨

users: 사용자 계정 추가 - ubuntu, 해당 사용자에 관한 권한, 그룹, 홈 디렉토리, 쉘 등을 설정

sudo: 사용자에게 sudo 권한을 부여

ALL=(ALL) NOPASSWD:ALL: 모든 사용자와 그룹이 sudo를 실행할 때 암호를 입력하지 않고, 모든 명령어를 실행할 수 있도록 설정

groups: 사용자가 속한 그룹을 설정 - "users"와 "admin" 그룹에 사용자 추가

home: 사용자의 홈 디렉토리 경로 설정

shell: 사용자의 로그인 쉘 설정
lock_passwd: 사용자 계정의 암호를 잠금 여부를 나타내는 설정

ssh_pwauth: SSH 암호 인증을 사용할지 여부 결정 - "true"는 SSH 암호 인증 활성화

disable_root: root 계정을 사용할 수 있는지 여부를 결정. "false"는 root 계정을 사용할 수 있음

chpasswd: 사용자 암호 설정 - “list”키를 사용하여 “ubuntu" 사용자의 암호를 1111로 설정

expire: 암호 만료 - “false”는 암호 만료를 사용하지 않도록 설정

user-data파일을 cloud-localds 명령을 통해 읽어들여 클라우드 인스턴스에 필요한 초기화 파일 생성

cloud-localds -v -d qcow2 vm01-base.qcow2 user-data

cloud-localds: 클라우드 인스턴스를 시작할 때 사용할 초기화 파일을 생성하는 명령어

-v: 명령 실행 중 상세한 출력 표시

-d qcow2: 생성할 디스크 이미지 파일 포맷을 지정하는 옵션

vm01-base.qcow2: 생성할 디스크 이미지 파일 이름

user-data: 클라우드 인스턴스에 필요한 초기화 파일을 생성하는 데 사용되는 파일 이름

qcow2 파일들을 다른 경로로 복사 → 파일의 접근 권한 및 관리

cp vm01-base.qcow2 /var/lib/libvirt/images/vm01-base.qcow2

cp focal-server-cloudimg-amd64.img /var/lib/libvirt/images/focal-server-cloudimg-amd64-vm01.img

/var/lib/libvirt/images: KVM, QEMU 가상화 플랫폼에서 가상 디스크 이미지 저장하는 기본 dir

vir-network.xml - 가상 네트워크 정의 xml파일

<network>
<name>vir-network</name>
<bridge name="virbr1"/>
<forward mode="nat"/>
<ip address="192.168.123.1" netmask="255.255.255.0">
<dhcp>
<range start="192.168.123.2" end="192.168.123.254"/>
</dhcp>
</ip>
</network>

<network>: 가상 네트워크를 정의하기 위한 최상위 요소

<name>: 가상 네트워크의 이름

<bridge>: 가상 네트워크와 호스트 네트워크 간의 브리지를 설정하는 요소

<forward>: 가상 네트워크의 전달 방식을 설정

<ip>: 가상 네트워크의 IP 주소와 서브넷 마스크를 설정

<dhcp>: 가상 머신에 자동으로 IP 주소를 할당하기 위한 DHCP 서버를 가상 네트워크에 설정

<range>: DHCP 서버가 할당할 IP 주소 범위를 설정

virsh 명령어를 사용 - vir-network.xml 파일을 통해 가상 네트워크 정의

virsh net-define vir-network.xml: vir-network.xml 파일을 통해 가상 네트워크 정의

virsh net-start vir-network: vir-network라는 이름의 가상 네트워크를 시작

virsh net-list: 가상 네트워크 목록 조회

virsh net-info vir-network: vir-network 가상 네트워크 정보 조회

virsh net-autostart vir-network: vir-network 가상 네트워크가 부팅 시 자동으로 시작되도록 설정

ip a 명령어를 입력하면 virbr1 브릿지 생성된 것을 볼 수 있다

가상머신 제어

가상 머신을 정의하고 시작: virt-install 명령어 사용

virsh define [가상머신 정의 xml 파일]
virsh start [정의된 가상머신의 이름]

가상 머신을 콘솔로 접속: virsh console [정의된 가상머신의 이름]

가상 머신 제거 방법: virsh destroy [정의된 가상머신의 이름]

가상 머신의 정의 해제: virsh undefine [정의된 가상머신의 이름]

user-data 수정 - hostname을 vm02로 설정

클라우드 인스턴스에 필요한 초기화 파일 생성

cloud-localds -v -d qcow2 vm02-base.qcow2 user-data2

vm01때와 똑같은 방법 사용

cp vm02-base.qcow2 /var/lib/libvirt/images/vm02-base.qcow2

cp focal-server-cloudimg-amd64.img /var/lib/libvirt/images/focal-server-cloudimg-amd64- vm02.img

vm2.xml - 가상 머신 정의

<domain type='kvm'>
	<name>vm2</name>
	<memory unit='KiB'>2097152</memory>
	<vcpu placement='static'>2</vcpu>
	<os>
		<type arch='x86_64' machine='pc-q35-2.9'>hvm</type>
		<boot dev='hd'/>
	</os>
	<devices>
	<disk type='file' device='disk'>
		<driver name='qemu' type='qcow2'/>
		<source file='/var/lib/libvirt/images/focal-servercloudimg-amd64-vm02.img'/>
		<target dev='vda' bus='virtio'/>
		</disk>
	<disk type='file' device='disk'>
	<driver name='qemu' type='qcow2'/>
	<source file='/var/lib/libvirt/images/vm02-base.qcow2'/>
	<target dev='vdb' bus='virtio'/>
	</disk>
	<interface type='network'>
	<mac address='52:54:00:12:34:59'/>
	<source network='vir-network'/>
	<model type='virtio'/>
	</interface>
	<console type='pty'>
	<target port='0'/>
	</console>
	<serial type='pty'>
	<target port='0'/>
	</serial>
	</devices>
</domain>

<domain>: KVM 가상 머신의 설정을 정의
<name>: 가상 머신의 이름을 정의
<memory>: 가상 머신의 메모리 크기를 정의
<vcpu>: 가상 머신의 가상 CPU 수를 정의
<os>: 가상 머신의 운영 체제 정보를 정의
<type>: 가상 머신의 운영 체제 유형을 지정
<boot>: 가상 머신의 부팅 순서를 정의
<devices>: 가상 머신의 하드웨어 장치를 정의
<disk>: 가상 머신의 디스크 장치를 정의
<driver>: 디스크 드라이버를 지정
<source>: 디스크 이미지 파일의 경로를 지정
<target>: 디스크 장치의 이름 및 버스를 정의
<interface>: 가상 머신의 네트워크 인터페이스를 정의
<mac>: 인터페이스의 맥 주소를 정의
<source>: 가상 브리지의 이름을 지정
<model>: 네트워크 인터페이스 모델을 지정
<console>: 가상 머신의 콘솔에 대한 설정을 정의
<target>: 콘솔의 타겟 포트를 지정
<serial>: 가상 머신의 시리얼 포트에 대한 설정을 정의
<target>: 시리얼 포트의 타겟 포트를 지정

가상 머신 정의/생성/조회

virsh define vm2.xml: vm2.xml 파일을 통해 가상 머신 정의

virsh start vm2: vm2 이라는 이름의 가상 머신 시작

virsh list: 가상 머신 목록 조회

virsh dominfo vm2: vir-network 가상 네트워크 정보 조회

가상 머신 콘솔 접속 및 접속 종료

virsh console vm2: vm2 가상머신을 콘솔로 접속 → user-data2에 작성했던 유저 계정 입력 및 비밀번호 입력

Ctrl + ]: 가상 머신의 콘솔에서 밖으로 나가기

가상 머신의 일시 중단 및 재게

virsh suspend vm2: vm2라는 가상머신 일시 중단

특징

  • 리소스 사용 중지: 가상 머신이 suspend 상태일 때, CPU 및 메모리 등의 리소스를 사용하지 않음.
  • 상태 유지: 가상 머신이 suspend 상태에서는 현재 상태가 유지됨.
  • 빠른 재개: 가상 머신이 suspend 상태에서는 빠른 시간 내에 재개될 수 있음.
  • 네트워크 사용 중지: 가상 머신이 suspend 상태에서는 네트워크 연결이 끊어짐

virsh resume vm2: 다시 재개

가상 머신 종료, 시작

virsh shutdown vm2 : vm2라는 가상머신 종료

shutdown과 suspend 차이:

  • shutdown: 가상 머신의 전원 끔. 모든 작업을 저장하고 종료. 이후에는 다시 가상 머신을 켜야 함.
  • suspend: 가상 머신 일시 중단 상태로 만들어 현재 상태를 저장. 이후에는 이전 상태에서부터 바로 실행이 가능

virsh start vm2: vm2이라는 가상 머신을 시작

스냅샷

  • 가상 머신의 현재 상태를 캡처

virsh snapshot-create-as vm2 --name initial-version :

vm2 가상 머신에 대한 initial-version 이라는 이름의 스냅샷을 생성

virsh snapshot-list vm2: 해당 스냅샷이 생성되었는지 확인

touch hello_vm2: 가상 머신 내부에서 파일을 생성

virsh snapshot-revert vm2 initial-version:

vm2 가상 머신에 대한 initial-version 이라는 이름의 스냅샷으로 복구

virsh snapshot-delete vm2 initial-version: initial-version 스냅샷 삭제

virsh snapshot-list vm2: 해당 스냅샷이 삭제되었는지 확인

네트워크 관련 명령어

virsh net-list: 현재 호스트에서 사용 가능한 가상 네트워크 목록을 출력

virsh iface-list: 현재 호스트의 물리 네트워크 인터페이스 목록을 출력

virsh domifaddr vm2: 가상 머신의 네트워크 인터페이스 목록 출력

virsh domifstat vm2 vnet3: vm2 가상 머신의 vnet3 인터페이스에 대한 네트워크 I/O 통계 정보 출력

가상머신에 웹서버 구동

virsh console vm2: 가상머신에 콘솔로 접속

sudo apt-get update: 패키지 매니저를 업데이트하여 최신 패키지 목록을 가져옴

sudo apt-get install apache2: 아파치 웹 서버 설치

sudo service apache2 start : 아파치 웹 서버 시작

sudo vi /var/www/html/index.html : vi편집기로 html파일 수정

curl + IP : 웹서버에 요청 보내고 결과 출력

윈도우에서 접속하기

iptables -t nat -I PREROUTING -d [UBUNTU_IP] -p tcp --dport [ACCESS PORT] -j DNAT --to-destination [apache vm ip]:[apache webserver port] : Ubuntu 호스트에서 들어오는 특정 포트 접근 요청을 Apache VM의 IP 주소와 웹 서버 포트로 변경하여 전달

iptables -t filter -I FORWARD -p tcp -d [apache vm의 ip] --dport [apache webserver port] -j ACCEPT : 목적지 주소가 Apache VM의 IP 주소와 웹 서버 포트인 패킷 허용

  • iptables - 방화벽, 네트워크 주소 변환(NAT), 패킷 로깅, 트래픽 제어
  • [UBUNTU_IP]: 하이퍼바이저 역할을 수행하는 ubuntu의 외부와 연결된 인터페이스의 IP
  • [ACCESS PORT]: 외부에서 웹 서버할 때 사용되는 포트 번호
  • [apache vm의 ip]: APACHE 웹 서버가 구동되는 가상 머신의 IP
  • [apache webserver port]: APACHE 웹 서버가 구동되는 가상 머신 웹 서버 포트번호

0개의 댓글