CoreOS 사용하기

이재홍 http://www.pyrasis.com 2014.08.02 ~ 2014.09.20

fleet 사이드킥 모델 활용하기

CoreOS 클러스터에서 fleet을 사용하면 머신 ID, 메타데이터, 특정 유닛의 실행 유무에 따라 유닛을 실행할 노드를 선택하게 됩니다. 즉 각 노드의 IP 주소로 유닛을 실행한 것이 아니기 때문에 유닛의 IP 주소는 알 수가 없습니다. 이때 IP 주소를 얻어오는 방식이 사이드킥(sidekick) 모델입니다.

사이드킥 모델
sidekick은 조수라는 뜻입니다. 메인 컨테이너와 조수 역할을 하는 컨테이너를 함께 실행하여 IP 주소를 알아내기 때문에 사이드킥 모델이라 합니다.

앞에서 etcd를 이용하여 노드끼리 데이터를 공유했습니다. 사이드킥 모델은 etcd를 이용하여 IP 주소를 공유합니다. core-01에서 다음 내용을 web.service 파일로 저장합니다.

~/web.service

[Unit]
Description=Web Service
Requires=docker.service
After=docker.service

[Service]
ExecStartPre=-/usr/bin/docker kill web
ExecStartPre=-/usr/bin/docker rm web
ExecStart=/usr/bin/docker run --name web -p 80:80 nginx:latest
ExecStop=/usr/bin/docker stop web

다음 내용을 web-discovery.service 파일로 저장합니다.

~/web-discovery.service

[Unit]
Description=Announce Web
BindsTo=web.service

[Service]
EnvironmentFile=/etc/environment
ExecStart=/bin/sh -c \
  "while true; \
   do \
     etcdctl set /services/web/nginx \
       '{ \"host\": \"${COREOS_PUBLIC_IPV4}\", \"port\": 80 }' \
       --ttl 60; \
     sleep 45; \
   done"
ExecStop=/usr/bin/etcdctl rm /services/web/nginx

[X-Fleet]
MachineOf=web.service
  • BindsTo: web.service를 지정하여 web.service 유닛이 종료되면 현재 유닛도 함께 종료합니다.
  • EnvironmentFile: 현재 유닛의 환경 변수를 설정할 파일입니다. /etc/environment 파일에 현재 노드의 공인 IP 주소(COREOS_PUBLIC_IPV4)와 사설 IP 주소(COREOS_PRIVATE_IPV4)가 저장되어있으므로 반드시 설정합니다.
  • ExecStart: etcd에 IP 주소와 포트 번호를 등록하는 셸 스크립트를 실행합니다.
    • etcdctl set 명령으로 /services/web/nginx에 키를 생성하고 IP 주소와 포트 번호를 저장합니다. IP 주소는 COREOS_PUBLIC_IPV4 변수에 저장되어 있습니다.
    • --ttl 옵션을 사용하여 60초 뒤에 키가 삭제되도록 설정합니다.
    • sleep 45로 45초마다 etcdctl set 명령을 반복 실행하여 키가 삭제되기 전에 내용을 갱신합니다. 정상적인 노드는 키를 계속 유지할 수 있으며 중단된 노드는 etcdctl set 명령을 실행할 수 없어서 키가 삭제되므로 노드 상태를 확실하게 알 수 있습니다. 또한, 이렇게 반복 실행하면 현재 노드가 중단된 뒤 다른 노드에서 유닛이 다시 실행될 때 etcd에 새 IP 주소를 갱신할 수 있습니다.
  • ExecStop: 유닛이 정지되면 etcd의 /services/web/nginx 키를 삭제합니다.
  • MachineOf: web.service를 지정하여 web.service 유닛이 실행되고 있는 노드에서 현재 유닛을 실행합니다.

fleetctl start 명령으로 web.service, web-discovery.service 유닛을 실행합니다.

core-01

$ fleetctl start web.service
Job web.service launched on d80aaff5.../172.17.8.102
$ fleetctl start web-discovery.service
Job web-discovery.service launched on d80aaff5.../172.17.8.102

저는 web.service, web-discovery.service 유닛이 core-02(d80aaff5, 172.17.8.102)에 실행되었습니다.

이제 etcdctl get 명령을 사용하여 IP 주소와 포트 번호를 출력합니다.

core-01

$ etcdctl get /services/web/nginx
{ "host": "172.17.8.102", "port": 80 }


그림 15-26 fleet 사이드킥 모델로 IP 주소 얻기


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

30 November 2014