nova란?
- Nova는 오픈 스택 프로젝트 중 하나이며, 컴퓨트 인스턴스(가상 서버) 프로비져닝 서비스를 제공한다.
- Nova는 기본적으로 가상 머신의 생성과 Ironic을 통한 베어 메탈 서버의 생성을 지원한다.
- Nova는 리눅스 서버 상에서 여러 개의 데몬으로 움직이며 서비스를 제공한다.
Nova API
- Nova의 모든 사용자 기능은 REST API를 통해서 제공되고 있으며, 이 기능을 사용하여 더 복잡한 로직을 만들거나 Nova 서비스를 자동화 할 수 있다.
- 아래는 yoga기준 지원하는 nova api version
- API 문서
- https://docs.openstack.org/api-ref/compute
ubuntu@controller:~$ curl $NOVA_IP/compute/ | python -mjson.tool
{
"versions": [
{
"id": "v2.0",
"status": "SUPPORTED",
"version": "",
"min_version": "",
"updated": "2011-01-21T11:33:21Z",
"links": [
{
"rel": "self",
"href": "http://$NOVA_IP/compute/v2/"
}
]
},
{
"id": "v2.1",
"status": "CURRENT",
"version": "2.90",
"min_version": "2.1",
"updated": "2013-07-23T11:33:21Z",
"links": [
{
"rel": "self",
"href": "http://$NOVA_IP/compute/v2.1/"
}
]
}
]
}
nova daemon 목록
nova-api
- end user의 compute API 호출을 허용하고 응답
- 이 서비스는 admin User가 관리작업을 수행할 수 있도록 OpenStack Compute API, Amazon EC2 API등의 API를 지원
- 인스턴스를 실행하고 관리 제어하는 역할을 담당
nova-api-metadata
- 인스턴스의 메타데이터 요청을 수락
nova-compute
- 하이퍼바이저 API를 통해 VM 인스턴스를 생성하고 종료하는 데몬입니다. 하이퍼바이저는 XenServer / KVM / VMWare등이 있습니다.
nova-schedule
- queue에서 VM 인스턴스의 Request를 가져와 가상 시스템이 실행되는 Compute 서버 노드를 결정합니다.
nova-conductor
- nova-compute service와 데이터베이스 간의 상호 작용을 관리합니다.
nova-novncproxy
- VNC 연결을 통해 실행 중인 인스턴스에 액세스하는 프록시를 제공합니다. 브라우저 기반 novnc 클라이언트를 지원합니다.
nova 관련 개념
Hosts
- 호스트는 Nova에서 생성된 가상 서버에 대한 리소스를 제공하는 물리적 시스템
- 호스트는 시스템의 가상 서버와 상호 작용하기 위해 Nova로부터 요청을 수신하는 nova-compute service를 실행
- 호스트는 현재 리소스 현황을 Nova에 다시 보고하여 스케줄러가 가장 적합한 새 가상 서버에 대한 요청을 호스트에 배치할 수 있도록 한다.
Hypervisor
- 하이퍼바이저는 가상 머신을 만들고 실행하는 컴퓨터 소프트웨어, 펌웨어 또는 하드웨어의 한 부분이다.
- nova에서는 각 호스트가 하이퍼바이저를 실행합니다. 관리자는 하이퍼바이저에 현재 실행 중인 모든 가상 서버와 같은 정보와 CPU, 메모리 또는 디스크 관련 구성과 같은 하이퍼바이저에 대한 자세한 정보를 쿼리할 수 있다.
- 현재 nova에서 지원하는 hypervisor 목록
- libvirt ( QEMU / KVM )
- Hyper-V
- VMware vSphere
- XenServer
- Xen via libvirt
Nova System Architecture (queens기준)
DB: 데이터 저장을 위한 SQL 데이터베이스.
API HTTP 요청을 수신하고 명령을 변환하며 oslo.messaging 큐 또는 HTTP를 통해 다른 구성 요소와 통신하는 구성 요소
Scheduler: 생성할 인스턴스를 배치할 호스트 결정
Network: IP 전달, 브리지 및 VLAN 또는 VxLAN 관리
Compute: 하이퍼바이저 및 가상 시스템과의 통신을 관리
Conductor: 조정이 필요한 요청(빌드/크기 조정)을 처리하거나 데이터베이스 프록시 역할을 하거나 개체 변환을 처리
인스턴스 생성 flow
아래 과정들은 API로 생성 요청을 접수하는 처리와 요청에 따라 실제로 가상 서버를 생성하는 처리가 비동기적으로 분리되어 실행된다.
API의 비동기 처리 방식
- 인스턴스를 생성하는 API를 실행시켜도 즉시 인스턴스가 생성되지 않는다.
- server show명령어로 상태를 확인해보면 BUILD인것을 확인할 수 있다.
- 또한, 아래와 같이 완료될 때까지 GET을 이용해 상태 확인을 반복적으로 check한다.
인스턴스가 생성되기까지의 처리 흐름
nova-conductor
- grizzly 버전부터 생긴 기능, nova-compute와 DB 사이에 위치하고 Nova Database에 접근하기 위한 역할을 한다.
- nova-api 또는 nova-scheduler와 마찬가지로 수평으로 확장할 수 있다.
- 주의사항
- nova-compute와 같은 노드에서 동작하면 안된다.
- 이유는 nova-compute 노드가 직접적으로 데이터베이스 액세스를 못하게 하려고 conductor를 만들거기 때문에 이점이 사라진다.
nova-conductor의 탄생 배경 (no-db-compute)
-
요약
-
해커가 과거 KVM 및 XEN에서 발견된 하이퍼바이저의 취약점을 이용해 공격의 성공하는 경우 해커는 nova.conf에 있는 MySQL 데이터베이스를 쉽게 조작하여 OpenStack Cloud에 혼란을 줄 수 있다.
-
이점
-
DB 해킹의 위험 감소
-
nova-compute의 부하 감소
- conductor의 역할
- 초기
- 초기에 nova-compute가 데이터베이스 작업을 오프로드하는 데 사용하는 비교적 간단한 메서드
- 현재 (zed 기준, /usr/lib/python2.7/dist-packages/nova/conductor/api.py에서 확인가능)
- resize_instance
- live_migrate_instance
- build_instances
- schedule_and_build_instances
- unshelve_instance
- rebuild_instance
- cache_images (queens에선 미구현)