가장 빨리 만나는 Docker 15장 CoreOS 사용하기
- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
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 디렉터리 아래에 링크됩니다.