Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

Rancher Compose

Docker Compose는 편리하긴 하지만 단일 호스트에서만 사용 할 수 있다. 실제 배포는 멀티호스트에서 이루어지기 때문에, 배포목적으로 사용하기는 애매모호하다. Rancher compose는 Docker compose의 멀티 호스트으로 분산된 노드에서의 컨테이너 실행을 관리한다. 따라서 개발과 테스트 뿐만 아니라, 실제 배포 목적으로 까지 사용 할 수 있다.

Rancer는 Manager & Agent 모델로 작동한다. Rancher Agent가 설치된 모든 호스트를 관리하며, 이들 호스트에 컨테이너를 배포 한다. 관리자는 컨테이너 배포를 위한 스케쥴을 만들 수 있다. 스케줄 룰이 없다면, 가장 적은 컨테이너가 있는 호스트에서 컨테이너를 실행한다.

Rancher는 Docker compose V1 버전의 docker-compose.yml 파일을 지원한다. Rancher는 rancher-compose.yml 파일과 docker-compose.yml 파일을 이용해서 컨테이너를 배포한다. rancher-compose.yml은 멀티 호스트에서의 컨테이너 관리를 위한 헬스체크, 스케일링 기능 들을 지원한다.

환경

테스트 환경을 구축하는 과정은 건너 뛴다. Rancher 서버 환경 구성은 rancher 소개 및 설치 문서를 참고하자. 나는 아래와 같이 테스트 환경을 만들었다.

 rancher compose 테스트 환경

버츄얼박스를 이용해서 3개의 우분투 서버 리눅스를 만들었다. 하나는 Rancher server, 나머지 두 대는 Rancher Agent가 설치된다. 워크스테이션(호스트 운영체제로 역시 우분투리눅스다)에는 docker-compose를 설치한다. 개발자(나)는 docker-compose를 이용해서 원격에 있는 Rancer Agent에 애플리케이션을 설치한다.

Rancher Compose 설치

rancher-compose release 페이지에서 실행파일을 다운로드 할 수 있다. 압축파일을 푼 다음에 /usr/bin등에 복사하자. Rancher Compose는 Rancher 인스턴스에 서비스를 실행한다. 이를 위해서는 몇가지 환경설정이 필요하다. 파일이름은 source.me 로 정했다.
# Rancer server URL 
$ export RANCHER_URL=http://server_ip:8080/
# 유저 API 키 
$ export RANCHER_ACCESS_KEY=<username_of_environment_api_key>
# API 호출을 위한 Secret 키 
$ export RANCHER_SECRET_KEY=<password_of_environment_api_key>
Rancher Access Key와 Secret Key는 rancher server에서 발급받을 수 있다.

API 메뉴를 보면 Environment API Keys 메뉴가 보일 것이다. Add Envirionment API Key를 클릭하면 API Key를 발급 받을 수 있다. 이 키를 위에 있는 환경 변수에 등록하고 export 한다.
$ source source.me

Rancher compose를 이용한 웹 애플리케이션 서비스 전개

Flask 웹 애플리케이션을 전개하기로 했다. 이 Flask 웹 애플리케이션은 Redis를 이용해서 카운트 정보를 공유한다. 가용성을 위해서 2대의 Flask 웹 애플리케이션 컨테이너와 1대의 Redis 컨테이너를 설치한다.

Flask 애플리케이션을 위한 Dockerfile은 아래와 같다.
FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
requirements.txt 파일의 내용은 아래와 같다.
$ cat requirements.txt
flask
redis
Dockerfile로 부터 도커 이미지를 만들어서 2대의 Rancher Agent 호스트에 설치하자. 프라이비 도커 레포지토리를 구성하면 되겠지만 귀찮아서 그냥 각 Agent 호스트에서 직접 빌드했다.
# docker build -t flask:lastest .
워크스테이션에서 compose 디렉토리를 만들었다.
$ mkdir compose
$ cd compose
docker-compose.yml 파일을 만든다.
version: '2'
services:
  web:
    image: "flask:last"
    ports:
     - "5000:5000"
    links:
    - redis
  redis:
    image: "redis:alpine"
rancher-compose.yml 파일을 만든다.
.catalog:
  name: "flask"
  version: "v0.1-educaas1"
  description: "Simple flask CMS"
  uuid: flask-0
  minimum_rancher_version: v0.51.0
  questions:
    - variable: public_port
      description: "public port to access the flask"
      label: "Public Port"
      required: true
      default: "8000"
      type: "int"

web:
 scale: 2
이제 rancher-compose를 실행하면 rancher-compose.yml을 읽고, docker-compose.yml 파일에 지시한대로 서비스를 올리게 된다. rancher-compose.yml을 보면 web서비스에 대해서 scale: 2를 설정했으므로 2개가 실행이 된다. up 명령을 이용해서 서비스를 올려보자.
$ rancher-compose up
WARN[0000] A newer version of rancher-compose is available: 0.12.5 
INFO[0000] Creating stack flask                         
INFO[0000] [0/2] [redis]: Creating                      
INFO[0000] Creating service redis                       
INFO[0000] [0/2] [redis]: Created                       
INFO[0000] [0/2] [web]: Creating                        
INFO[0000] Creating service web                         
INFO[0000] [0/2] [web]: Created                         
INFO[0000] [0/2] [redis]: Starting                      
INFO[0002] [1/2] [redis]: Started                       
INFO[0002] [1/2] [web]: Starting                        
INFO[0004] [2/2] [web]: Started                         
flask-web-2 | 2017-06-06T08:50:36.560668542Z  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
...
compose 설정파일의 내용대로 컨테이너들이 실행되는 걸 확인 할 수 있다. rancer server의 Stack메뉴에서 실행한 컨테이너의 상세 정보를 확인 해 보자.

하나의 redis 와 2개의 flask 서버가 실행됐다. 이 2개의 flask 서버는 192.168.56.10, 192.168.56.11에 분산 설치됐다. curl로 테스트해보자.
$ curl 192.168.56.10:5000
Hello World! I have been seen 1 times.
$ curl 192.168.56.11:5000
Hello World! I have been seen 2 times.

Rancher-compose 명령들

Rancher-compose를 이용하면 CLI 환경에서, 인프라 스트럭처를 관리하기 위한 완전한 개발 환경을 만들 수 있다. 개발자는 Rancher key를 할당 받아서 자신의 워크스테이션에서 컨테이너 클러스터에 서비스를 올리고, 배포하고, 업그레이드 할 수 있다. CLI 툴이니 만큼 (약간의? 노력을 투자해서)이러한 과정을 완전히 자동화 할 수도 있다.

Rancher-compose 명령어를 테스트하기 위해서 아래와 같은 Rancher 클러스터 환경을 만들었다.

 테스트용 클러스터
  • 4대의 rancher node를 구성
  • 하나의 rnacher server에서 관리
  • 개발한 이미지를 배포하기 위한 docker registry 구성
  • 개발자는 워크스테이션에서 rancher-compose 명령을 이용해서 컨테이너를 관리한다.
Docker registry 구성은개인 도커 이미지 저장소 만들기 문서를 참고했다.

개발 프로세스는 아래와 같다.
  1. 소프트웨어를 개발 한다.
  2. CI를 이용해서 개발한 소프트웨어를 테스트 하고 빌드 한다.
  3. 테스트와 빌드에 성공하면, Docker registry에 등록한다.
  4. Rancher-compose를 이용해서 소프트웨어를 관리한다.
  5. 관리에는 소프트웨어(컨테이너)의 실행, 중단, 업데이트, 스케일링이 포함된다.
위에서 만든 Flask 애플리케이션을 배포한다.

Docker Registry에 등록

정리

실제 환경에서는 로드밸런서로 Flask 서비스들을 하나로 묶어야 할 것이다. Rancher에서 제공하는 HAProxy 로드밸런서를 이용해서 묶을 수도 있고, Traefik와 같은 컨테이너 기반의 로드밸런서를 이용해서 묶을 수 있을 것이다. 다음 번에는 로드밸런서 구성을 해봐야겠다.