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)
- Host → VM: SSH, kubectl 접근 가능 (NAT 아웃바운드)
- VM ↔ VM: 동일 브릿지 내 직접 통신
- 외부 → VM: Host에서 포트 포워딩 또는
virsh console사용
전용 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"