개요
CentOS 7 기반의 OpenStack Kilo 버전 환경에서 가상 머신(인스턴스)의 실시간 마이그레이션(live migration)을 가능하게 하기 위한 설정 과정을 설명합니다. 이 작업은 서비스 중단 없이 인스턴스를 한 컴퓨팅 노드에서 다른 노드로 이동시키는 데 필요합니다.
1. 인스턴스 디렉터리 권한 설정
모든 컴퓨팅 노드에서 Nova 인스턴스 디렉터리에 대한 접근 권한을 조정해야 합니다.
chmod 755 /var/lib/nova/instances
2. nova.conf 설정 수정
각 컴퓨팅 노드의
/etc/nova/nova.conf 파일에 아래 항목을 추가 또는 수정합니다. 여기서 "가상머신IP"는 해당 노드의 관리 네트워크 IP 주소로 대체되어야 합니다.
vncserver_proxyclient_address=가상머신IP
vncserver_listen=0.0.0.0
3. libvirt 관련 설정 변경
3.1 libvirtd.conf 수정
/etc/libvirt/libvirtd.conf 파일에서 다음 설정의 주석을 해제하고, 보안 인증 방식을 비활성화합니다.
listen_tls = 0
listen_tcp = 1
tcp_port = "16509"
listen_addr = "0.0.0.0"
auth_tcp = "none"
3.2 qemu.conf 수정
VNC 연결 및 실행 사용자 권한을 설정하기 위해
/etc/libvirt/qemu.conf 파일을 수정합니다.
vnc_listen = "0.0.0.0"
user = "root"
group = "root"
3.3 libvirtd 시스템 설정
libvirt 데몬이 TCP 통신을 수신하도록 하기 위해
/etc/sysconfig/libvirtd 파일을 업데이트합니다.
LIBVIRTD_CONFIG=/etc/libvirt/libvirtd.conf
LIBVIRTD_ARGS="--listen"
4. libvirtd 서비스 재시작
설정 적용을 위해 libvirt 데몬을 재시작합니다.
systemctl restart libvirtd.service
5. 연결 테스트
다음 명령어로 원격 libvirt 데몬에 접속 가능한지 확인합니다. 실제 서버 IP 주소로 교체하여 실행합니다.
virsh -c qemu+tcp://[서버IP]/system
오류 없이 접속되면 정상입니다. 접속 실패 시 방화벽 설정을 점검해야 합니다.
방화벽 처리 방법
- 방법 1: 방화벽 완전 비활성화 (테스트 환경용)
systemctl stop firewalld
방법 2: 필요한 포트 개방
firewall-cmd --permanent --add-port=16509/tcp
firewall-cmd --reload
포트 사용 여부 확인:
netstat -tulnp | grep libvirt
정상 동작 시
0.0.0.0:16509 에서 리스닝 중인 상태를 확인할 수 있습니다.
6. 마이그레이션 명령어 예시
OpenStack CLI를 사용해 실시간 마이그레이션을 수행합니다.
nova list
이동 대상 인스턴스 확인:
nova show [INSTANCE_ID]
사용 가능한 컴퓨팅 노드 목록 조회:
nova-manage service list
대상 노드의 자원 상태 확인:
nova-manage service describe_resource [TARGET_NODE]
실시간 마이그레이션 실행:
nova live-migration [INSTANCE_ID] [TARGET_COMPUTE_HOST]
성공 시 출력이 없으며,
nova list 또는 Horizon 대시보드에서 인스턴스 위치 변경을 확인할 수 있습니다.
참고 사항
CPU 아키텍처 간 마이그레이션은 제한이 있습니다. 명령어 집합(instruction set)이 적은 CPU에서 많은 CPU로의 마이그레이션은 가능하지만 그 반대는 실패할 수 있습니다. 호환성을 보장하려면
cpu_mode 및
migrate_transport 설정을 고려해야 합니다.
실제 설정 예시
다음은 설정 파일에서 주석과 빈 줄을 제거한 핵심 내용입니다.
nova.conf:
[DEFAULT]
allow_resize_to_same_host=true
allow_migrate_to_same_host=true
[libvirt]
virt_type = kvm
inject_password=false
inject_key=false
inject_partition=-2
disk_cachemodes="network=writeback"
images_type=rbd
images_rbd_pool=vms
images_rbd_ceph_conf= /etc/ceph/ceph.conf
hw_disk_discard=unmap
rbd_user = cinder
rbd_secret_uuid = 457eb676-33da-42ec-9a8c-9293d545c337
libvirtd.conf:
listen_tls = 0
listen_tcp = 1
tcp_port = "16509"
listen_addr = "0.0.0.0"
auth_tcp = "none"
qemu.conf:
vnc_listen = "0.0.0.0"
user = "root"
group = "root"
/etc/sysconfig/libvirtd:
LIBVIRTD_CONFIG=/etc/libvirt/libvirtd.conf
LIBVIRTD_ARGS="--listen"