confd, systemd, fleet을 이용한 어플리케이션 배포 in coreos
DESCRIPTION
Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS Docker Seoul Meetup #2에서 발표한 자료입니다. CoreOS에서 confd와 sidekick service를 이용한 서비스 배포에 대한 내용입니다. http://www.youtube.com/watch?v=5ixJCM6pAcg 영상과 함께 보시면 더 좋습니다 :)TRANSCRIPT
confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS
Docker Seoul Meetup #2 / Sep 26, 2014 !
by @subicura (김충섭)
service discovery
haproxy load-balancer
web1 web application
web2 web application
Docker 구동에 최적화된
가볍고 최소화된 모던 OS
no package manager (apt/yum)
CoreOS 특징
A Minimal Operating System Painless Updating
Docker Containers Clustered By Default
CoreOS 구성
etcd
systemd
fleet
etcd
A highly-available key value store
/services/web/web_1 172.17.8.101:49155
valuekey
directory
etcd
A highly-available key value store
cluster
Sidekick for service discovery
APP haproxy!APP ip/port
set command etcdctl set key valueetcdctl set /services/web/web_1 \ 172.17.8.101:49155
etcdctl set /services/web/web_1 \ 172.17.8.101:49155 \ --ttl 60
*ttl : Time to live
service discovery
APP haproxy!APP ip/port
get command etcdctl get keyetcdctl get /services/web/web_1
*recursive : 하위 디렉토리 포함
watch command etcdctl watch keyetcdctl watch /services/web \ --recursive
service discovery
haproxy
APP1
172.17.8.101:49155
APP2
172.17.8.102:49155
변화감지
설정파일 수정
프로그램 재시작
= confd
설정저장
confd
lightweight configuration management tool
written in Go
etcd / Consul support
template resource config (TOML)
source template
not stable (template syntax change)
only support polling (not yet)
template resource config
[template] src = "haproxy.conf.tmpl" dest = "/etc/haproxy/haproxy.conf" owner = "root" group = "root" mode = "0644" keys = [ “/services/web", ] reload_cmd = "/usr/sbin/service haproxy restart"
haproxy.toml
source template… !backend default balance {{ getv “/haproxy/balance" }} option httpclose option forwardfor {{ if ls "/services/web" }} {{ range gets "/services/web/*" }} server {{base .Key}} {{.Value}} check {{ end }} {{ end }}
https://github.com/kelseyhightower/confd/blob/0.6.x/docs/templates.md
haproxy.cfg.tmpl
DEMO
systemdSystem and Service Manager
CoreOS default init system
sample.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
fleet
distributed init system (systemd + etcd)
fleet
MachineID - 해당하는 machine에서 실행
MachineOf - 특정 서비스가 수행중인 machine에서 실행
MachineMetadata - metadata를 가진 machine에서 실행
Conflicts - 해당 서비스가 수행중인 machine을 피해서 실행
[X-Fleet] fleet-specific Options
*<= 0.8.0 : X-Condition prefix
sidekick pattern
container를 실행하거나
container를 중지할때
container의 정보를 etcd에 저장하는
sidekick용 service를 활용
sidekick pattern
web application container
web application
sidekick service
기존 컨테이너 수정없이 추가하여 사용가능 (socket 통신시)
etcd
/etc/environment
COREOS_PUBLIC_IPV4=172.17.8.102 COREOS_PRIVATE_IPV4=172.17.8.102
docker inspect "NetworkSettings": { "Bridge": "docker0", "Gateway": "10.1.42.1", "IPAddress": "10.1.0.16", "IPPrefixLen": 16, "PortMapping": null, "Ports": { "80/tcp": [ { "HostIp": "0.0.0.0", "HostPort": "49167" } ] } }
docker inspect --format='{{(index (index .NetworkSettings.Ports "80/tcp") 0).HostPort}}' web1
web.service의 sidekick service[Unit] Description=Web1 Sidekick Container !After=web.1.service BindsTo=web.1.service ![Service] EnvironmentFile=/etc/environment !… ![X-Fleet] MachineOf=web.1.service
!!!# 특정 서비스 실행 후 실행
# 특정 서비스 종료 시 종료
!!# CoreOS cloud 설정파일
!!!!# 특정 서비스가 실행중인
서버에서 실행
web.service의 sidekick service
ExecStart=/bin/sh -c \ "SERVICE_PORT=$(docker inspect --format='{{(index (index .NetworkSettings.Ports \"80/tcp\") 0).HostPort}}' web1) && \ while true; do \ etcdctl set /services/web/web1 \ \”$COREOS_PRIVATE_IPV4:$SERVICE_PORT\" --ttl 60; \ sleep 45; \ done" ExecStop=/usr/bin/etcdctl rm /services/web/web1
ttl을 활용하자
DEMO - ver.1
더 나은 systemd service 파일
1. %p %i 변수를 사용하자
[Unit] Description=My Service %i Requires=docker.service After=docker.service ![Service] ExecStart=/usr/bin/docker run --rm --name %p-%i busybox \ /bin/sh -c "while true; do echo Hello World; sleep 1; done" ExecStop=/usr/bin/docker kill %p-%i
더 나은 systemd service 파일
2. TimeoutStartSec=0 옵션을 추가하자.
[Service] TimeoutStartSec=0
docker pull이 오래걸릴 경우
timeout으로 실패하는 걸 방지
더 나은 systemd service 파일
3. Restart=always 옵션을 추가하자.
[Service] Restart=always RestartSec=10s
실행이 종료될 경우 자동으로 재시작함
더 나은 systemd service 파일
4. Environment 옵션을 활용하자.
[Service] Environment="SERVICE_NAME=%p_run-%i" Environment=“SERVICE_ETCD_KEY=/services/web/%p-%i" Environment="SERVICE_IMAGE_URL=subicura/whoami"
범용적으로 활용가능
더 나은 systemd service 파일
5. ExecStartPre 옵션을 활용하자.
[Service] ExecStartPre=-/usr/bin/docker kill $SERVICE_NAME ExecStartPre=-/usr/bin/docker rm $SERVICE_NAME ExecStartPre=/usr/bin/docker pull $SERVICE_IMAGE_URL ExecStart=/usr/bin/docker run --rm \ --name $SERVICE_NAME -P $SERVICE_IMAGE_URL ExecStop=/usr/bin/docker stop $SERVICE_NAME
“-“ 옵션은 프로세스가 실패해도 다음을 진행함
DEMO - final
conclusioneasy & flexible configuration
type default docker etcd+confd
방식 설정파일 환경변수 etcd
특징
위치를 찾기 어려움 너무 많은 옵션 문서화가 필수 관리 어려움
중요한 옵션 찾기 쉬움 파일로 관리 관리 쉬움
모든 설정파일을 한곳에서 관리함 동적 설정이 쉬움
conclusionservice manage
type default docker fleet
방식 source repository container service file
특징소스 컴파일 또는 소스 저장소를 이용함 관리 어려움
Dockerfile을 이용함 관리 쉬움
중앙에서 관리 가능
THANK YOU !
QUESTION?
code
discovery sample - https://github.com/subicura/
discovery-fleetd-sample
haproxy-confd - https://github.com/subicura/
haproxy-confd
whoami - https://github.com/subicura/whoami