Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS
Docker Seoul Meetup #2에서 발표한 자료입니다.
CoreOS에서 confd와 sidekick service를 이용한 서비스 배포에 대한 내용입니다.
http://www.youtube.com/watch?v=5ixJCM6pAcg
영상과 함께 보시면 더 좋습니다 :)
8. Sidekick for service discovery
APP ! haproxy
APP ip/port
set command etcdctl set key value
etcdctl 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
9. service discovery
APP ! haproxy
APP ip/port
get command etcdctl get key
etcdctl get /services/web/web_1
*recursive : 하위 디렉토리 포함
watch command etcdctl watch key
etcdctl watch /services/web
--recursive
10. service discovery
haproxy
172.17.8.101:49155
APP1
APP2
172.17.8.102:49155
䡬 변화감지
䡬 설정파일 수정
䡬 프로그램 재시작
= confd
䡬 설정저장
11. 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)
18. fleet
[X-Fleet] fleet-specific Options
䡬 MachineID - 해당하는 machine에서 실행
䡬 MachineOf - 특정 서비스가 수행중인 machine에서 실행
䡬 MachineMetadata - metadata를 가진 machine에서 실행
䡬 Conflicts - 해당 서비스가 수행중인 machine을 피해서 실행
*<= 0.8.0 : X-Condition prefix
23. 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 설정파일
!
!
!
!
# 특정 서비스가 실행중인
서버에서 실행
24. 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을 활용하자
26. 더 나은 systemd service 파일
1. %p %i 변수를 사용하자
web@1.service
%p %i
27. 더 나은 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
28. 더 나은 systemd service 파일
2. TimeoutStartSec=0 옵션을 추가하자.
[Service]
TimeoutStartSec=0
docker pull이 오래걸릴 경우
timeout으로 실패하는 걸 방지
29. 더 나은 systemd service 파일
3. Restart=always 옵션을 추가하자.
[Service]
Restart=always
RestartSec=10s
실행이 종료될 경우 자동으로 재시작함
30. 더 나은 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"
범용적으로 활용가능
31. 더 나은 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
“-“ 옵션은 프로세스가 실패해도 다음을 진행함
33. conclusion
easy & flexible configuration
type default docker etcd+confd
방식 설정파일 환경변수 etcd
특징
위치를 찾기 어려움
너무 많은 옵션
문서화가 필수
관리 어려움
중요한 옵션 찾기 쉬움
파일로 관리
관리 쉬움
모든 설정파일을 한곳
에서 관리함
동적 설정이 쉬움
34. conclusion
service manage
type default docker fleet
방식 source repository container service file
특징
소스 컴파일 또는 소스
저장소를 이용함
관리 어려움
Dockerfile을 이용함
관리 쉬움
중앙에서 관리 가능