CoreOS  Study
by @subicura

1st Docker Korea Online Meetup /  July 30, 2014


etcd
+
systemd
+
fleet
+
(docker)
+
(cloud init)
=
CoreOS

Etcd



온갖종류의 (머신 리스트, 서비스 ip/port)
Key/Value를 (디렉토리 형식)
쉽게 (커맨드툴 또는 curl)
다양한 방밥으로 (ttl/lock)
여기저기 동기화 해줌 (discovery)

동기화는 신경쓰지 말고 로컬 etcd에
자기 정보를 저장하고 다른 정보를 가져다 쓰세요

Systemd



나아진 init system
(No daemon, easy control)

Systemd가 머신 init system이라면
Fleet는 systemd를 이용한
클러스터 init system

Fleet



etcd의 강력한 key/value 저장 기능과
systemd에 custom configuration을 추가해
간단하게
High availability를
구현함

Coreos



Cloud init으로
설치전에
설정 끝

설정파일 만들고
서버만 생성하면 끝




systemD


init system
(like init.d/upstart)

no need to daemonize!
no PID!




logging
(journal)

no need to find /var/log/??




coordination
(targets)

conditional
(before, after, require, bind, ...)


for fleet
(fleet custom option)

X-Conflicts=app.*.service
한 서버엔 한 서비스만

X-ConditionMachineMetadata=region=us-east-1
meta data check

X-ConditionMachineOf=app.1.service
해당 서비스가 존재한다면

systemd demo


/etc/systemd/system/app.1.service

[Unit]
Description=My Service 1
Requires=docker.service
After=docker.service

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

systemd demo


/etc/systemd/system/app.1.service

[Unit]
Description=My Service 1
Requires=docker.service
After=docker.service

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

add ExecStop

systemctl





systemctl status app.1.service
systemctl start app.1.service
systemctl stop app.1.service
systemctl enable app.1.service

journalctl





journalctl -u app.1.service
journalctl -f -u app.1.service

etcd





consistent, distributed
key/value store

cluster discovery




set discovery endpoint

https://discovery.etcd.io/new

command / curl


ls
set --ttl
get
rm
watch
lock

"_" prefix key

etcd demo



etcdctl ls -recursive
etcdctl set /foo/bar "Hello world"
etcdctl set /foo/bar "Bye" --ttl 60
etcdctl get /foo/bar
etcdctl watch /foo/bar
etcdctl rm /foo/bar
etcdctl rm /foo -recursive

fleet




use systemd (+extra configuration)
runs on etcd
abstraction machines
High availability

fleet demo



fleetctl list-machines
fleetctl list-units
fleetctl start my app.service
fleetctl submit app.service
fleetctl destroy app.service
fleetctl start *
fleetctl journal -f app.service
fleetctl status app.service

Deploy


https://coreos.com/docs/launching-containers/launching/fleet-example-deployment/

https://github.com/redguava/docker-haproxy-etcd
Made with Slides.com