- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
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
명령으로 얻을 수 있습니다.
[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) 모델에서 활용됩니다.
[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인 머신에서 유닛을 실행합니다.
[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 유닛은 웹 서버 유닛이 실행되지 않은 머신에서 실행합니다.
[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.*.service
는 web.1.service, web.2.service...를 뜻합니다.
저작권 안내
이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.- 블로그, 게시판 등에 퍼가는 것을 금지합니다.
- 비공개 포스트에 퍼가는 것을 금지합니다.
- 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
- 링크 및 SNS 공유는 허용합니다.