[클라우드 With리눅스/KVM 실습(1)]

SooYeon Yeon·2022년 8월 30일

클라우드 With리눅스

목록 보기
38/39

인스턴스 만들기

KVM1

  1. 사용할 디스크(qocw2)를 미리 준비하기
  • 이름 짧게 변경
mv /remote/CentOS-7-x86_64-Minimal-2009.iso /remote/CentOS7-2009.iso
  • qemu로 qcow2 준비
qemu-img create -f qcow2 /remote/centos1.qcow2 10G
ls -l /remote/
  1. 준비된 디스크와 컴퓨팅 자원을 이용하여 설치하기
virt-install --name centos1 --vcpus 1 --ram 1024 --network network:default --disk /remote/centos1.qcow2 --graphics vnc,port=5901 --location=/remote/CentOS7-2009.iso --noautoconsole

KVM2

  1. 설치하면서 디스크 준비까지 한번에
mv /remote/CentOS-7-x86_64-Minimal-2009.iso /remote/CentOS7-2009.iso
virt-install --name centos2 --vcpus 1 --ram 1024 --network network:default --disk /remote/centos2.qcow2,size=10 --graphics vnc,port=5902 --location=/remote/CentOS7-2009.iso --noautoconsole

둘다 실행해서 설치

KVM 가상머신 관리

  1. 하이퍼바이저에서 가상머신들의 리스트 확인
virsh list # 동작 중인 가상머신
virsh list --all # 모든 가상머신
  1. 네트워크 리스트 확인
virsh net-list --all
  1. kvm 데몬이 재실행되더라도 동시에 vm도 재실행이 되도록
virsh autostart [도메인이름]
  1. 가상머신들의 이름만 확인하고 싶다면
virsh list --all --name
  1. 가상머신들에게 콘솔로 접속하고싶다면
virsh console [도메인이름]
  • 인스턴스 생성 시 console line을 생성하지 않는다면 연결되지 않을 수 있다.
  • 단, 클라우드용 이미지는 이미 콘솔라인이 생성됭어 있으므로
  • ctrL + ] 눌러서 빠져나올 수 있음
  1. 가상머신들의 설정 값 확인

    1. virsh dumpxml [도메인이름] : 설정된 가상머신의 xml 파일을 cat으로 열어보는 것과 동일한 효과
    [root@kvm1 ~]# virsh dumpxml centos1
    <domain type='kvm' id='2'>
      <name>centos1</name>
      <uuid>44c42c44-fb66-49c5-80c1-9e057ab2c4b8</uuid>
      <memory unit='KiB'>1048576</memory>
      <currentMemory unit='KiB'>1048576</currentMemory>
      <vcpu placement='static'>1</vcpu>
      <resource>
        <partition>/machine</partition>
      </resource>
      <os>
        <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
        <boot dev='hd'/>
      </os>
      <features>
    ...

    b. virsh edit [도메인이름] : vi centos1.xml과 같이 편집 모드로 들어갈 수 잇다.

    virsh edit [도메인이름]
  1. 네트워크의 설정값 확인 및 수정

    1. virsh net-dumpxml default : xml 파일을 cat으로 보는 것과 같은 효과, 수정은 불가
    [root@kvm1 ~]# virsh net-dumpxml default
    <network connections='1'>
      <name>default</name>
      <uuid>9f32ef1a-42db-4683-98b1-5160630bcda2</uuid>
      <forward mode='nat'>
        <nat>
          <port start='1024' end='65535'/>
        </nat>
      </forward>
      <bridge name='virbr0' stp='on' delay='0'/>
      <mac address='52:54:00:e7:9a:9a'/>
      <ip address='192.168.122.1' netmask='255.255.255.0'>
        <dhcp>
          <range start='192.168.122.2' end='192.168.122.254'/>
        </dhcp>
      </ip>
    </network>

    b. virsh net-edit default : vi로 연결되어 스위치의 구성 내용을 변경할 수 있다.

    10.10.10.x대로 변경

    수정 이후에

    systemctl restart libvirtd # KVM 데몬 재실행
    virsh net-destroy default # default network 중지
    virsh net-start default # default network 실행
    
    virsh destroy centos1 # 가상머신 종료
    virsh start centos1 # 가상머신 실행

    이후 ip를 확인해보면 10점 대로 되어있다.

    1. 가상머신의 IP 주소 확인
    virsh domifaddr [도메인이름]
    [root@kvm1 ~]# virsh domifaddr centos1
     Name       MAC address          Protocol     Address
    -------------------------------------------------------------------------------
     vnet0      52:54:00:fc:e3:84    ipv4         10.10.10.235/24
    1. 새로운 네트워크 만들기
    • virsh net-define [xml파일]

    기존 default 네트워크를 이용하여 생성하기

    touch private1.xml
    [root@kvm1 ~]# vi private1.xml
    <network>
    <name>private</name>
    <bridge name='virbr2' stp='on' delay='0'/>
    <ip address='172.16.100.1' netmask='255.255.255.0'>
    <dhcp>
    <range start='172.16.100.201' end='172.16.100.239'/>
    </dhcp>
    </ip>
    </network>
    virsh net-define private1.xml
    
    # 현재 private1은 중지중/autostart는 아니다.start 해주고, autostart 해주려면
    virsh net-start private
    virsh net-autostart private

    삭제하고 싶다면 virsh net-undefine [네트워크이름]

  1. 생성된 별도의 네트워크에 가상머신 연결하기

네트워크 이름 : private (스위치의 이름 : virbr2 - 172.16.100.1)

private에 연결되는 가상머신들은 172.16.100.201~172.16.100.239 사이에서 IP 주소를 DHCP로 할당받는다.

virsh attach-interface --domain centos1 --type network --source private --model virtio --live --config
  • centos1에게 network 타입의 private 네트워크로 연결 할 예정이고, 랜카드 모델은 virtio이다.
  • —live를 통해 가상머신이 동작중인 상태에서 연결할 것이고, —config 재부팅되더라도 설정은 계속 유지하겠다.

마이그레이션 시

vnc 포트오류를 해결하고자 한다면

  • centos2에서 virsh net-destroy centos2으로 일단 중지

  • virsh edit centos2 해서 5901로 되어있는 포트 정보를 5902로 변경한다.

  • centos1(5900)—————-host:5901

  • centos2(5900)—————-host:5901

  1. 연결된 인터페이스 동작중인 상태에서 제거하기

centos1

  • 172.16.100.227이 private
[root@kvm2 remote]# virsh domifaddr centos1
 Name       MAC address          Protocol     Address
-------------------------------------------------------------------------------
 vnet1      52:54:00:fc:e3:84    ipv4         192.168.122.14/24
 vnet2      52:54:00:56:f8:58    ipv4         172.16.100.227/24
virsh detach-interface --domain centos1 --type network --mac 52:54:00:56:f8:58 --config
  1. 동작중인 가상머신에 추가 디스크가 필요하다면?

저장공간 사용하기

  1. 로컬디스크
  2. remote디스크
    1. NFS : 파일 스토리지, 디렉토리로 /remote와 원격 /cloud를 mount
    2. iSCSI : 블록 스토리지, 원격지에 있는 볼륨을 로컬(/dev/sda)에 가져와 연결

볼륨 만들기

[root@kvm2 remote]# virsh pool-list --all
 Name                 State      Autostart 
-------------------------------------------
 default              active     yes       
 remote               active     yes

# remote에 1G짜리 볼륨을 만듦
[root@kvm2 remote]# virsh vol-create-as remote voltest1 1G
Vol voltest1 created

[root@kvm2 remote]# virsh vol-list remote | grep voltest1
 voltest1             /remote/voltest1
  • remote 디렉토리 아래에 있는 1GB voltest1을 centos2의 sdb에 연구적으로 연결하되, 동작중인 현재 상태에서 바로 붙임
[root@kvm2 remote]# virsh attach-disk centos2 /remote/voltest1 --target sdb --persistent --live
Disk attached successfully

[root@kvm2 remote]# virsh attach-disk centos2 /remote/voltest1 --target sdb --persistent --live
Disk attached successfully
  • centos2에 들어가 ls /dev/sd*를 하면 /dev/sdb를 볼 수 있음
  • 파티셔닝 및 포맷
# sdb가 추가 된 것 확인 가능
ls /dev/sd*

# 파티셔닝 시작
fdisk /dev/sdb
----------------
n : 새로운 파티션 만들겠다. 나머지는 모두 엔터

# 포맷
mkfs.ext4 /dev/sdb1

# 마운트
mkdir /test
mount /dev/sdb1 /test

# 확인
df -h

touch /test/from_centos2.txt
  • 동작중인 상태에서 연결된 디스크 제거
[root@kvm2 remote]# virsh detach-disk centos2 sdb
Disk detached successfully

이후 centos2에서 ls /dev/sd*해보면 제거되어 없음

이제 제거 된 testvol1을 centos1에 연결하고, 아무 디렉토리 만든 다음 둘을 마운트 해본다.

정상적인 상태라면 centos2에서 만든 파일이 보여야 한다.

virsh attach-disk centos1 /remote/voltest1 --target sdb --persistent --live

centos1에서

mkdir /mytest
mount /dev/sdb1 /mytest

# 아까 centos2에서 만들었던 txt 파일이 보임
ls /mytest/

도커 컨테이너와 같은 경우에는 휘발성이므로 자료가 영구보관되지 않는다. 이 경우 외부에 있는 스토리지를 활용하여 persistent volume(block storage)를 구성하면 자료를 영구적으로 보관할 수 있게 된다.

  1. 인스턴스 삭제하기(네트워크 종료는 virsh net-destroy default, 삭제는 virsh net-undefine private1)

종료(destroy) → 삭제(undefine)

virsh destroy centos1
virsh undefine centos1 --remove-all-storage

[브릿지 네트워크 이용하기]

  • 기존 kvm에서 활용중인 eth0은 routed port(L3 port = IP 입력 가능)이다.
  • IP가 입력되는 port는 별도의 네트워크가 구성된다. = 네트워크를 구분하게 된다.
  • 현재 실습에서 가상머신은 외부와 직접 통신하지 않으므로 공인 주소를 할당 받을 수 없다.
  • 기존 eth0을 routed port에서 ethernet port(L2 port)로 변경하면 eth0은 스위치의 하나의 포트로 동작하게 됨

Network Functions Virtualization(NFV)

[root@kvm1 ~]# cd /etc/sysconfig/network-scripts/
[root@kvm1 network-scripts]#
[root@kvm1 network-scripts]# ls ifcfg-eth*
ifcfg-eth0  ifcfg-eth1  ifcfg-eth2 # eth0이 인터넷 연결용 인터페이스
[root@kvm1 network-scripts]# cp ifcfg-eth0 ifcfg-br0
  • 다음과 같이 변경 (br0)
[root@kvm1 network-scripts]# vi ifcfg-br0
[root@kvm1 network-scripts]# cat ifcfg-br0
TYPE=Bridge
BOOTPROTO=none
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=211.183.3.101
PREFIX=24
GATEWAY=211.183.3.2
DNS1=8.8.8.8
  • 다음과 같이 변경 (eth0)
[root@kvm1 network-scripts]# vi ifcfg-eth0
[root@kvm1 network-scripts]# cat ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0 # 어떤 스위치에 포함될 것인가를 지정
  • network 재시작
[root@kvm1 network-scripts]# systemctl restart network
  • ifconfig 확인
  • br0에 IP가 할당되어 있고, eth0은 할당되어 있지 않게 됨
[root@kvm1 network-scripts]# ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 211.183.3.101  netmask 255.255.255.0  broadcast 211.183.3.255
        inet6 fe80::20c:29ff:fed7:7e7d  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:d7:7e:7d  txqueuelen 1000  (Ethernet)
        RX packets 26  bytes 7709 (7.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 41  bytes 5516 (5.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::20c:29ff:fed7:7e7d  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:d7:7e:7d  txqueuelen 1000  (Ethernet)
        RX packets 741  bytes 292419 (285.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 597  bytes 55300 (54.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

brctl show : 리눅스에서 제공하는 오픈소스 스위치인 linux bridge의 정보를 확인 할 수 있다.

[root@kvm1 network-scripts]# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.000c29d77e7d	no		eth0

이후 가상머신을 만들 때 br0을 연결하면 됨

[root@kvm1 network-scripts]# cp /remote/centos1.qcow2 /remote/centos11.qcow2

[브릿지 네트워크에 신규 VM 연결하기]

  • qcow2는 설치하는게 아니므로 —import로 하고, network를 bridge:br0으로
[root@kvm1 network-scripts]# virt-install --name centos11 --vcpus 1 --ram 1024 --disk /remote/centos11.qcow2 --import --network bridge:br0 --graphics vnc --noautoconsole
WARNING  No operating system detected, VM performance may suffer. Specify an OS with --os-variant for optimal results.

Starting install...
Domain creation completed.

이후 생성된 centos11을 실행하여 ip a로 ip를 확인해보면 211.183.3.X가 할당 된 것을 볼 수 있다.

인터넷과의 연결, 스토리지와의 연결 모두 정상적으로 되어야 한다.

ip a
ping www.google.com -c 3
ping 211.183.3.100 -c 3

웹서버 실행 후 윈도우 10에서 접속 가능 여부 확인

yum -y install httpd
systemctl restart httpd
systemctl stop firewalld

똑같이 kvm2도 구성해서 bridge로 변경 후 migrate

kvm2에서 커맨드로 kvm1로 다시 migrate하기

[root@kvm2 network-scripts]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 6     centos11                       running
 -     centos1                        shut off

[root@kvm2 network-scripts]# cd
[root@kvm2 ~]# virsh migrate --live centos11 qemu+ssh://kvm1/system --verbose --persistent --unsafe
root@kvm1's password: 
Migration: [100 %]

Quiz

우리는 현재 별도의 컨트롤 노드는 없다. 이를 대신하여 172.16.1.101(kvm1) 을 컨트롤 노드로 활용할 계획이다. 컨트롤 노드에서 관리할 컴퓨트 노드의 주소는 172.16.1.101(kvm1), 172.16.1.102(kvm2) 두 대이다.

ssh root@kvm1 virsh list —all

ssh root@kvm2 virsh list —all

했을 때, 두개의 명령어 실행이 가능해야 한다.

단, 패스워드는 묻지 말아야 한다.

kvm1에서 /etc/ssh/ssh_config 파일에는 root로 모든 호스트에 접속할 때에는 개인키를 이용하도록 해야한다.

각 서버에서 /etc/ssh/sshd_config에서는 public key를 이용하여 인증하도록 설정해야 한다.

ssh 서비스를 cleint (/etc/ssh/ssh_config 파일 이용) / server(/etc/ssh/sshd_config 파일 이용)

보안상 password 로그인 추천X

43 PubkeyAuthentication yes

65 PasswordAuthentication no

kvm1

ssh-keygen -q -f ~/.ssh/id_rsa -N ""

~/.ssh/에 id_rsa(개인키) 파일과 id_rsa.pub(공개키) 파일이 만들어진다.

공개키는 접속하고자 하는 서버의 ~/.ssh/authorized_keys에 넣어둔다.

[root@kvm1 network-scripts]# cd ~/.ssh
[root@kvm1 .ssh]# ls
id_rsa  id_rsa.pub  known_hosts
[root@kvm1 .ssh]# cat id_rsa.pub > authorized_keys

/etc/ssh/ssh_config 파일에 아래와 같은 내용을 추가하여 해당 호스트로 접속할 때에는 기본적으로 .ssh/id_rsa를 이용하여 접속하도록 설정해둔다.

vi /etc/ssh/ssh_config

------------------------파일 아래에 추가
Host  kvm1
        User root
        IdentityFile /root/.ssh/id_rsa

Host  kvm2
        User root
        IdentityFile /root/.ssh/id_rsa

변경된 사항은 서버에 활성화 되어야하므로 각 서버에서 systemctl restart sshd를 해 갱신

systemctl restart sshd

초반 서버인증을 위한 각 서버의 public key를 수집하기 위하여

ssh-keyscan kvm1 >> ~/.ssh/known_hosts
ssh-keyscan kvm2 >> ~/.ssh/known_hosts 를 해 두면 초반 접속시 yes/no 물어보는거 넘어가니까 편리함!!!

결과 확인

[root@kvm1 ~]# ssh kvm1 virsh list
 Id    Name                           State
----------------------------------------------------
 5     centos11                       running

[root@kvm1 ~]# ssh kvm2 virsh list
 Id    Name                           State
----------------------------------------------------

0개의 댓글