CLOUD

VMware -> OpenStack 실무 마이그레이션 가이드 - Migratekit 활용

92Hoonhee 2025. 8. 12. 15:29

Migratekit 실무 마이그레이션 가이드 - 컨버전 인스턴스 기반

본 가이드는 Migratekit을 활용하여 작성되었습니다.
Migratekit은 VMware에서 OpenStack으로 가상머신을 거의 무중단으로 마이그레이션할 수 있는 오픈소스 CLI 도구입니다.

📋 마이그레이션 사전 준비사항

1. VMware 접근 정보

다음 정보들을 미리 준비해주세요:

--vmware-endpoint YOUR_VMWARE_IP          # vCenter 또는 ESXi 호스트 IP/FQDN
--vmware-username username@domain.local   # VMware 관리자 계정
--vmware-password 'your_password'         # VMware 계정 비밀번호  
--vmware-path "/Datacenter01/vm/vm-name"  # 마이그레이션할 VM의 전체 경로

2. OpenStack admin-openrc 인증 정보

OpenStack 관리자 계정의 환경 변수 파일을 준비해주세요:

export OS_AUTH_URL=https://YOUR_OPENSTACK_IP:5000
export OS_USERNAME=your_username
export OS_PASSWORD=your_password
export OS_PROJECT_NAME=your_project
export OS_PROJECT_ID=your_project_id
# ... 기타 OpenStack 환경 변수들

3. VMware VDDK (Virtual Disk Development Kit)

중요: Broadcom 공식 홈페이지에서 로그인 후 다운로드 필요

  • 권장: VDDK 8.0.2 버전 사용
  • 대안: VDDK 9.x 버전 사용 가능하나 심볼릭 링크 추가 작업 필요
  • 참고: 테스트 시점에 8버전 다운로드 이슈가 있어 9버전을 사용한 경우가 있음

4. Migratekit 실행 환경

  • Docker 컨테이너 기반: 모든 작업이 Docker 컨테이너 내에서 실행되고 완료
  • 일회성 작업: 컨테이너 실행 후 자동으로 정리됨
  • 의존성 포함: 필요한 모든 도구들이 Docker 이미지에 포함

🏗️ 마이그레이션 아키텍처 개요

핵심 아키텍처 흐름

실제 운영 환경에서는 전용 컨버전 인스턴스를 OpenStack 클러스터에 구축하여 마이그레이션을 수행합니다.

VMware VM ────┐
              │ (VDDK를 통한 데이터 복사)
              ▼
컨버전 인스턴스 ──── OpenStack Cinder 볼륨 생성
    │                      │
    │ (볼륨 연결 및 변환)     │
    ▼                      │
libvirt + virt-v2v          │
패키지 설치 및 드라이버 변환   │
    │                      │
    ▼                      │
볼륨 분리 ──────────────────┘
    │
    ▼
새로운 OpenStack 인스턴스 생성 (변환된 볼륨 사용)

상세 변환 프로세스

  1. 데이터 복사: VMware VM의 디스크를 OpenStack Cinder 볼륨으로 복사
  2. 볼륨 연결: 생성된 볼륨을 컨버전 인스턴스에 연결
  3. OS 변환: 컨버전 인스턴스에서 virt-v2v를 사용하여 KVM 환경용 드라이버 설치
  4. 부팅 설정: OpenStack 환경에서 부팅 가능하도록 설정 변경
  5. 볼륨 분리: 변환 완료된 볼륨을 컨버전 인스턴스에서 분리
  6. 인스턴스 생성: 변환된 볼륨을 루트 디스크로 사용하여 새 인스턴스 생성

이는 보안, 성능, 안정성 측면에서 필수적인 아키텍처입니다.

🖥️ 컨버전 인스턴스 구성

1. 컨버전 인스턴스 요구사항

권장 스펙:

  • CPU: 8 vCPU 이상
  • 메모리: 16GB 이상
  • 디스크: 500GB 이상 (마이그레이션할 VM 크기의 2배)
  • OS: Ubuntu 22.04 LTS (24.04는 권장하지 않음)
  • 네트워크: VMware 환경과 OpenStack 모두 접근 가능

2. 컨버전 인스턴스 생성

# OpenStack에서 컨버전 인스턴스 생성
openstack server create \
  --image ubuntu-22.04 \
  --flavor large-cpu-mem \
  --network management-network \
  --security-group migration-sg \
  --key-name migration-key \
  migratekit-converter

# 플로팅 IP 할당 (필요시)
openstack floating ip create external
openstack server add floating ip migratekit-converter <floating-ip>

3. 컨버전 인스턴스 초기 설정

# 컨버전 인스턴스에 SSH 접속 후 실행

# 시스템 업데이트
sudo apt update && sudo apt upgrade -y

# Docker 설치
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker ubuntu

# 필수 패키지 설치
sudo apt install -y \
  qemu-utils \
  libguestfs-tools \
  python3-openstackclient \
  unzip \
  wget

# 재부팅 (커널 업데이트 적용)
sudo reboot

📦 VDDK 설치 및 구성

1. VDDK 다운로드 및 설치

# VMware 개발자 사이트에서 다운로드한 VDDK 파일을 컨버전 인스턴스로 전송
scp VMware-vix-disklib-8.0.2-distrib.tar.gz ubuntu@converter-ip:~/

# 컨버전 인스턴스에서 VDDK 설치
cd ~
tar -xzf VMware-vix-disklib-8.0.2-distrib.tar.gz

# VDDK 설치 경로 생성 및 복사
sudo mkdir -p /usr/lib64/vmware-vix-disklib/
sudo cp -r vmware-vix-disklib-distrib/lib64/* /usr/lib64/vmware-vix-disklib/
sudo cp -r vmware-vix-disklib-distrib/include /usr/lib64/vmware-vix-disklib/

# 권한 설정
sudo chmod -R 755 /usr/lib64/vmware-vix-disklib/

2. OpenStack 환경 변수 설정

# OpenStack 인증 정보 설정 (/home/ubuntu/openrc 파일 생성)
cat > /home/ubuntu/openrc << 'EOF'
export OS_AUTH_URL=https://YOUR_OPENSTACK_IP:5000
export OS_USERNAME=your_username
export OS_PASSWORD=your_password
export OS_PROJECT_NAME=your_project
export OS_PROJECT_ID=your_project_id
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_DOMAIN_NAME=Default
export OS_INTERFACE=internal
export OS_REGION_NAME=RegionOne
export OS_IDENTITY_API_VERSION=3
export OS_INSECURE=true
export PYTHONHTTPSVERIFY=0
export CURL_CA_BUNDLE=
EOF

# 환경 변수 로드
source /home/ubuntu/openrc

# OpenStack 연결 테스트
openstack server list

🔍 사전 정보 수집

1. govc 도구 설치 및 설정

# govc 다운로드 및 설치
cd /home/ubuntu
wget https://github.com/vmware/govmomi/releases/download/v0.30.0/govc_Linux_x86_64.tar.gz
tar -xzf govc_Linux_x86_64.tar.gz
sudo mv govc /usr/local/bin/
chmod +x /usr/local/bin/govc

# govc 환경 변수 설정
export GOVC_URL="https://username%40domain.local:password@VMWARE_IP/sdk"
export GOVC_INSECURE=1

2. VMware VM 정보 수집

# VM 목록 확인
govc find . -type m

# 특정 VM 정보 확인
govc vm.info /Datacenter01/vm/win2016-001

# 네트워크 인터페이스 및 MAC 주소 확인 (중요!)
govc device.info -vm /Datacenter01/vm/win2016-001 ethernet-*

# 예시 출력:
# Name:             ethernet-0
# MAC Address:      00:50:56:bc:19:7e
# Name:             ethernet-1  
# MAC Address:      00:0c:29:15:80:8a

3. OpenStack 리소스 정보 수집

# 사용 가능한 Flavor 확인
openstack flavor list

# 네트워크 정보 확인
openstack network list
openstack subnet list

# 보안 그룹 확인
openstack security group list

# 실제 성공한 리소스 ID들:
# Flavor ID: 046df869-4f85-4db6-86b0-7c9c49a7734d (win2016-scsi-uefi)
# Network ID: de21bb4f-51bc-4a50-a1a1-19d1bd546dcd
# Subnet ID: bb2ced08-18be-42dd-9a5f-972d32663deb  
# Security Group: 86600d2b-fd52-4e1e-ab88-165d3f971f98

🚀 실제 마이그레이션 실행

Phase 1: Migration (데이터 동기화)

여러 번 실행하여 증분 데이터 동기화:

# 환경 변수 로드
source /home/ubuntu/openrc

# 첫 번째 마이그레이션 (전체 복사)
docker run --rm --privileged --network host \
  --cap-add=ALL \
  --security-opt apparmor=unconfined \
  --security-opt seccomp=unconfined \
  -v /dev:/dev \
  -v /usr/lib64/vmware-vix-disklib:/usr/lib64/vmware-vix-disklib:ro \
  --env OS_AUTH_URL=https://YOUR_OPENSTACK_IP:5000 \
  --env OS_USERNAME=your_username \
  --env OS_PASSWORD=your_password \
  --env OS_PROJECT_NAME=your_project \
  --env OS_PROJECT_ID=your_project_id \
  --env OS_USER_DOMAIN_NAME=Default \
  --env OS_PROJECT_DOMAIN_NAME=Default \
  --env OS_DOMAIN_NAME=Default \
  --env OS_INTERFACE=internal \
  --env OS_REGION_NAME=RegionOne \
  --env OS_IDENTITY_API_VERSION=3 \
  --env OS_INSECURE=true \
  --env PYTHONHTTPSVERIFY=0 \
  --env CURL_CA_BUNDLE= \
  --env LIBGUESTFS_BACKEND=direct \
  --env LIBGUESTFS_NETWORK=0 \
  ghcr.io/vexxhost/migratekit:main migrate \
  --vmware-endpoint YOUR_VMWARE_IP \
  --vmware-username username@domain.local \
  --vmware-password 'your_password' \
  --vmware-path "/Datacenter01/vm/win2016-001" \
  --debug

이후 증분 동기화 (업무시간 중 반복 실행):

# 동일한 명령어로 변경사항만 동기화
# 첫 실행 이후에는 훨씬 빠르게 완료됨

Phase 2: Cutover (최종 전환)

실제 성공한 Cutover 명령어:

Windows 2016 (단일 네트워크)

docker run --rm --privileged --network host \
  --cap-add=ALL \
  --security-opt apparmor=unconfined \
  --security-opt seccomp=unconfined \
  -v /dev:/dev \
  -v /usr/lib64/vmware-vix-disklib:/usr/lib64/vmware-vix-disklib:ro \
  --env OS_AUTH_URL=https://YOUR_OPENSTACK_IP:5000 \
  --env OS_USERNAME=your_username \
  --env OS_PASSWORD=your_password \
  --env OS_PROJECT_NAME=your_project \
  --env OS_PROJECT_ID=your_project_id \
  --env OS_USER_DOMAIN_NAME=Default \
  --env OS_PROJECT_DOMAIN_NAME=Default \
  --env OS_DOMAIN_NAME=Default \
  --env OS_INTERFACE=internal \
  --env OS_REGION_NAME=RegionOne \
  --env OS_IDENTITY_API_VERSION=3 \
  --env OS_INSECURE=true \
  --env PYTHONHTTPSVERIFY=0 \
  --env CURL_CA_BUNDLE= \
  --env LIBGUESTFS_BACKEND=direct \
  --env LIBGUESTFS_NETWORK=0 \
  ghcr.io/vexxhost/migratekit:main cutover \
  --vmware-endpoint YOUR_VMWARE_IP \
  --vmware-username username@domain.local \
  --vmware-password 'your_password' \
  --vmware-path "/Datacenter01/vm/win2016-001" \
  --os-type windows \
  --disk-bus-type scsi \
  --debug \
  --availability-zone nova \
  --flavor 046df869-4f85-4db6-86b0-7c9c49a7734d \
  --network-mapping mac=00:50:56:bc:19:7e,network-id=de21bb4f-51bc-4a50-a1a1-19d1bd546dcd,subnet-id=bb2ced08-18be-42dd-9a5f-972d32663deb \
  --security-groups 86600d2b-fd52-4e1e-ab88-165d3f971f98 \
  --run-v2v

Rocky Linux (다중 네트워크)

sudo docker run --rm --privileged --network host \
  --cap-add=ALL \
  --security-opt apparmor=unconfined \
  --security-opt seccomp=unconfined \
  -v /dev:/dev \
  -v /usr/lib64/vmware-vix-disklib:/usr/lib64/vmware-vix-disklib:ro \
  --env OS_AUTH_URL=https://YOUR_OPENSTACK_IP:5000 \
  --env OS_USERNAME=your_username \
  --env OS_PASSWORD=your_password \
  --env OS_PROJECT_NAME=your_project \
  --env OS_PROJECT_ID=your_project_id \
  --env OS_USER_DOMAIN_NAME=Default \
  --env OS_PROJECT_DOMAIN_NAME=Default \
  --env OS_DOMAIN_NAME=Default \
  --env OS_INTERFACE=internal \
  --env OS_REGION_NAME=RegionOne \
  --env OS_IDENTITY_API_VERSION=3 \
  --env OS_INSECURE=true \
  --env PYTHONHTTPSVERIFY=0 \
  --env CURL_CA_BUNDLE= \
  --env LIBGUESTFS_BACKEND=direct \
  --env LIBGUESTFS_NETWORK=0 \
  ghcr.io/vexxhost/migratekit:main cutover \
  --vmware-endpoint YOUR_VMWARE_IP \
  --vmware-username "username@domain.local" \
  --vmware-password "your_password" \
  --vmware-path "/Datacenter01/vm/rocky" \
  --os-type auto \
  --disk-bus-type scsi \
  --debug \
  --availability-zone nova \
  --flavor 046df869-4f85-4db6-86b0-7c9c49a7734d \
  --network-mapping "mac=00:50:56:bc:18:3f,network-id=de21bb4f-51bc-4a50-a1a1-19d1bd546dcd,subnet-id=bb2ced08-18be-42dd-9a5f-972d32663deb" \
  --network-mapping "mac=00:0c:29:15:80:8a,network-id=de21bb4f-51bc-4a50-a1a1-19d1bd546dcd,subnet-id=bb2ced08-18be-42dd-9a5f-972d32663deb" \
  --security-groups "86600d2b-fd52-4e1e-ab88-165d3f971f98" \
  --run-v2v

🔄 마이그레이션 프로세스 상세

1. Migration Phase 동작 원리

  1. 스냅샷 생성: VMware에서 자동으로 VM 스냅샷 생성
  2. 데이터 복사: 증분 복사로 OpenStack Cinder 볼륨에 데이터 전송
  3. 메타데이터 수집: VM 구성 정보 수집 및 저장
  4. 진행 상황 추적: 다음 동기화를 위한 체크포인트 생성

2. Cutover Phase 동작 원리

  1. 최종 동기화: 마지막 변경사항 복사
  2. VM 종료: VMware에서 Source VM 자동 종료
  3. Final 복사: 남은 변경사항 최종 동기화
  4. OS 변환: virt-v2v-in-place로 KVM 환경에 맞게 드라이버 변환
  5. 네트워크 설정: Neutron 포트 및 IP 할당
  6. 인스턴스 생성: OpenStack에서 새 인스턴스 부팅

📊 모니터링 및 검증

1. 마이그레이션 진행 상황 모니터링

# Docker 컨테이너 로그 확인
docker ps  # 실행 중인 컨테이너 ID 확인
docker logs -f <container-id>

# OpenStack 볼륨 확인 (Migration 중)
openstack volume list | grep <vm-name>

# 컨버전 인스턴스 리소스 사용량 확인
htop
df -h
iostat -x 1

2. 마이그레이션 완료 후 검증

# 새로 생성된 인스턴스 확인
openstack server list | grep <vm-name>

# 인스턴스 상세 정보
openstack server show <instance-name>

# 볼륨 연결 상태 확인
openstack volume list
openstack server show <instance-name> -c volumes_attached

# 네트워크 연결 확인
openstack port list --server <instance-name>

3. VM 부팅 및 기능 테스트

# 콘솔 로그 확인
openstack console log show <instance-name>

# VNC 콘솔 접속 URL 획득
openstack console url show <instance-name>

# 네트워크 연결 테스트 (인스턴스 내부에서)
ping <gateway-ip>
ping <external-ip>

# 서비스 상태 확인 (Linux의 경우)
systemctl status

⚠️ 실무 주의사항 및 팁

1. 성능 최적화

  • 컨버전 인스턴스 전용 사용: 다른 워크로드와 격리
  • 네트워크 대역폭: VMware와 OpenStack 간 충분한 대역폭 확보
  • 디스크 I/O: SSD 기반 스토리지 사용 권장
  • 동시 마이그레이션 제한: 컨버전 인스턴스당 2-3개 VM만 동시 처리

2. 보안 고려사항

  • 전용 보안 그룹: 마이그레이션용 보안 그룹 생성
  • 네트워크 격리: 관리 네트워크를 통한 접근 제한
  • 인증 정보 보호: 환경 변수 파일 권한 설정 (600)
  • 임시 파일 정리: 마이그레이션 완료 후 임시 데이터 삭제

3. 필수 체크리스트

  • [ ] 모든 네트워크 인터페이스 MAC 주소 확인
  • [ ] OpenStack 리소스 할당량 확인
  • [ ] VMware 계정 권한 검증
  • [ ] 백업 및 스냅샷 생성
  • [ ] 다운타임 윈도우 협의
  • [ ] 롤백 계획 수립

4. 일반적인 문제 해결

  • "모든 MAC 주소 매핑 필수": Rocky Linux 예시처럼 모든 인터페이스 포함
  • SSL 인증서 오류: OS_INSECURE=true 설정 확인
  • 권한 오류: VMware 계정의 모든 필수 권한 재확인
  • 디스크 공간 부족: 컨버전 인스턴스 볼륨 확장
  • 네트워크 연결 실패: 방화벽 및 라우팅 설정 확인

🎯 성공 요인 요약

  1. 전용 컨버전 인스턴스 구축 - 충분한 리소스와 격리된 환경
  2. 완벽한 사전 조사 - govc를 통한 정확한 VM 정보 수집
  3. 네트워크 매핑 완성도 - 모든 MAC 주소 빠짐없이 매핑
  4. 단계적 마이그레이션 - Migration → Cutover 순서 준수
  5. 철저한 검증 - 각 단계별 결과 확인 및 테스트

이 가이드를 통해 실제 운영 환경에서 안정적이고 성공적인 VMware to OpenStack 마이그레이션을 수행할 수 있습니다!