OpenStack 서비스 아키텍처
개요
OpenStack은 분산 마이크로서비스 아키텍처를 따릅니다. 각 서비스는 독립적으로 동작하며, 공통 컴포넌트(인증, 메시징, 데이터베이스)를 공유합니다.
아키텍처 원칙
1. 모듈화 (Modularity)
- 각 서비스는 독립적인 프로젝트
- 필요에 따라 서비스 선택 사용
2. 확장성 (Scalability)
- 수평 확장 (Horizontal Scaling)
- 서비스 인스턴스 추가로 용량 증가
3. 가용성 (Availability)
- Active-Active 또는 Active-Passive 구성
- 장애 시 자동 전환
4. API 중심 (API-First)
- 모든 기능이 REST API로 제공
- CLI와 Dashboard는 API 래퍼
공통 아키텍처 패턴
모든 OpenStack 서비스는 다음과 같은 공통 패턴을 따릅니다:
1. API Layer (API 계층)
역할:
- RESTful API 엔드포인트 제공
- 인증 및 권한 검증
- 요청 라우팅
구성 요소:
- API Server: HTTP 요청 처리
- WSGI Application: Python WSGI 서버 (uWSGI, Gunicorn)
- Paste Configuration: API 라우팅 설정
예시 (Nova):
HTTP Request → Nova API → Nova Service
2. Service Layer (서비스 계층)
역할:
- 비즈니스 로직 처리
- 작업 스케줄링
- 리소스 관리
구성 요소:
- Service Manager: 서비스 인스턴스 관리
- Scheduler: 리소스 할당 결정
- Worker: 실제 작업 수행
3. Driver Layer (드라이버 계층)
역할:
- 백엔드 기술 추상화
- 다양한 하드웨어/소프트웨어 통합
예시:
- Nova: KVM, VMware, Hyper-V 드라이버
- Cinder: Ceph, iSCSI, NFS 드라이버
- Neutron: OVS, Linux Bridge, SDN 드라이버
4. Database Layer (데이터베이스 계층)
역할:
- 서비스 상태 저장
- 메타데이터 관리
- 트랜잭션 관리
데이터베이스:
- 각 서비스별 독립 데이터베이스
- MySQL/MariaDB/PostgreSQL 사용
5. Message Queue (메시지 큐)
역할:
- 서비스 간 비동기 통신
- 작업 큐 관리
- 이벤트 전달
메시지 큐:
- RabbitMQ (기본)
- ZeroMQ
- Apache Qpid
코어 서비스 아키텍처
1. Keystone (Identity Service)
역할: 인증, 권한 관리, 서비스 카탈로그
주요 컴포넌트:
Identity (인증):
- User: 실제 사용자
- Group: 사용자 그룹
- Project (Tenant): 리소스 격리 단위
- Domain: 프로젝트 그룹핑
Authentication (인증 방법):
- Password: 사용자명/비밀번호
- Token: 임시 토큰 (기본)
- Federated: 외부 IdP 통합 (SAML, OAuth)
Authorization (권한):
- Role: 권한 정의
- Policy: 정책 기반 접근 제어 (JSON 규칙)
Service Catalog:
- 등록된 서비스 목록 및 엔드포인트
아키텍처:
Client → Keystone API → Backend (SQL/LDAP)
↓
Token 발급
↓
서비스 인증 및 권한 확인
주요 엔드포인트:
/v3/auth/tokens: 토큰 발급/v3/projects: 프로젝트 목록/v3/users: 사용자 관리
2. Nova (Compute Service)
역할: 가상 머신 생명주기 관리
주요 컴포넌트:
nova-api:
- REST API 제공
- 인증 및 권한 검증
- 요청 검증 및 라우팅
nova-conductor:
- 데이터베이스 접근 중재
- 장기 작업 관리
- Compute 노드와 DB 간 격리
nova-scheduler:
- VM 배치 결정
- 필터 및 웨이더 알고리즘
- 리소스 가용성 확인
nova-compute:
- Compute 노드에서 실행
- 하이퍼바이저와 통신
- VM 생성/삭제/관리
nova-consoleauth:
- 콘솔 접근 인증
nova-novncproxy:
- VNC 프록시
nova-spicehtml5proxy:
- SPICE 프록시
아키텍처 흐름 (VM 생성):
1. Client → nova-api (VM 생성 요청)
2. nova-api → Keystone (인증)
3. nova-api → nova-conductor (스케줄링 요청)
4. nova-conductor → nova-scheduler (노드 선택)
5. nova-scheduler → nova-conductor (선택된 노드)
6. nova-conductor → nova-compute (VM 생성 명령)
7. nova-compute → Hypervisor (VM 생성)
8. nova-compute → Message Queue (상태 업데이트)
하이퍼바이저 드라이버:
- libvirt/KVM: Linux 기반, 가장 일반적
- VMware vSphere: vCenter 통합
- Hyper-V: Windows 환경
- Xen: Xen 하이퍼바이저
- Bare Metal (Ironic): 물리적 서버
3. Neutron (Networking Service)
역할: 네트워크 가상화 및 관리
주요 컴포넌트:
neutron-server:
- REST API 제공
- 플러그인 관리
- 네트워크 정책 관리
Neutron Plugins:
- ML2 (Modular Layer 2): 네트워크 타입 추상화
- Type Drivers: local, flat, vlan, vxlan, gre
- Mechanism Drivers: linuxbridge, openvswitch, SR-IOV
L3 Agent (neutron-l3-agent):
- 라우터 관리
- NAT (SNAT, DNAT)
- Floating IP 관리
DHCP Agent (neutron-dhcp-agent):
- 가상 네트워크에 DHCP 서비스 제공
- IP 주소 할당
Metadata Agent (neutron-metadata-agent):
- VM 메타데이터 서비스 제공
- cloud-init과 통신
Open vSwitch (OVS):
- 가상 스위치
- Flow 규칙 관리
- SDN 지원
네트워크 아키텍처:
Provider Networks (간단한 구조):
VM → OVS/Linux Bridge → Physical Network
Self-Service Networks (고급 구조):
VM → Tenant Network (VXLAN/GRE) → Router → External Network
네트워크 구성 요소:
- Network: 논리적 네트워크 격리 단위
- Subnet: IP 주소 범위 정의
- Router: 네트워크 간 라우팅
- Port: 네트워크 인터페이스
- Security Group: 방화벽 규칙
Service Plugins:
- FWaaS (Firewall as a Service): 방화벽 규칙
- LBaaS (Load Balancer as a Service): 로드 밸런서
- VPNaaS (VPN as a Service): VPN 연결
4. Cinder (Block Storage Service)
역할: 블록 스토리지 볼륨 제공
주요 컴포넌트:
cinder-api:
- REST API 제공
- 요청 검증 및 라우팅
cinder-scheduler:
- 스토리지 백엔드 선택
- 용량 및 성능 기반 선택
cinder-volume:
- 볼륨 관리
- 백엔드 스토리지와 통신
cinder-backup:
- 볼륨 백업 관리
스토리지 아키텍처:
VM → Nova → Cinder API → Cinder Volume → Storage Backend
스토리지 백엔드 드라이버:
- LVM: 로컬 Logical Volume Manager
- Ceph/RBD: 분산 스토리지
- NFS: 네트워크 파일 시스템
- iSCSI: IP 기반 SAN
- Fibre Channel: FC SAN
- GlusterFS: 분산 파일 시스템
- NetApp, EMC: 상용 스토리지
볼륨 타입 (Volume Types):
- 성능 특성별 분류
- QoS 설정
- 백엔드 매핑
5. Glance (Image Service)
역할: 가상 머신 이미지 저장 및 관리
주요 컴포넌트:
glance-api:
- REST API 제공
- 이미지 메타데이터 관리
glance-registry:
- 이미지 메타데이터 데이터베이스 관리 (deprecated)
- v2 API에서는 glance-api가 직접 처리
Image Store:
- File: 로컬 파일 시스템
- Swift: Object Storage
- Ceph/RBD: Ceph 스토리지
- S3: AWS S3 호환
- HTTP: 외부 HTTP 서버
이미지 아키텍처:
Nova → Glance API → Image Store (Swift/File/Ceph)
이미지 형식:
- RAW: 원시 디스크 이미지
- QCOW2: QEMU Copy-On-Write (권장)
- VMDK: VMware
- VHD: Hyper-V
- ISO: CD/DVD 이미지
이미지 서비스:
- 이미지 업로드/다운로드
- 이미지 스냅샷
- 이미지 공유 (멀티 테넌트)
6. Swift (Object Storage Service)
역할: 대용량 오브젝트 스토리지 제공
주요 컴포넌트:
Proxy Server (swift-proxy-server):
- API 요청 처리
- 요청 라우팅
- 인증 처리
Object Server (swift-object-server):
- 실제 데이터 저장
- 오브젝트 읽기/쓰기
Container Server (swift-container-server):
- 컨테이너 메타데이터 관리
- 오브젝트 목록 관리
Account Server (swift-account-server):
- 계정 메타데이터 관리
- 컨테이너 목록 관리
Swift 아키텍처:
Ring (분산 해시 테이블):
- 오브젝트 위치 결정
- 복제본 배치
- 파티션 관리
Replication:
- 자동 복제 (기본 3복제본)
- 데이터 내구성 보장
Consistency:
- 최종 일관성 (Eventually Consistent)
- 자동 복구
스토리지 구조:
Account → Container → Object
주요 특징:
- RESTful API: HTTP/HTTPS
- 무제한 확장: 수평 확장
- 자동 복제: 장애 복구
- 비용 효율적: 범용 하드웨어
서비스 간 상호작용
VM 생성 흐름 (종합)
1. 사용자 → Horizon/nova CLI
↓
2. nova-api → Keystone (인증 토큰 검증)
↓
3. nova-api → Glance (이미지 정보 조회)
↓
4. nova-api → Neutron (네트워크 정보 조회)
↓
5. nova-api → Cinder (스토리지 정보 조회, 볼륨 생성)
↓
6. nova-api → nova-conductor (스케줄링 요청)
↓
7. nova-conductor → nova-scheduler (노드 선택)
↓
8. nova-scheduler → nova-conductor (선택된 노드)
↓
9. nova-conductor → nova-compute (VM 생성 명령)
↓
10. nova-compute → Hypervisor (VM 생성)
↓
11. nova-compute → Neutron (포트 생성)
↓
12. Neutron → DHCP Agent (IP 할당)
↓
13. VM 부팅 완료
인증 흐름
1. Client → Keystone (/v3/auth/tokens)
↓
2. Keystone → Identity Backend (사용자 인증)
↓
3. Keystone → Token 발급
↓
4. Client → 서비스 API (X-Auth-Token 헤더)
↓
5. 서비스 → Keystone (토큰 검증)
↓
6. Keystone → 서비스 (사용자 정보 반환)
↓
7. 서비스 → Policy Engine (권한 확인)
↓
8. 서비스 → 작업 수행
메시지 큐 아키텍처
RabbitMQ 구조
Exchange:
- 메시지 라우팅
- Topic Exchange: 패턴 기반 라우팅 (기본)
Queue:
- 작업 큐
- 각 서비스별 큐
RPC (Remote Procedure Call):
- Call: 요청
- Cast: 비동기 요청
- Fanout: 브로드캐스트
예시 (Nova):
nova-api → RPC Call → nova-scheduler (스케줄링 요청)
nova-scheduler → RPC Cast → nova-compute (비동기 명령)
nova-compute → RPC Cast → nova-conductor (상태 업데이트)
데이터베이스 아키텍처
서비스별 데이터베이스
각 서비스는 독립적인 데이터베이스를 사용:
- keystone: 인증 정보
- nova: VM 메타데이터
- neutron: 네트워크 구성
- cinder: 볼륨 메타데이터
- glance: 이미지 메타데이터
- swift: 메타데이터 (별도)
데이터베이스 고가용성
Active-Passive (Master-Slave):
- Galera Cluster (MySQL)
- PostgreSQL Streaming Replication
Connection Pooling:
- SQLAlchemy 사용
- 연결 풀 관리
고가용성 (HA) 아키텍처
Active-Active 구성
로드 밸런서:
- HAProxy 또는 Keepalived
- VIP (Virtual IP) 제공
서비스 인스턴스:
- 여러 API 서버 실행
- 로드 밸런서로 분산
데이터베이스:
- Galera Cluster (Multi-Master)
- 또는 Master-Slave
메시지 큐:
- RabbitMQ Cluster
- Mirrored Queues
예시 구성
Internet
↓
Load Balancer (HAProxy)
↓
┌──────────┬──────────┬──────────┐
│ nova-api │ nova-api │ nova-api │
│ (Node 1) │ (Node 2) │ (Node 3) │
└──────────┴──────────┴──────────┘
↓ ↓ ↓
└──────────┬───┴──────────────┘
↓
Message Queue (RabbitMQ Cluster)
↓
Database (Galera Cluster)
서비스 배포 모델
1. 모든 서비스 통합 노드 (All-in-One)
구성:
- 모든 서비스를 하나의 노드에 설치
- 개발/테스트용
장점:
- 빠른 설정
- 최소 리소스
단점:
- 프로덕션 부적합
- 성능 제한
2. 3-Node 구성 (최소 프로덕션)
구성:
- 1개 Controller Node
- 2개 Compute Nodes
용도:
- 소규모 프로덕션
- 개념 증명
3. 분리된 서비스 노드
구성:
- 3개 Controller Nodes (HA)
- 여러 Compute Nodes
- Storage Nodes (Cinder/Glance)
- Network Nodes (Neutron)
용도:
- 중대규모 프로덕션
- 엔터프라이즈 환경
보안 아키텍처
인증 및 권한
Multi-Factor Authentication (MFA):
- Keystone에서 지원
- TOTP, SMS 등
Role-Based Access Control (RBAC):
- Policy.json 파일로 정책 정의
- 서비스별 권한 관리
Service-to-Service 인증:
- Service Token 사용
- 서비스 간 신뢰
네트워크 보안
Security Groups:
- VM 레벨 방화벽
- iptables 기반
Network Isolation:
- VXLAN/GRE 터널링
- VLAN 분리
SSL/TLS:
- API 엔드포인트 암호화
- 인증서 관리
모니터링 아키텍처
Telemetry 서비스 (Ceilometer/Gnocchi)
Ceilometer:
- 메트릭 수집
- 이벤트 수집
Gnocchi:
- 시계열 데이터 저장
- 메트릭 집계
Aodh:
- 알람 서비스
- 임계값 기반 알림
데이터 흐름:
서비스 → Notification → Ceilometer → Gnocchi → Aodh
학습 체크리스트
초급
- 각 코어 서비스의 역할 이해
- 서비스 간 기본 상호작용 이해
- VM 생성 흐름 이해
- 기본 아키텍처 구성 요소 파악
중급
- 각 서비스의 상세 컴포넌트 이해
- 메시지 큐 아키텍처 이해
- 데이터베이스 구조 이해
- 네트워크 아키텍처 이해 (Neutron)
- 스토리지 아키텍처 이해 (Cinder, Swift)
고급
- 고가용성 아키텍처 설계
- 성능 최적화
- 커스텀 드라이버 개발
- 서비스 확장 및 배포
- 트러블슈팅 및 디버깅
참고
- OpenStack 아키텍처 가이드: https://docs.openstack.org/arch-design/
- 각 서비스별 상세 아키텍처 문서 참조
- 실제 배포 시 요구사항에 맞게 아키텍처 조정 필요
- 성능과 가용성을 고려한 설계 중요