Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

36
confd, systemd, fleet이용한 어플리케이션 배포 in CoreOS Docker Seoul Meetup #2 / Sep 26, 2014 by @subicura (김충섭)

description

Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS Docker Seoul Meetup #2에서 발표한 자료입니다. CoreOS에서 confd와 sidekick service를 이용한 서비스 배포에 대한 내용입니다. http://www.youtube.com/watch?v=5ixJCM6pAcg 영상과 함께 보시면 더 좋습니다 :)

Transcript of Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

Page 1: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

Docker Seoul Meetup #2 / Sep 26, 2014 !

by @subicura (김충섭)

Page 2: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

service discovery

haproxy load-balancer

web1 web application

web2 web application

Page 3: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

Docker 구동에 최적화된

가볍고 최소화된 모던 OS

no package manager (apt/yum)

Page 4: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

CoreOS 특징

A Minimal Operating System Painless Updating

Docker Containers Clustered By Default

Page 5: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

CoreOS 구성

etcd

systemd

fleet

Page 6: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

etcd

A highly-available key value store

/services/web/web_1 172.17.8.101:49155

valuekey

directory

Page 7: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

etcd

A highly-available key value store

cluster

Page 8: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

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

Page 9: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

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

Page 10: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

service discovery

haproxy

APP1

172.17.8.101:49155

APP2

172.17.8.102:49155

변화감지

설정파일 수정

프로그램 재시작

= confd

설정저장

Page 11: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

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)

Page 12: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

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

Page 13: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

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

Page 14: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

DEMO

Page 15: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

systemdSystem and Service Manager

CoreOS default init system

Page 16: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

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

Page 17: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

fleet

distributed init system (systemd + etcd)

Page 18: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

fleet

MachineID - 해당하는 machine에서 실행

MachineOf - 특정 서비스가 수행중인 machine에서 실행

MachineMetadata - metadata를 가진 machine에서 실행

Conflicts - 해당 서비스가 수행중인 machine을 피해서 실행

[X-Fleet] fleet-specific Options

*<= 0.8.0 : X-Condition prefix

Page 19: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

sidekick pattern

container를 실행하거나

container를 중지할때

container의 정보를 etcd에 저장하는

sidekick용 service를 활용

Page 20: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

sidekick pattern

web application container

web application

sidekick service

기존 컨테이너 수정없이 추가하여 사용가능 (socket 통신시)

etcd

Page 21: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

/etc/environment

COREOS_PUBLIC_IPV4=172.17.8.102 COREOS_PRIVATE_IPV4=172.17.8.102

Page 22: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

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

Page 23: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

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 설정파일

!!!!# 특정 서비스가 실행중인

서버에서 실행

Page 24: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

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을 활용하자

Page 25: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

DEMO - ver.1

Page 26: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

더 나은 systemd service 파일

1. %p %i 변수를 사용하자

[email protected]%p %i

Page 27: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

더 나은 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

Page 28: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

더 나은 systemd service 파일

2. TimeoutStartSec=0 옵션을 추가하자.

[Service] TimeoutStartSec=0

docker pull이 오래걸릴 경우

timeout으로 실패하는 걸 방지

Page 29: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

더 나은 systemd service 파일

3. Restart=always 옵션을 추가하자.

[Service] Restart=always RestartSec=10s

실행이 종료될 경우 자동으로 재시작함

Page 30: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

더 나은 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"

범용적으로 활용가능

Page 31: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

더 나은 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

“-“ 옵션은 프로세스가 실패해도 다음을 진행함

Page 32: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

DEMO - final

Page 33: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

conclusioneasy & flexible configuration

type default docker etcd+confd

방식 설정파일 환경변수 etcd

특징

위치를 찾기 어려움 너무 많은 옵션 문서화가 필수 관리 어려움

중요한 옵션 찾기 쉬움 파일로 관리 관리 쉬움

모든 설정파일을 한곳에서 관리함 동적 설정이 쉬움

Page 34: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

conclusionservice manage

type default docker fleet

방식 source repository container service file

특징소스 컴파일 또는 소스 저장소를 이용함 관리 어려움

Dockerfile을 이용함 관리 쉬움

중앙에서 관리 가능

Page 35: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

THANK YOU !

QUESTION?

Page 36: Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS

code

discovery sample - https://github.com/subicura/

discovery-fleetd-sample

haproxy-confd - https://github.com/subicura/

haproxy-confd

whoami - https://github.com/subicura/whoami