CoreOS 사용하기

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

fleet 전용 옵션 사용하기

지금까지 클러스터에서 유닛을 실행되는 노드가 무작위로 정해졌습니다. 이번에는 유닛이 실행되는 노드를 설정할 수 있는 fleet 전용 옵션에 대해 알아보겠습니다.

systemd 유닛 파일(.service)에서 fleet 전용 옵션은 [X-Fleet] 섹션을 사용합니다.

옵션 이름 설명
MachineID 특정 머신에서 유닛을 실행합니다. 머신 ID는 축약된 형태가 아닌 완전한 형태를 설정해야 합니다.
예) MachineID=6960c4ce6f6b44518687a32d5e39dec9
MachineOf 특정 유닛이 실행되고 있는 머신에서 유닛을 실행합니다.
예) MachineOf=hello.service
MachineMetadata 지정한 메타데이터와 일치하는 머신에서 유닛을 실행합니다.
예) MachineMetadata=region=ap-northeast-1
Conflicts 특정 유닛이 실행되고 있는 머신에서는 유닛을 실행하지 않습니다.
예) Confilicts=hello.service
hello.*.service처럼 여러 유닛을 설정할 수도 있습니다.
Global 클러스터의 모든 노드에 유닛을 실행합니다. 옵션 중에서 MachineMetadata만 사용할 수 있고 나머지는 무시됩니다.
예) Global=true

표 15-1 fleet 전용 옵션

특정 머신에서 유닛을 실행하려면 다음과 같이 유닛 파일을 작성합니다. 완전한 형태의 머신 ID는 fleetctl list-machines -full 명령으로 얻을 수 있습니다.

~/hello.service

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

[Service]
ExecStartPre=-/usr/bin/docker kill hello
ExecStartPre=-/usr/bin/docker rm hello
ExecStart=/usr/bin/docker run --name hello busybox /bin/sh -c "while true; do echo Hello World; sleep 1; done"
ExecStop=/usr/bin/docker stop hello

[X-Fleet]
MachineID=6960c4ce6f6b44518687a32d5e39dec9

fleetctl start 명령으로 유닛을 실행하면 core-03(6960c4ce, 172.17.8.103)에 실행됩니다(머신 ID는 CoreOS를 설치할 때마다 달라지므로 책에 있는 ID와 여러분의 머신 ID는 같지 않습니다).

$ fleetctl start hello.service
Job hello.service launched on 6960c4ce.../172.17.8.103

다음은 특정 유닛(hello.service)이 실행되고 있는 머신에서 유닛을 실행하는 예제입니다. 이러한 방식은 웹 서버, DB 등의 IP 주소와 포트를 알아내는 사이드킥(sidekick) 모델에서 활용됩니다.

world.service

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

[Service]
ExecStartPre=-/usr/bin/docker kill world
ExecStartPre=-/usr/bin/docker rm world
ExecStart=/usr/bin/docker run --name world busybox /bin/sh -c "while true; do echo Hello World; sleep 1; done"
ExecStop=/usr/bin/docker stop world

[X-Fleet]
MachineOf=hello.service

다음은 지정한 메타데이터와 일치하는 머신에서 유닛을 실행하는 예제입니다. 리전이 ap-northeast-1이고 클라우드 플랫폼이 amazon인 머신에서 유닛을 실행합니다.

hello-nginx.service

[Unit]
Description=Hello Nginx Service
Requires=docker.service
After=docker.service

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

[X-Fleet]
MachineMetadata="region=ap-northeast-1" "provider=amazon"

us-east-1과 us-west-1에 유닛을 실행하고 싶다면 다음과 같이 설정합니다.

[X-Fleet]
MachineMetadata=region=us-east-1
MachineMetadata=region=us-west-1

다음은 특정 유닛이 실행되고 있는 머신을 피해서 다른 머신에서 유닛을 실행하는 예제입니다. 웹 서버 유닛과 DB 유닛이 있을 때, DB 유닛은 웹 서버 유닛이 실행되지 않은 머신에서 실행합니다.

db.service

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

[Service]
ExecStartPre=-/usr/bin/docker kill db
ExecStartPre=-/usr/bin/docker rm db
ExecStart=/usr/bin/docker run --name db -p 27017:27017 mongo:latest
ExecStop=/usr/bin/docker stop db

[X-Fleet]
Conflicts=web.*.service

여기서 web.*.serviceweb.1.service, web.2.service…를 뜻합니다.


그림 15-24 X-Fleet Conflicts 옵션을 사용하여 유닛 실행


저작권 안내

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

Published

30 November 2014