CoreOS : 설치부터 컨테이너 배포까지

10,854 views

Published on

CoreOS : 설치부터 컨테이너 배포까지

Docker Seoul Meetup #1에서 발표한 자료입니다.

CoreOS에 대한 개념과 간단한 설명을 볼 수 있습니다.

http://youtu.be/pR5MoWHPtQs

영상과 함께 보시면 더 좋습니다 :)

Published in: Technology

CoreOS : 설치부터 컨테이너 배포까지

  1. 1. CoreOS를 이용한 도커 컨테이너 배포 Docker Seoul Meetup #1 / Aug 23, 2014 ! by @subicura (김충섭)
  2. 2. 도커로 모든 어플리케이션을 컨테이너로 만든다면 MY APPRAILS NGINX MONGODBMYSQL RABBITMQ
  3. 3. 서버는 도커를 돌리기 위해 존재할 뿐..
  4. 4. Docker 구동에 최적화된 가볍고 최소화된 모던 OS no package manager (apt/yum)
  5. 5. 2013년 6월부터 Alex Polvi Brandon Philips (rackspace) Michael Marineau (google) Chrome OS를 기반으로 몇가지 기능을 추가하고 서버로 사용할 수 있도록 커스터마이징
  6. 6. CoreOS 특징 A Minimal Operating System Painless Updating Docker Containers Clustered By Default
  7. 7. CoreOS GUI 유료!!
  8. 8. CoreOS 핵심구성 etcd systemd fleet + cloud-init
  9. 9. install coreos-cloudinit enables a user to customize CoreOS machines
  10. 10. cloud-config sample #cloud-config ! coreos: etcd: discovery: https://discovery.etcd.io/<token> addr: $public_ipv4:4001 peer-addr: $public_ipv4:7001 fleet: public-ip: $public_ipv4 units: - name: etcd.service command: start - name: fleet.service command: start users: - name: core coreos-ssh-import-github: subicura
  11. 11. vagrant $ git clone https://github.com/coreos/coreos-vagrant.git $ cd coreos-vagrant $ vi user-data # edit config $ vagrant up *vagrant : Virtual Machine 자동 관리 툴
  12. 12. DEMO
  13. 13. etcd A highly-available key value store /services/app/app_1 {“ip”:”172.17.8.101”} valuekey directory
  14. 14. etcd A highly-available key value store Raft protocol
  15. 15. etcd 쉬운 API (HTTP + JSON) SSL 보안 1000s of writes/s per instance Watch (via HTTP long-polling) Keys support TTL Lock
  16. 16. DEMO
  17. 17. systemd 나아진 init system Fedora, Gentoo, Arch 사용중 / RedHat, Debian, Ubuntu 곧 deamonize pid logfile path 하기쉬움 start/stop hook, audo restart… 할 필요 없음 기억할 필요 없음 기억할 필요 없음 coordination
  18. 18. systemd 시작 - systemctl start [service] 종료 - systemctl stop [service] 강제종료 - systemctl kill [service] 상태보기 - systemctl status [service] 로그보기 - journalctl -u [service]
  19. 19. 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 ExecStartPre / ExecStart / ExecStartPost / ExecReload / ExecStop / ExecStopPost / RestartSec
  20. 20. DEMO
  21. 21. fleet etcd를 backend로 systemd에 custom configuration을 추가하여 service와 machine을 추상화하고 High availability를 구현함
  22. 22. fleet 서버리스트 - fleetctl list-machines 유닛리스트 - fleetctl list-units 시작 - fleetctl start [service] 종료 - fleetctl stop [service] 제거 - fleetctl destroy [service] 상태보기 - fleetctl status [service] 로그보기 - fleetctl journal [service] remote ssh-add ~/.ssh/id_rsa export FLEETCTL_TUNNEL=172.17.8.101
  23. 23. sample.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 ! [X-Fleet] X-Conflicts=sample.*.service
  24. 24. DEMO
  25. 25. service discovery
  26. 26. service discovery database ip와 port는 뭘까?
  27. 27. service discovery app의 ip와 port는 뭘까?
  28. 28. service discovery Application은 자신의 IP와 PORT를 등록(registry)하고 Load Balancer는 IP와 PORT를 발견(discovery)하여 적용함
  29. 29. service discovery etcd TTL 자동으로 삭제 되는 value > 서비스가 비정상적으로 종료되었을 경우에도 체크 가능함 WATCH value 변화를 감지 > 바로바로 즉시성으로 대응 가능함 APP NGINX APP ip/port APP ip/port XXX ip/port NGINX ip/port
  30. 30. service discovery ip port 등록 /services/app/app_1 { “ip”: “172.17.8.101”, “port”: “8080” } while true; do etcdctl set /services/app/app_1 “{xxx}” —-ttl 60; sleep 45; done
  31. 31. service discovery ip port 발견 /services/app/app_1 { “ip”: “172.17.8.101”, “port”: “8080” } 설정 적용 upstream web_application { <% infos.each do |info| %> server <%= info["ip"] %>:<%= info["port"] %>; <% end %> } 서비스 재시작 $ nginx -s reload
  32. 32. sidekick [Unit] Description=Announce web_1 BindsTo=web.1.service ! [Service] ExecStart=/bin/sh -c “WEB_SERVICE_IP=$(…) && WEB_SERVICE_PORT=$ (…) && while true; do etcdctl set /services/web/web_1 "{ "ip ": "$WEB_SERVICE_IP", "port": "$WEB_SERVICE_PORT" }" --ttl 60; sleep 45; done" ExecStop=/usr/bin/etcdctl rm /services/web/web_1 ! [X-Fleet] X-ConditionMachineOf=web.1.service
  33. 33. DEMO
  34. 34. THANK YOU ! QUESTION?

×