클라우드에서 서버 리소스를 제어하는 방법

서버 리소스

서버 리소스는 타입과 이미지로 구성된다.
타입은 리소스의 크기나 속성을 유형화한 개념이다.
이미지는 서버의 기동 이미지로 AWS의 AMI가 이에 해당한다.

서버 리소스 제어 API 흐름

인증

서버 리소스를 제어하기 위해서 가장 먼저 인증을 해야 한다.
인증 요청은 POST로 회원이름과 암호를 보내고 토큰과 엔드포인트를 받는다.

이후 요청에서 헤더에 토큰을 포함해서 인증할 수 있다.

템플릿 이미지 유효성 검증

서버 리소스에 사용할 템플릿 이미지가 존재하는지, 접근 권한이 있는지 확인하고 템플릿 이미지를 반환하는 API를 거친다.
템플릿 이미지 유효성 검증은 굳이 하지 않아도 서버 리소스 제어에 큰 문제가 생기지 않는다. 다만 이 과정을 거치지 않으면 서버 기동 중에 문제가 발생해서 여러 문제점이 함께 발생하는 기동 중에 문제 파악이 오래걸릴 수 있다.

가상 서버 생성

생성할 가상 서버의 조건을 요청 바디에 담아서 가상 서버를 생성할 수 있다.
가상 서버 조건 정보는 가상 서버 이름, 플레이버(인스턴스 유형), 템플릿 이미지, 접속할 가상 네트워크, 시큐리티 그룹 등 다양하다.
생성에 성공하면 서버의 UUID를 응답한다.

서버 생성 요청에 성공했다고 바로 서버가 생성된 건 아니다. 단지 클라우드 제공자가 서버 생성 요청을 확인한 것이다.
실제로 AWS에서 가상 서버를 만들어도 약간의 시간 뒤에 생성된다. 이는 API로 생성 요청을 접수하는 처리와 실제 가상 서버를 만드는 처리가 비동기적으로 분리되어 실행되기 때문이다.

생성된 가상 서버 상태 확인

가상 서버 생성 요청의 응답으로 받은 UUID로 가상 서버의 상태를 확인할 수 있다.
이때 가상 서버를 만드는 중에도 가상 서버의 상태를 보여줄 수 있다.

가상 서버의 수명 주기

AWS의 경우 여러 단계로 서버 리소스의 상태를 알려준다.
pending : running할 준비하는 중
running : 인스턴스 실행 중
stopping : 인스턴스 중지 혹은 절전 모드로 전환 준비
stopped : 인스턴스 종료됨. 하지만 다시 시작 가능
shutting-down : 인스턴스가 종료할 준비
terminated : 인스턴스가 영구적으로 삭제

메타 데이터와 사용자 데이터

메타 데이터와 사용자 데이터는 가상 서버의 환경 설정에 활용되는 데이터이다.
메타 데이터는 서버별로 따로 만들어지고 여러 개의 서버가 같은 메타 데이터를 공유하지 못한다.

사용자 데이터는 가상 서버에 액션을 실행해야 할 때 사용한다. 대표적으로 쉘 스크립트 같은 데이터가 있다. 만약 실행되야 할 사용자 데이터가 무수히 많으면 Cloud-init 이란 툴을 사용한다.

이미지 생성과 공유

이미지는 가상 머신 템플릿 이미지를 의미한다. 이미지 정보에는 디스크 포맷이나 디바이스 매핑과 같은 구성 정보들이 포함되어 있다. 특이한 점은 정보 여부를 결정할 수 있어서 다른 테넨트의 사용자에게 공개 여부를 정할 수 있다.

AWS CreateImage API로 인스턴스 ID를 통해 서버의 이미지를 만들 수 있다.
AWS DescribeImages API로 이미지 정보를 가져올 수 있다.

VM 이미지 가져오기

이미지를 임포트하는 API를 지원한다. AWS에서는 ImportImage, ImportInstance,ImportVolume API로 가상 머신 템플릿을 AMI로 등록할 수 있다.
ImportImage는 가상 머신 템플릿을 AMI로 임포트한다.
ImportInstance는 AMI를 등록하고 서버 기동까지 한번에 한다.
ImportVolume는 볼륨이 분할되어 있는 경우 볼륨 단위로 임포트할 때 사용한다.

서버 리소스의 내부 구성

가상 서버의 생성 요청을 접수하고 오픈스택 내부에서 벌어지는 처리 내용을 정리해보자.

가상 서버 생성 요청을 메시지 큐에 넣기

가상 서버 생성 API가 실행되면 메시지 큐에 메시지를 넣고 비동기로 처리한다.
그리고 가상 서버 생성 요청이 큐에 들어가는 시점에 가상 서버의 구성 정보와 상태정보가 구성 관리 데이터베이스에 저장한다.

스케줄러에 요청 전달

스케줄러(컨덕터)라고 부르는 프로세스가 큐에 있는 메시지를 꺼내서 처리한다.
스케줄러 프로세스를 다중화하면 가용성이 높아진다. 스케줄러는 하나의 요청을 처리한다. 많은 요청이 오는 경우 여러 스케줄러에 분산되어 처리된다.

가상 서버를 기동할 호스트 결정

오픈 스택은 상태 관리 데이터베이스에 각 호스트들의 리소스 사용 상태를 기록하고 갱신한다.
스케줄러는 메시지를 꺼낸 후 가상 서버에 필요한 리소스를 가진 호스트를 상태 관리 데이터베이스를 기반으로 찾는다.

호스트에 가상 서버 기동 지시

스케줄러가 호스트를 결정했으면 그 호스트에 가상 서버를 기동하라는 요청을 메시지 큐에 넣는다.

메시지 수신과 가상 서버 생성

메시지 큐에서 메시지를 받은 호스트는 가상 서버를 구축한다.
템플릿 이미지 가져오기, IP 주소 할당, 네트워크 접속 준비 등을 진행한다.

가상 서버 상태 갱신

기동에 성공하면 구성 관리 데이터베이스의 상태를 ACTIVE로 갱신한다.

Share