CoreOS 사용하기

이재홍 http://www.pyrasis.com 2014.08.02 ~ 2014.09.20

CoreOS는 Docker 전용 리눅스 배포판입니다. Docker 컨테이너를 여러 서버에 손쉽게 배포할 수 있고, 클러스터링, 동적 확장, 고가용성(High Availability)을 제공합니다.

CoreOS는 크게 etcd, systemd, fleet 세 가지 컴포넌트로 구성되어 있습니다. 먼저 etcd는 분산 키-값(Distributed Key-Value) 저장소이며 클러스터의 설정 값과 노드 정보를 저장하고 공유하는 시스템입니다. Apache Zookeeper, doozer와 비슷합니다.

etcd는 다음과 같은 특징을 가지고 있습니다.

  • HTTP 프로토콜에 JSON 형식 API를 제공합니다.
  • 초당 1000회 쓰기 성능을 제공합니다.
  • Raft 컨센서스 알고리즘을 이용하여 여러 서버들 중에서 마스터를 선출합니다.
  • 키 자동 삭제 기능(TTL, Time to live)을 제공합니다.
  • 언제나 데이터의 일관성을 보장하는 Atomic 읽기/쓰기를 제공합니다.
  • HTTP 롱 폴링(long-polling)을 통해 키 변경 사항을 감시할 수 있습니다.

etcd는 모든 키 변경 사항을 로그로 저장합니다. 마스터는 로그를 각 팔로어에 복제하여 데이터를 공유합니다. 마스터뿐만 아니라 각 노드에서도 키를 추가하거나 값을 변경하면 모든 노드에 반영됩니다.


그림 15-1 클러스터의 각 팔로어에 로그(데이터) 복제(출처: https://coreos.com/using-coreos/etcd/)

systemd는 리눅스 서비스 매니저이며 기존 System V, BSD init 시스템을 대체하기 위해 개발되었습니다. CoreOS에서는 systemd를 통해 Docker 컨테이너를 실행합니다.

  • 기존 init 시스템에 비해 부팅 속도가 매우 빠릅니다.
  • 서비스 간의 의존성 관계를 설정할 수 있고, 실행 순서를 제어할 수 있습니다.
  • 각 데몬의 로그는 journald를 사용하여 편리하게 조회할 수 있습니다.

systemd는 다음과 같은 형식의 유닛 파일로 서비스를 실행할 수 있습니다. /etc/systemd/system 디렉터리 아래에 example.service와 같이 저장하면 됩니다.

/etc/systemd/system/example.service

[Unit]
Description=Example Service
Requires=docker.service
After=docker.service

[Service]
ExecStart=/usr/bin/docker run busybox /bin/sh -c "while true; do echo Hello World; sleep 1; done"

[Install]
WantedBy=multi-user.target
  • Unit: 유닛 실행 설정입니다.
    • Description: 유닛 설명입니다.
    • Requires: 의존성 설정입니다. 예제는 서비스를 실행하려면 docker.service가 필요하다는 것을 뜻합니다.
    • After: 실행 순서 설정입니다. 예제에서는 docker.service가 완전히 실행된 뒤에 현재 서비스가 실행된다는 것을 뜻합니다.
  • Service: 각 상황에 따라 실행할 명령을 설정합니다.
    • ExecStart: 현재 유닛이 시작되면 명령을 실행합니다. 예제에서는 busybox 이미지로 컨테이너를 생성한 뒤 셸에서 1초마다 Hello World를 출력합니다.
  • Install: 프로세스를 실행할 런 레벨(타깃)을 설정합니다.
    • WantedBy: 유닛의 런 레벨 설정입니다. 예제에서는 multi-user.target으로 설정하여 example.service 파일이 /etc/systemd/multi-user.target.wants 디렉터리 아래에 링크됩니다.

런 레벨
런 레벨(Run Level)은 리눅스에서 운영체제의 실행 모드를 정의한 것입니다.

  • 0, Halt: 시스템 종료입니다. 런 레벨 0으로 변경한다는 것은 시스템 종료를 뜻합니다(runlevel0.target, poweroff.target).
  • 1, Single-user Mode: 단일 사용자 모드입니다. 시스템 복원 모드라고도 합니다(runlevel1.target, rescue.target).
  • 2, Multi-user Mode: 네트워크를 사용할 수 없는 다중 사용자 모드입니다(runlevel2.target, multi-user.target).
  • 3, Multi-user Mode with Networking: 네트워크를 사용할 수 있는 일반적인 다중 사용자 모드입니다(runlevel3.target, multi-user.target).
  • 4, User definable: 사용자 정의 모드(runlevel4.target, multi-user.target)
  • 5, Multi-user graphical Mode: GUI 모드입니다(runlevel5.target, graphical.target).
  • 6, Reboot: 재부팅입니다(runlevel6.target, reboot.target).

위에서 설명한 런 레벨은 Linux Standard Base(LSB) 기준이며 리눅스 배포판에 따라 조금씩 차이가 있습니다. CoreOS에서는 GUI 모드가 없으며 주로 multi-user.target을 사용합니다.

fleet은 etcd와 systemd를 이용한 분산 서비스 실행(init) 시스템 입니다. systemd는 로컬의 서비스를 관리하는 시스템이지만 fleet은 원격에서 여러 서버에 서비스를 실행할 수 있습니다.

그림 15-2는 fleet를 이용하여 API 서버 컨테이너 6개와 로드 밸런서 컨테이너 2개를 CoreOS 클러스터에 배포한 모습입니다. 클러스터 상황에 맞게 fleet가 알아서 호스트를 선택한 뒤 Docker 컨테이너를 배포합니다. 또는, 특정 호스트를 설정하여 컨테이너를 배포할 수도 있습니다.


그림 15-2 fleet로 여러 서버에 Docker 컨테이너 배포(출처: https://coreos.com/using-coreos/clustering/)

다음은 fleet의 특징입니다.

  • Docker 컨테이너를 임의의 호스트에 배포합니다.
  • 특정 호스트에 서비스가 몰리지 않게 적절히 분산해줍니다.
  • 특정 호스트에 장애가 발생해도 정해진 서비스 개수를 유지해줍니다. 즉 특정 호스트가 정지하면 해당 호스트에서 실행되던 서비스를 다른 호스트에서 실행해줍니다.
  • 클러스터에 속한 호스트를 자동으로 발견(discover)합니다.

예제 파일은 저의 GitHub 저장소에서 받을 수 있습니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

30 November 2014