🏠 목록 02. VM 구성 가이드 📄 MD 원본 📁 Files 🔒 Private 🌓 테마

02. VM 구성 가이드

아키텍처 개요

Host (203.0.113.2)
└── libvirt NAT 네트워크: k8s-lab (203.0.113.0/24)
    ├── k8s-ctrl1  203.0.113.11  (control-plane + etcd)
    ├── k8s-ctrl2  203.0.113.12  (control-plane + etcd)
    └── k8s-ctrl3  203.0.113.13  (control-plane + etcd)

전용 libvirt 네트워크 생성

network/k8s-lab-network.xml 정의를 사용합니다.

# 네트워크 정의 등록
virsh net-define network/k8s-lab-network.xml

# 네트워크 시작 및 자동시작 설정
virsh net-start k8s-lab
virsh net-autostart k8s-lab

# 확인
virsh net-list --all
virsh net-dumpxml k8s-lab

Cloud Image 기반 VM 생성 방식

Base Image를 공유하고 각 VM마다 overlay qcow2를 생성하는 방식을 사용합니다. (디스크 공간 절약 + 빠른 VM 생성)

ubuntu-22.04-server-cloudimg-amd64.img  ← Base (읽기 전용)
        │
        ├── k8s-ctrl1.qcow2  ← overlay (쓰기)
        ├── k8s-ctrl2.qcow2  ← overlay (쓰기)
        └── k8s-ctrl3.qcow2  ← overlay (쓰기)

1) Overlay 디스크 생성 (VM당)

BASE="/var/lib/libvirt/images/ubuntu-22.04-server-cloudimg-amd64.img"
IMGDIR="/var/lib/libvirt/images"

for i in 1 2 3; do
    sudo qemu-img create \
        -f qcow2 \
        -F qcow2 \
        -b "${BASE}" \
        "${IMGDIR}/k8s-ctrl${i}.qcow2" \
        40G
done

2) Cloud-init ISO 생성 (VM당)

각 VM의 hostname이 다르므로 meta-data만 다르게 생성합니다.

for i in 1 2 3; do
    # meta-data: hostname 지정
    cat > /tmp/meta-data-ctrl${i} <<EOF
instance-id: k8s-ctrl${i}
local-hostname: k8s-ctrl${i}
EOF

    # cloud-init ISO 생성
    genisoimage \
        -output "${IMGDIR}/k8s-ctrl${i}-cloud-init.iso" \
        -volid cidata \
        -joliet \
        -rock \
        cloud-init/user-data \
        /tmp/meta-data-ctrl${i}
done

3) VM 생성 (virt-install)

for i in 1 2 3; do
    virt-install \
        --name "k8s-ctrl${i}" \
        --memory 8192 \
        --vcpus 4 \
        --disk path="/var/lib/libvirt/images/k8s-ctrl${i}.qcow2",format=qcow2,bus=virtio \
        --disk path="/var/lib/libvirt/images/k8s-ctrl${i}-cloud-init.iso",device=cdrom \
        --os-variant ubuntu22.04 \
        --network network=k8s-lab,mac="52:54:00:00:01:0${i}",model=virtio \
        --graphics none \
        --console pty,target_type=serial \
        --import \
        --noautoconsole
done

VM 부팅 확인

# VM 상태 확인
virsh list --all

# VM 콘솔 접근 (cloud-init 완료 대기)
virsh console k8s-ctrl1
# 빠져나오기: Ctrl + ]

# cloud-init 완료 확인
ssh -i ~/.ssh/k8s-lab [email protected] "cloud-init status"
# 결과: status: done 확인

SSH 접근 확인

# /etc/hosts 또는 ~/.ssh/config 등록 (편의용)
cat >> ~/.ssh/config <<'EOF'

Host k8s-ctrl1
    HostName 203.0.113.11
    User ubuntu
    IdentityFile ~/.ssh/k8s-lab
    StrictHostKeyChecking no

Host k8s-ctrl2
    HostName 203.0.113.12
    User ubuntu
    IdentityFile ~/.ssh/k8s-lab
    StrictHostKeyChecking no

Host k8s-ctrl3
    HostName 203.0.113.13
    User ubuntu
    IdentityFile ~/.ssh/k8s-lab
    StrictHostKeyChecking no
EOF

# 접속 테스트
ssh k8s-ctrl1 hostname
ssh k8s-ctrl2 hostname
ssh k8s-ctrl3 hostname

VM 관리 명령어 참고

# VM 시작/정지
virsh start k8s-ctrl1
virsh shutdown k8s-ctrl1
virsh destroy k8s-ctrl1     # 강제 종료 (전원 OFF)

# VM 삭제 (디스크 포함)
virsh undefine k8s-ctrl1 --remove-all-storage

# VM 스냅샷 (실험 전 상태 보존용)
virsh snapshot-create-as k8s-ctrl1 "before-experiment" "실험 전 스냅샷"
virsh snapshot-list k8s-ctrl1
virsh snapshot-revert k8s-ctrl1 "before-experiment"