[OpenStack] Horizon

KH55S·2025년 11월 20일

OpenStack

목록 보기
9/9

Horizon은 OpenStack의 대시보드 서비스로, 사용자가 Horizon에서 버튼을 클릭했을 때 백엔드에서 일어나는 실제 동작 과정은 사용자를 대신하여 REST API를 호출하는 과정이다. OpenStack CLI가 하는 일과 정확히 동일한 일은 웹 인터페이스를 통해 수행한다.

Horizon을 통한 인스턴스 생성 과정

  1. 로그인 및 인증 (Keystone)
    • Horizon이 API를 호출하려면 Token과 Service Catalog가 필요하다.
    • 로그인 요청 : 사용자가 ID/PW를 입력하고 로그인을 시도한다.
    • 토큰 발급 : Horizon은 입력받은 정보를 이용해 Keystone API(POST /v3/auth/tokens)를 호출한다.
    • 세션 저장 : Keystone이 유효한 Token과 Service Catalog를 반환하면, Horizon은 이 정보를 사용자의 웹 세션에 저장한다.
      • 이후의 모든 요청(클릭)은 이 세션에 저장된 토큰을 꺼내서 사용한다.
  2. 정보 조회 (GET 요청 - 폼 채우기)
    • 사용자가 인스턴스 시작 버튼을 눌러 팝업 창을 띄울 때, Horizon은 빈 폼을 보여주는 것이 아니라 선택 가능한 목록을 보여줘야 한다.
    • 페이지 로드
    • 다중 API 호출 : Horizon 서버는 세션에서 Token과 Service Catalog를 꺼낸 뒤, 여러 서비스에 동시다발적으로 GET 요청을 보낸다.
      • To Glance : GET /v2/images (이미지 목록)
      • To Nova : GET /servers/detail (플레이버 복록, 가용성 구역)
      • To Neutron : GET /v2.0/networks (네트워크 목록)
    • 렌더링 : 각 서비스가 JSON 형태로 응답하면, Horizon은 이를 취합하여 HTML로 변환해 사용자 브라우저에 보여준다.**
  3. 액션 수행 (POST 요청 - VM 생성)
    • 사용자가 폼 입력을 마치고 Launch Instance 버튼을 클릭하면
    • 데이터 수집 : 사용자가 입력한 데이터를 수집하여 하나의 JSON 페이로드를 만든다.
    • API 호출 : Horizon 백엔드는 이 JSON과 사용자의 Token을 헤더에 담아 Nova API Endpoint로 POST 요청을 보낸다.
    • 역할 종료 : Nova API가 요청을 받고, 유효성을 검증한 뒤 202 Accepted 응답을 Horizon에게 보낸다.
      • Horizon은 응답을 받자마자 인스턴스 목록 페이지로 리다이렉트한다.
      • Horizon의 역할은 여기서 끝나고, 실제 VM 생성 여부, 에러 여부 등은 Nova가 비동기적으로 처리할 문제이다.
  4. 상태 폴링
    • 인스턴스 목록 페이지를 보고 있을 때, 상태가 Build에서 Active로 바뀌는 것을 볼 수 있다. 이는 Horizon이 실시간으로 아는 것이 아니다.
      • 주기적 조회 : Horizon은 주기적으로 Nova API를 호출하여 VM의 상태를 물어본다.
      • 화면 갱신 : Nova가 DB를 조회하여 현재상태를 응답하면, Horizon은 화면을 업데이트한다.

요약

  • Horizon이 하는 일은 사용자의 클릭을 OpenStack 서비스가 이해할 수 있는 HTTP API 요청으로 번역하는 것.
  • 저장소 없음 : 자체적인 DB를 거의 사용하지 않는다. 모든 데이터는 Nova, Neutron, Glance 등의 DB에 있는 것을 API로 가져와서 보여준다.
  • Stateless : Horizon 서버를 껐다 켜도 OpenStack 인프라에는 영향이 없다.
  • 동일한 권한 : Horizon을 통한 요청, CLI로 요청 모두 백엔드 입장에서는 Token을 들고 온 똑같은 HTTP 요청으로 처리된다.
  • Horizon은 RabbitMQ를 사용하지 않는다 -> 오직 HTTP API를 사용해서 요청을 보내고 값을 받아오기만 한다.

0개의 댓글