Skip to document
pieroot log
Markdown Preview

OpenStack 수동 설치 7 — Horizon 웹 대시보드 설치

Frontmatter

Horizon을 설치하고 local_settings.py, Apache 및 Memcached 설정을 구성한 후 브라우저에서 로그인하여 OpenStack 서비스 패널을 검증하는 단계별 가이드입니다.

OpenStack 수동 설치 7 — Horizon 웹 대시보드 설치
Keystone, Glance, Placement, Nova, Neutron, Cinder 설치가 끝났다면 운영·검증을 편하게 하기 위해 Horizon을 추가한다. Horizon은 별도 OpenStack API 서비스가 아니라 기존 서비스의 API를 호출하는 Django 기반 웹 대시보드다.
따라서 DB, 서비스 사용자, 엔드포인트를 새로 만들지 않고 패키지와 웹 설정만 구성하면 된다.

이 글에서 다루는 내용

  • Horizon과 기존 서비스의 연결 구조
  • openstack-dashboard 설치
  • local_settings.py 설정
  • Apache와 Memcached 연동
  • 브라우저 로그인과 서비스 패널 검증
🧪
전제 환경
  • OpenStack 2026.1 (Gazpacho)
  • Keystone, Glance, Placement, Nova, Neutron 설치 완료
  • controller 192.168.56.101
  • Keystone admin 계정과 ADMIN_PASS 준비

Horizon은 왜 DB와 엔드포인트가 없을까

Horizon은 API를 제공하는 서비스가 아니라 브라우저 요청을 OpenStack API로 변환하는 클라이언트다.
mermaid
flowchart LR
    B["브라우저"] --> H["Horizon<br>Apache mod_wsgi"]
    H --> K["Keystone :5000"]
    H --> S["Glance · Nova · Neutron"]
    H --> M["Memcached :11211"]
  • 인증은 Keystone에 위임한다.
  • 서비스 주소는 Keystone 카탈로그에서 읽는다.
  • 로그인 세션은 Memcached에 저장한다.
  • Horizon 자체 DB나 서비스 사용자는 만들지 않는다.

1. 패키지 설치

controller에서 실행한다.
bash
sudo apt install -y openstack-dashboard

2. local_settings.py 설정

/etc/openstack-dashboard/local_settings.py에서 아래 값을 찾거나 추가한다.
python
OPENSTACK_HOST = "controller"
ALLOWED_HOSTS = ['*']

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
        'LOCATION': 'controller:11211',
    }
}

OPENSTACK_KEYSTONE_URL = "http://%s:5000/v3" % OPENSTACK_HOST
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True

OPENSTACK_API_VERSIONS = {
    "identity": 3,
    "image": 2,
    "volume": 3,
}

OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = "Default"
TIME_ZONE = "Asia/Seoul"
⚠️
공식 문서의 /identity/v3 예시는 배포 방식에 따라 다르다. 현재 Keystone이 포트 5000의 /v3에서 동작한다면 http://%s:5000/v3를 사용한다.
ALLOWED_HOSTS = ['*']는 실습에 편리하지만 운영 환경에는 적합하지 않다. 운영에서는 실제 도메인과 IP만 허용한다.

3. Apache 설정 확인

/etc/apache2/conf-available/openstack-dashboard.conf에 아래 항목이 있는지 확인한다.
javascript
WSGIApplicationGroup %{GLOBAL}
설정 검사 후 Apache를 다시 불러온다.
bash
sudo apache2ctl configtest
sudo systemctl reload apache2

4. HTTP 응답 확인

bash
systemctl status apache2
systemctl status memcached
curl -sI http://controller/horizon | head
200 또는 로그인 페이지로 이동하는 302 응답이면 정상이다.

5. 브라우저 로그인

호스트 PC에서 다음 주소로 접속한다.
plain text
http://192.168.56.101/horizon
notion image
  • Domain: default
  • User: admin
  • Password: ADMIN_PASS
로그인 후 다음 항목을 확인한다.
화면
확인 내용
관리 → 시스템 정보
Compute 서비스와 Neutron Agent 상태
관리 → 이미지
Glance에 등록한 CirrOS 이미지
관리 → 하이퍼바이저
compute1의 vCPU, 메모리, 디스크
관리 → 네트워크
Neutron 네트워크와 라우터
아이덴티티
프로젝트, 사용자, 역할

오류 확인 순서

증상
먼저 확인할 항목
500 Internal Server Error
local_settings.py 파이썬 문법과 Apache error log
Unable to authenticate
OPENSTACK_KEYSTONE_URL과 admin 인증 정보
Bad Request 400
ALLOWED_HOSTS
특정 패널만 실패
해당 서비스 엔드포인트와 서비스 상태
세션이 자주 끊김
Memcached 주소와 서비스 상태
bash
sudo tail -100 /var/log/apache2/error.log
openstack catalog list

핵심 정리

  1. Horizon은 API 서비스가 아니라 Django 웹 클라이언트다.
  1. Keystone URL, Memcached, ALLOWED_HOSTS가 핵심 설정이다.
  1. 로그인 후 각 패널이 보이면 이전 단계의 서비스 연동까지 함께 검증할 수 있다.

재발 방지 체크리스트

openstack-dashboard가 설치됐다.
Keystone URL이 현재 배포 경로와 일치한다.
Memcached 세션 설정이 하나만 존재한다.
Apache 설정 검사를 통과했다.
호스트 PC에서 Horizon 로그인에 성공했다.
이미지, 하이퍼바이저, 네트워크 패널이 정상이다.

설치 시리즈 완료

이제 OpenStack 설치 시리즈에는 Keystone → Glance → Placement → Nova → Neutron → Cinder → Horizon의 수동 설치 과정이 갖춰졌다. Provider 네트워크에서 첫 인스턴스를 부팅하고, Cinder 볼륨을 attach한 뒤 Horizon의 이미지·하이퍼바이저·네트워크·볼륨 패널로 전체 상태를 함께 검증하면 된다.

참고 자료