오픈 스택

최근혁(GeunH)·2024년 3월 12일
post-thumbnail

서론

백엔드 개발자라면, WAS나 DB서버, 미들웨어 등 여러 서버 인스턴스를 운영하고 이러한 과정에서 VPC를 만들어 관리하기 위해서 클라우드 컴퓨팅 서비스를 운영한다.

이러한 클라우드 서비스를 제공하는 입장에서 클라우드 구축을 위해서 사용하는 프레임워크인 "오픈 스택" 에 대해서 정리해보았다.


오픈 스택 ( Open Stack )이란?

참고 : https://www.redhat.com/ko/topics/openstack

오픈스택이란 풀링된 가상 리소스 ( 가상화 리소스를 리소스 풀로 관리하는 것 )를 이용해 Private OR Public 클라우드를 구축하고 관리하는 오픈소스 플랫폼이다.

오픈 스택을 이용해 서버, 네트워킹, 스토리지 등 핵심 클라우드 컴퓨팅 서비스를 처리할 수 있다.

흔히 우리가 사용하는 AWS나 NCloud등의 클라우드 서비스는 이러한 오픈 스택을 통해 구현할 수 있다고 이해하면 된다.

이러한 오픈 스택은 SI (System Integration ) 기업에서 클라우드 제공자의 입장에서 클라우드 서비스를 구축하고 운영할 때 빈번하게 이용된다.

퍼블릭 클라우드 서비스를 이용하는 것과 다르게 직접 클라우드 서비스를 구축하고 운영하므로 클라이언트의 특정 요구 사항을 충족시키는 맞춤형 클라우드 환경을 구축하는 데 큰 장점이 있다.


오픈 스택의 구조

오픈 스택의 구조는 여러 핵심 컴포넌트들로 이루어져 있다.

각 컴포넌트는 클라우드의 특정 기능을 담당하며 이를 통해 사용자는 리소스를 관리할 수 있다.

컴포넌트는 크게 Nova, Swift, Cinder, Neutron, Keystone, Glance, Horizon, Heat, Ceilometer, Trove 등이 있다.

각각의 컴포넌트가 무엇이고 어떤 역할을 하는지 정리해보았다.

참고 : https://www.openstack.org/software/project-navigator/openstack-components/#openstack-services

1. Nova ( Computing Service )

Nova는 OpenStack에서 가상화된 서버 또는 실제 물리 서버(베어메탈)와 같은 컴퓨팅 인스턴스를 생성하고 관리할 수 있는 기능을 제공하는 프로젝트이다. Nova를 통해 사용자는 CPU 코어 수, 메모리 크기, 디스크 용량 등의 가상 서버의 세부 설정을 쉽게 조절할 수 있다.

설명에서 확인할 수 있듯이, "Nova runs as a set of daemons on top of existing Linux servers to provide that service."는 Nova가 Linux 환경에서 백그라운드 프로세스로 실행되며, 서버 인스턴스의 관리 및 설정 기능을 제공한다는 것을 의미한다.

이러한 작업은 GUI나 CLI를 통해 수행할 수 있으며, GUI의 경우는 OpenStack의 공식 웹 UI인 Horizon을 통해, CLI의 경우는 OpenStack Client를 통해 작업할 수 있다.


2. Keystone ( Identity Service )

Keystone은 OpenStack의 중요한 구성 요소로, 사용자의 인증 및 권한 부여를 관리한다. 사용자가 시스템에 접근할 때 필요한 인증 정보를 제공하고, 이를 통해 사용자가 시스템 내에서 어떤 서비스에 접근할 수 있는지 결정한다.

인증 과정에서는 보안을 중요시하는 토큰 기반 시스템을 사용한다. 이 토큰은 사용자의 세션 정보를 암호화하여 시스템 내에서 사용자를 식별하는 역할을 한다. 토큰 인증 방식은 웹 서비스에서 널리 사용되는 JWT(JSON Web Tokens)와 유사한 방식으로, 안전하고 효율적인 사용자 인증을 가능하게 한다.

Keystone의 서비스 제공을 위해 WSGI(Web Server Gateway Interface) 미들웨어가 사용된다. WSGI는 파이썬 웹 애플리케이션과 웹 서버 간의 표준 인터페이스로, Keystone과 같은 웹 애플리케이션을 웹 서버에 쉽게 연결할 수 있게 해주는 중요한 역할을 한다. 이를 통해 Keystone은 다양한 웹 서버 환경에서 유연하게 작동할 수 있다.

시스템 내에서 'Users', 'Groups', 'Roles'와 같은 개념을 통해 접근 권한을 세밀하게 관리한다. 'Users'는 시스템을 사용하는 개인을 의미하고, 'Groups'는 여러 사용자를 묶어 관리할 수 있는 집합이다. 'Roles'는 사용자나 그룹에 부여되는 권한을 정의하며, 이를 통해 사용자가 시스템 내에서 수행할 수 있는 작업의 범위를 결정한다.

특히, 'Role', 'Resource', 'Identity'는 Keystone의 권한 관리 체계의 핵심을 이룬다. 'Resource'는 시스템 내의 자원을 의미하며, 'Identity'는 사용자의 신원 정보를 나타낸다. 이 세 가지 요소의 조합을 통해, Keystone은 사용자가 시스템 내에서 어떤 자원에 접근할 수 있는지, 그리고 어떤 작업을 수행할 수 있는지를 정밀하게 제어할 수 있다.

이러한 방식으로 Keystone은 OpenStack 클라우드 환경에서 보안과 접근 제어를 위한 중요한 기능을 수행하며, 사용자가 필요로 하는 자원과 서비스에 안전하고 효율적으로 접근할 수 있도록 지원한다.


3. Neutron ( Networking )

뉴트론은 provide "network connectivity as a service" 라고 설명이 되어 있다.

이러한 네트워크 연결이 이루어지는 대상은 OpenStack의 다른 서비스들 ( Nova, KeyStone 등! )이 되겠다!

Nova와의 관계를 예로 들면, Neutron은 Nova의 VM 네트워크 인터페이스를 생성, 구성 및 관리한다. VM에 대한 사설 또는 공용 IP주소를 할당하고, 네트워크 트래픽을 제어할 수 있는 보안 그룹을 설정할 수 있다.

Public Cloud Service의 vpc, subnet, acl을 생각하면 되겠다.

Keystone의 관계에서는 네트워크 리소스에 대한 액세스를 제어하면서 그룹 또는 프로젝트를 기반으로 네트워크 리소스를 격리할 수 있다.

이처럼 정리하면 Neutron은 오픈스택 클라우드를 통해 제공되는 서비스와 애플리케이션에 확장이 가능하고 유연한 네트워크 인프라를 제공한다. Neutron API를 통해 이러한 기능등에 접근하여 관리할 수 있다.

로드 밸런싱, 방화벽, 동적 IP or 정적 Ip 할당 및 관리도 이 Neutron을 통해 가능한 것이다.

4. Swift ( Object Storage )

Swift는 "offers cloud storage software so that you can store and retrieve lots of data with a simple API" 로 설명되어 있다.

Object Storage의 특성에 맞게 가용성, 지속성, 동시성 문제에서 최적화와 확장에 굉장이 용이하다.

Swift에서는 Restful API를 제공해 실제 스토리지 서비스에서 분산 저장소의 구조를 가지는 스토리지 간 요청 데이터 ( 객체 ) 를 저장하고 검색하는 것을 사용자는 간단하게 작업할 수 있다.

데이터의 고가용성을 보장하기 위해서 데이터를 백업 서버와 같이 여러 위치에 복제해두고, 만약 원 서버에 문제가 생길 경우 바로 복제 서버를 이용하는 "페일 오버"를 사용한다.

5. Cinder ( Block Storage )

Cinder는 "Cinder is the OpenStack Block Storage service for providing volumes to Nova virtual machines, Ironic bare metal hosts, containers and more." 로 설명되어 있다.

정해진 볼륨 크기의 저장소를 일정한 크기의 블록으로 나누어 사용하는 이 블록 스토리지는 특성에 맞게 VM의 서버 인스턴스, 실제 물리 서버, 컨테이너 등의 저장 공간으로 사용된다.

즉, 서버의 디스크라고 할 수 있는 것이 Cinder라고 할 수있다.

Cinder의 작업은 Horizon이라는 OpenStack의 official web UI나 Client를 통해 진행할 수 있다.

블록 스토리지의 특성에 맞게 논리적 주소를 물리적 주소로 변환하는 볼륨 매니저를 가진다는 것, 이러한 과정에서 ArrayList와 같은 배열구조를 통해 Random Access가 굉장히 빠른 구조를 가진다.

Cinder도 Swift와 같이 데이터의 보호와 복원을 위해서 데이터 백업을 사용하는데 이때 볼륨의 스냅샷을 생성하고 이를 이용해 볼륨을 복제한다.

스냅샷은 특성 시점에서 볼륨의 상태를 똑같이 복제한 "사본"이라 할 수 있다. 스냅샷 이후 발생하는 데이터 변경사항만을 기록하여 데이터를 효과적으로 추적하고 복구하는 것이다.

Git의 커밋과 트리 객체를 생각하면 이해가 쉬울 수 있다.
git reset명령어를 이용해 이전 커밋으로 되돌아 갈 때 기존에 추적해놓은 상태 변화 데이터를 이용해 현재 데이터를 특정 시점으로 되돌리는 것과 비슷하다고 볼 수 있다.

profile
목표 : 스스로 성장하는 개발자

0개의 댓글