OPENSTACK - Nova
Nova
※ 아직 해당 포스팅 작성이 완료되지 않았으므로 참고만 하기 바람
1. 개요
OPENSTACK에서 진행하는 프로젝트 중 NOVA는 컴퓨터 인스턴스 (가상화 서버)를 제공하는 방법에 대한 프로젝트이다. 컴퓨터 인스턴스에 대한 제공만 관여하는 프로젝트이기 때문에 아래와 같은 다른 프로젝트와 연동해서 사용해야한다.
- Keystone : 인증
- Glance : 가상화 서버 이미지
- Neutron : 네트워크
- Placement : CPU 사용량이나 메모리 사용량 등 지표 제공
프로젝트 대부분이 Python 코드로 이루어져있으며 큰 구조는 아래와 같다.
출처 : https://docs.openstack.org/nova/latest/admin/architecture.html
왼쪽 위에 범례를 보면 잘 나와있지만 육각형은 NOVA를 제외한 서비스이고, 사각형은 NOVA 서비스이다. 각 서비스들이 통신을 하는 방식이 점선 혹은 실선으로 나와있다.
2. 각 컴포넌트별 설명
1) API 서버
이 서버를 통해 사용자는 하이퍼바이저, 스토리지, 네트워킹에 대한 명령과 제어를 프로그래밍 방식으로 사용할 수 있다.
API 엔드포인트는 Amazon, Rackspace 및 관련 모델에서 다양한 API 인터페이스를 사용하여 인증, 권한 부여 및 기본 명령 및 제어 기능을 처리하는 기본 HTTP 웹 서비스이며 이를 통해 다른 공급업체의 제품과 상호 작용하도록 만들어진 여러 기존 도구 세트와 API 호환성이 가능하다. 이러한 광범위한 호환성은 공급업체에 종속되는 것을 방지한다. 기본적으로 HTTP 요청을 수신하고 명령을 변환하며 oslo.messaging 큐나 HTTP를 통해 다른 구성 요소와 통신하는 구성 요소이다.
2) Conductor
조정(빌드/크기 조정)이 필요한 요청을 처리하고, 데이터베이스 프록시 역할을 하거나 객체 변환을 처리한다.
3) Scheduler
각 인스턴스를 어느 호스트에 할당할지 결정한다.
4) Compute
하이버바이저 및 가상머신과의 통신을 관리한다.
※ oslo.messaging
메세징 라이브러리로 서버와 클라이언트간에 프로시저 호출을 하거나, 혹은 이벤트 알림을 발행하는데 사용되는 라이브러리이다.
3. 소스코드 구조
기본적으로 Openstack nova의 소스코드는 이곳 에서 받을 수 있다. 릴리즈 버전들을 올려둔 공식 사이트이다. 소스코드를 받아와보면 여러 폴더들이 있다.
실질적인 코드는 nova 폴더안에 있는 파일들이다.
각 기능별로 구분되어있으며 전체를 다 살펴보기엔 시간이 많이 걸릴 것 같으니 폴더의 주요한 부분만 살펴보겠다.
accelerator
- 역할: 하드웨어 가속 장치와 관련된 코드. GPU 또는 FPGA와 같은 하드웨어 리소스를 관리하기 위한 코드가 포함됩니다.
- 내용: 가속기 리소스 할당, 스케줄링, 관리 코드.
api
- 역할: Nova API와 관련된 코드.
- 내용: RESTful API 엔드포인트, 요청 처리, OpenStack API 버전 관리와 관련된 코드.
cmd
- 역할: Nova 서비스의 명령줄 스크립트를 포함.
- 내용: Nova 컴포넌트를 시작하는 데 사용되는 스크립트(예:
nova-api
,nova-scheduler
,nova-compute
).compute
- 역할: Nova의 주요 컴포넌트로, 가상 머신(VM) 관리에 관한 로직.
- 내용: 인스턴스 생성, 삭제, 스냅샷 생성과 같은 작업.
conductor
- 역할: Nova 컴포넌트 간의 데이터 이동을 중개.
- 내용: 원격 프로시저 호출(RPC)을 처리하고 DB 액세스를 중앙화.
conf
- 역할: Nova 설정 옵션 정의.
- 내용: 각 Nova 컴포넌트의 설정 옵션 및 기본값.
console
- 역할: 인스턴스 콘솔 액세스 관리.
- 내용: VNC, RDP와 같은 콘솔 프로토콜 지원.
db
- 역할: Nova 데이터베이스 작업 관련 코드.
- 내용: 데이터베이스 모델, CRUD 작업, 마이그레이션 스크립트.
hacking
- 역할: 코드 품질 검사 규칙과 관련된 코드.
- 내용: PEP8 기반 규칙, 코드 스타일 검사기.
image
- 역할: Glance 이미지 서비스와의 통합.
- 내용: 이미지 관리, Glance API 호출 로직.
keymgr
- 역할: 키 관리 서비스와 관련된 코드.
- 내용: 암호화 키 저장 및 액세스 로직.
limit
- 역할: API 요청 제한(쿼터 관리)과 관련된 코드.
- 내용: 사용량 추적, 제한 초과 처리.
locale
- 역할: 다국어 지원(로컬라이제이션).
- 내용: 번역된 메시지 파일과 관련 코드.
network
- 역할: 네트워크 리소스 관리.
- 내용: Neutron과의 통합, 네트워크 구성 관련 코드.
notifications
- 역할: 알림 및 이벤트 관리.
- 내용: RabbitMQ 같은 메시지 대기열에 이벤트를 게시하는 코드.
objects
- 역할: Nova 데이터 모델 관리.
- 내용: 원격 객체 관리 및 버전 관리.
pci
- 역할: PCI 장치 관리.
- 내용: PCI 리소스 할당 및 스케줄링 코드.
policies
- 역할: Nova 정책 정의 및 관리.
- 내용: RBAC(역할 기반 액세스 제어)와 관련된 정책 파일.
privsep
- 역할: 최소 권한 작업을 위한 분리된 프로세스 관리.
- 내용: 보안 목적으로 권한을 격리하여 실행하는 코드.
scheduler
- 역할: 인스턴스를 배치할 호스트를 결정.
- 내용: 리소스 스케줄링 로직, 필터 및 가중치 알고리즘.
servicegroup
- 역할: Nova 서비스 그룹 관리.
- 내용: 서비스 상태 모니터링, 알림 관리.
share
- 역할: 공유 스토리지와 관련된 코드.
- 내용: 공유 디스크 관리 및 설정.
storage
- 역할: 스토리지 관련 코드.
- 내용: 스토리지 백엔드와의 통합 로직.
tests
- 역할: Nova 테스트 코드.
- 내용: 유닛 테스트, 기능 테스트, 통합 테스트.
virt
- 역할: 하이퍼바이저와의 상호작용.
- 내용: 다양한 하이퍼바이저(KVM, Xen, VMware 등)를 지원하는 드라이버.
volume
- 역할: 블록 스토리지 관리.
- 내용: Cinder와의 통합, 볼륨 연결 및 분리.
wsgi
- 역할: Nova API의 WSGI(Web Server Gateway Interface) 관련 코드.
- 내용: API 요청 라우팅, WSGI 애플리케이션 정의.
※ 추가 예정 사항
- 아직 코드를 완전히 보지 못해서 어떻게 하이퍼바이저와 통신하여 인스턴스를 만드는지 명확히 알지 못한다.(하이퍼 바이저에서 지원하는지? 혹은 별도의 드라이버를 사용하는지) 이 부분은 추가적으로 업데이트 할 예정이다.