---
title: " OpenStack 전용 최신 대시보드 Afterglow: AI/ML 워크로드와 k3s 프로비저닝을 위한 혁신적인 UI와 레이어 공유 솔루션"
description: "Afterglow는 OpenStack 전용 최신 대시보드로, SvelteKit과 FastAPI 기반의 현대적 UI와 실시간 자동 새로고침을 제공하며, Nova·Glance·Cinder·Neutron·Manila·Octavia·Keystone 등 전체 서비스를 단일 화면에서 관리한다. k3s 클러스터를 VM 위에 원클릭으로 프로비저닝하고 OpenStack 클라우드 플러그인을 완전 지원하며, OverlayFS와 CephFS를 이용한 레이어 기반 패키지 공유 시스템으로 AI/ML 패키지 설치와 스토리지를 효율화한다. 또한 Redis 캐시·MariaDB 메타데이터·Prometheus·Grafana·DCGM Exporter 등 관측성을 강화하고, Manila RBAC에 맞춘 서비스 프로젝트 격리와 3‑lock seal을 통한 레이어 불변성을 보장한다."
date: "2026-04-29"
last_modified: "2026-08-06T00:35:00.000Z"
type: "Post"
tags:
  - "openstack"
  - "kubernetes"
  - "ceph"
  - "python"
categories:
  - "📗 Docs"
series:
  - "오픈스택 운영"
canonical_url: "https://blog.pieroot.xyz/afterglow-dashboard"
markdown_url: "https://blog.pieroot.xyz/afterglow-dashboard.md"
---

#  OpenStack 전용 최신 대시보드 Afterglow: AI/ML 워크로드와 k3s 프로비저닝을 위한 혁신적인 UI와 레이어 공유 솔루션

Afterglow는 OpenStack 전용 최신 대시보드로, SvelteKit과 FastAPI 기반의 현대적 UI와 실시간 자동 새로고침을 제공하며, Nova·Glance·Cinder·Neutron·Manila·Octavia·Keystone 등 전체 서비스를 단일 화면에서 관리한다. k3s 클러스터를 VM 위에 원클릭으로 프로비저닝하고 OpenStack 클라우드 플러그인을 완전 지원하며, OverlayFS와 CephFS를 이용한 레이어 기반 패키지 공유 시스템으로 AI/ML 패키지 설치와 스토리지를 효율화한다. 또한 Redis 캐시·MariaDB 메타데이터·Prometheus·Grafana·DCGM Exporter 등 관측성을 강화하고, Manila RBAC에 맞춘 서비스 프로젝트 격리와 3‑lock seal을 통한 레이어 불변성을 보장한다.

> **이 글은 OpenStack 환경을 위해 직접 제작한 웹 대시보드 Afterglow의 개발 배경, 구현 내용, 그리고 주요 패치 노트를 기록한 개발 회고입니다.**

### 만들게 된 계기

OpenStack 클러스터를 직접 운영하면서 기존 대시보드들의 한계를 매일 체감했습니다.

특히 AI/ML 워크로드를 OpenStack VM 위에서 운영하다 보니 두 가지 니즈가 명확해졌습니다.

- **Kubernetes 프로비저닝**: Magnum 없이 VM 위에서 k3s를 바로 띄우고 싶었습니다. Magnum은 설치·운영 비용이 크고, 소규모 클러스터를 빠르게 스핀업하는 데 과분합니다.

- **공유 라이브러리 환경**: PyTorch, vLLM 같은 수십 GB짜리 패키지를 VM마다 따로 설치하는 건 시간·스토리지 낭비입니다. Docker 이미지처럼 레이어를 공유하되 VM 위에서 동작하는 방식이 필요했습니다.

이 두 가지를 직접 구현하면서, 어차피 새로운 대시보드가 필요하다는 결론에 이르렀고 **Afterglow** 프로젝트를 시작했습니다.

---

### 핵심 가치 제안

- 🎨 **현대적 UX** — SvelteKit + Tailwind CSS v4 기반, 실시간 자동 새로고침, 깜빡임 없는 업데이트

- 🔌 **전체 서비스 커버리지** — Nova / Glance / Cinder / Neutron / Manila / Octavia / Keystone 전 영역 지원

- 🤖 **AI/ML 특화** — Union Mount 레이어 시스템(OverlayFS + CephFS)으로 패키지 환경을 VM 간 공유, GPU 관측성(DCGM Exporter) 통합

---

### 아키텍처 한눈에 보기

```javascript
브라우저
  └── SvelteKit :3000
        └── FastAPI :8000
              ├── Redis (캐시/세션)
              ├── Keystone / Nova / Glance / Cinder
              ├── Neutron / Manila / Octavia
              └── MariaDB (레이어 메타데이터, 빌드 이력)
```

---

### 구현한 주요 기능

#### OpenStack 리소스 관리

VM 생성·시작·정지·삭제·콘솔 접속부터 이미지(Glance), 플레이버, 네트워크, Floating IP, 블록 스토리지(Cinder), 공유 파일시스템(Manila), 로드밸런서(Octavia), 보안 그룹, 키페어까지 OpenStack 핵심 서비스를 단일 대시보드에서 관리합니다.

관리자 전용 기능으로는 프로젝트별 쿼터 관리, 전체 이미지 substring 검색, 인스턴스 resize/revert, QGA 기반 비밀번호 재설정, 볼륨 백업 복구 → upper 볼륨 재사용 흐름도 자동화되어 있습니다.

#### k3s 프로비저닝 (Magnum 대체)

OpenStack VM 위에 k3s를 직접 배포하는 원클릭 프로비저닝입니다. cloud-init + Jinja2 템플릿으로 마스터/워커 노드를 자동 설정하며, kubeconfig는 AES-256-GCM으로 암호화해 DB에 저장합니다.

**Cloud Provider OpenStack 플러그인 전체 지원**:

- OCCM (OpenStack Cloud Controller Manager) — 로드밸런서 자동 프로비저닝

- Cinder CSI — 블록 스토리지 동적 프로비저닝

- Manila CSI — 공유 파일시스템 마운트

- Keystone Auth — Kubernetes RBAC과 OpenStack 계정 연동

- Octavia Ingress — Ingress → Octavia LB 자동 연결

- Barbican KMS — etcd 암호화 키 관리

```bash
# 클러스터 생성 흐름
대시보드 → 컨테이너 → k3s 클러스터 생성
  ├── 마스터 노드 VM 생성 (Nova)
  ├── cloud-init으로 k3s 서버 설치
  ├── callback.sh로 진행 상태 실시간 보고
  ├── 워커 노드 VM 생성 및 조인
  └── kubeconfig 암호화 저장 → 다운로드 제공
```

#### Union Mount 레이어 시스템

Docker 이미지와 유사한 **레이어 기반 패키지 환경**을 VM 위에서 구현합니다. 컨테이너가 아닌 VM 내부에서 OverlayFS로 직접 마운트합니다.

> **핵심 아이디어**: Python 3.11 → PyTorch → vLLM 순으로 레이어를 쌓으면, 각 레이어는 상위 레이어의 diff만 저장합니다. 사용자 VM은 필요한 조상 체인을 `lowerdir=vllm:torch:python311` 형태로 조립해 마운트합니다. 수십 GB 패키지를 VM마다 설치할 필요 없이 CephFS에서 읽기 전용으로 공유합니다.

**설계 원칙 5가지**:

1. **Content-addressable & immutable** — 레이어는 `sha256(diff/)` 해시로 식별. 봉인 후 영구 불변

1. **Single-parent 상속** — 부모 없이 자식 없음. 상위 누락 시 하위 레이어 활성화 불가

1. **3-share 구조** — `layer-store-rw`(빌더 전용 RW) / `layer-store-ro`(사용자 RO) / `manifest-store`

1. **3-lock 불변성** — `chmod -R a-w` + `chattr +i` + DB `sealed=true`

1. **재빌드는 덮어쓰기 아닌 추가** — 이력이 영구 보존됨

**Service 프로젝트 격리**: 빌더 VM과 Manila share를 OpenStack service 프로젝트가 소유합니다. Manila RBAC 상 share owner 또는 admin만 access rule을 관리할 수 있기 때문에, 일반 사용자 conn으로는 prebuilt share에 접근 규칙을 추가할 수 없습니다. service 프로젝트 conn을 내부에서 생성해 모든 Manila 작업을 처리합니다.

#### 관측성 / 운영

- **Node Exporter** — 모든 인스턴스 부팅 시 cloud-init으로 자동 설치

- **DCGM Exporter** — GPU 인스턴스 전용, 사용률·메모리·온도·ECC 에러 메트릭

- **Prometheus** — 스크래핑 설정 자동 생성

- **Grafana** — 사전 구성된 대시보드

- **OpenSearch** — 로그 집계

---

### 만들면서 반영한 설계 결정

> **Service 프로젝트 격리** — Manila RBAC 모델에서 share 소유자만 access rule을 추가할 수 있습니다. 초기에 admin 프로젝트 conn을 그대로 사용했더니, detached asyncio task(`_monitor_build`)가 요청 핸들러 응답 후 `get_os_conn` finally 블록이 conn을 닫아버리는 버그가 있었습니다. service 프로젝트 전용 conn을 빌더 내부에서 생성하도록 변경하면서 이 버그도 함께 해결됐습니다.

> **uv 기반 Builder VM 전환** — 기존 pip + venv 빌더는 네트워크 지연으로 타임아웃이 잦았습니다. uv는 pip 대비 10~100배 빠른 패키지 설치 속도를 제공하며, lockfile 기반 재현성도 보장합니다. `uv pip install --system` 한 줄로 빌더 스크립트가 대폭 단순해졌습니다.

> **3-lock seal** — OverlayFS lowerdir에 쓰기 가능한 레이어가 끼어 있으면 모든 VM의 환경이 오염됩니다. `chmod -R a-w`(파일시스템), `chattr +i`(inode immutable), DB `sealed=true`(API 레벨) 세 겹으로 막아 seal 후 변경이 원천 불가합니다.

> **Keystone URL 자동 정규화** — 사용자마다 `http://keystone:5000/v3`, `http://keystone:5000/v3/`, `http://keystone:5000` 등 다양한 형태로 입력합니다. Pydantic validator로 파싱 시점에 정규화해 downstream에서 suffix 유무로 인한 버그를 원천 차단했습니다.

> **k3s 부팅 데드락** — Barbican KMS + Keystone Auth를 동시에 활성화하면 k3s 서버 부팅 시 데드락이 발생합니다. Keystone Auth는 k3s 서버가 완전히 기동된 뒤 webhook을 받을 준비가 돼야 하는데, KMS 키 요청이 먼저 들어오면 서로를 기다리는 순환 대기가 생깁니다. 두 플러그인의 활성화 순서와 초기화 타이밍을 조정해 해결했습니다.

---

### 패치 노트 하이라이트

#### 레이어 / 스토리지

- **`fccfb27`** feat: Union Mount 빌더/share를 service 프로젝트로 격리 — Manila RBAC 모델에 맞게 빌더 VM·prebuilt share 소유권을 service 프로젝트로 이전, `get_service_project_connection()` 헬퍼 추가

- **`2ec966f`** fix: prebuilt 라이브러리 마운트 실패 수정 + uv 빌더 전환 — P0~P4 마운트 버그 동시 수정, pip → uv 전환

- **`5811413`** feat: NFS 보안 강화, CephX 키 회전, 3-share wiring — 사용자 VM RO / 빌더 VM RW 분리, CephX 키 자동 회전

- **`318de4c`** feat: Union SG 자동 attach — Union Mount 사용 VM에 egress 보안 그룹 자동 부착

- **`ab94cbf`** feat: 프로젝트 격리 — dynamic share에 `union_project_id` 메타 + list/get 필터

#### k3s / 클러스터

- **`d0b44cd`** fix: k3s 서버 부팅 데드락 해소 — Barbican KMS / Keystone Auth 초기화 타이밍 조정 + [callback.sh](http://callback.sh/) 진단 개선

- **`93c5edb`** fix: k3s OCCM 매니페스트 적용 실패 가시성 보강 및 fail-fast 추가

- **`861bb66`** refactor: k3s 클러스터 생성에서 외부 LB 제거 및 provider 네트워크 선택 지원

- **`090b862`** feat: k3s 클러스터 생성 진행 모달 실시간 표시 개선

- **`267fe03`** feat: GPU 인스턴스 cloud-init에 DCGM Exporter 자동 설치 추가

- **`92ebb08`** feat: 인스턴스 관측성 개선을 위한 Node Exporter 및 Prometheus 통합

#### UX / 프론트엔드

- **`5b8c5ed`** feat: VM 생성 위저드 root disk 입력 및 인스턴스 페이지 인플레이스 오픈

- **`97265e2`** refactor: 목록 조회형 페이지 자동 새로고침 깜빡임 제거 (전체 적용)

- **`1fb9a4b`** fix: 라이브러리/템플릿 페이지 `$effect` 무한 루프로 인한 API 폭주 수정

- **`6338678`** feat: 토폴로지 SVG에 LB 노드 + 인스턴스 멤버 엣지 렌더링

- **`ead8c8a`** feat: 토폴로지에 LoadBalancer 수집 추가

#### 운영성 / 안정성

- **`239c369`** feat: 관리자 인스턴스 비밀번호 재설정 기능 추가 (QGA 기반)

- **`f1bca8c`** feat: Keystone URL 자동 정규화 (`normalize_keystone_url` + Pydantic validator)

- **`f88c501`** fix: Floating IP 할당 시 인스턴스 서브넷에 도달 가능한 외부 네트워크 자동 선택

- **`8b47cb7`** fix: SSH 공개키 코멘트 필드의 공백 허용

- **`05388e6`** feat: 인스턴스 resize / revert-resize 관리자 엔드포인트 + UI (Milestone 11.1)

---

### 로드맵

- [x] Manila NFS share 지원 + OverlayFS 통합 마운트

- [x] k3s 클러스터 프로비저닝 (soft-delete 이력 보존)

- [x] 관리자 쿼터 관리 / 이미지 substring 검색

- [x] GitHub Actions CI/CD (멀티 플랫폼 Docker 빌드)

- [x] Cloud Provider OpenStack 전체 플러그인 통합 (OCCM, Cinder CSI, Manila CSI, Keystone Auth, Octavia Ingress, Barbican KMS)

- [x] GPU 관측성 (DCGM Exporter + Node Exporter + Prometheus)

- [x] Union Mount service 프로젝트 격리 (Manila RBAC 모델 대응)

- [ ] Union Mount Phase 1 MVP: content-addressable 레이어 스토리지, `layerbuild` CLI, REST API

- [ ] Union Mount Phase 2: Frontend 레이어 카탈로그 UI, VM 생성 wizard 통합

- [ ] Union Mount Phase 3: Fork/Rebuild, OverlayFS 상태 모니터링 에이전트, Manila Share Snapshot

- [ ] Fedora CoreOS 기반 k3s 노드 전환 (불변 인프라)

---

### 핵심 정리

- ✅ Horizon의 기능 완성도 + Skyline의 현대적 UX를 FastAPI + SvelteKit으로 재구현

- ✅ Magnum 없이 VM 위 k3s 원클릭 배포, Cloud Provider OpenStack 6종 플러그인 통합

- ✅ Docker 이미지 방식의 OverlayFS 레이어 공유 — 수십 GB 패키지를 VM 간 CephFS로 공유

- ✅ Manila RBAC 모델에 맞춰 빌더/share를 service 프로젝트로 격리, detached task 안전화

- ✅ 3-lock seal로 레이어 불변성 보장 (chmod a-w + chattr +i + DB sealed)

- ✅ GPU 관측성 자동화 — DCGM Exporter를 cloud-init으로 GPU VM에 자동 배포

- ✅ 전체 엔드포인트에 pytest 단위 테스트, dev/main 브랜치 전략으로 품질 관리

> 저장소: [github.com/jung-geun/openstack-afterglow](http://github.com/jung-geun/openstack-afterglow)
