0%

CoreOSをfleetctlから操作する - Part2: hello.service

Part1と同様にIDCFクラウドにCoreOSクラスタを構築する - Part5: 再セットアップで構築したCoreOSクラスタを使い、fleetctlの使い方を勉強していきます。

はじめてのUnitはExperimenting with CoreOS, confd, etcd, fleet, and CloudFormationを参考にして、hello.serviceを登録してみます。

はじめてのUnit - hello.service

プロジェクトを作成します。

$ mkdir -p ~/fleetctl_apps/hello
$ cd !$

登録するUnitを記述したserviceファイルです。

~/fleetctl_apps/hello/hello.service
[Unit]
Description=Hello World
After=docker.service
Requires=docker.service

[Service]
EnvironmentFile=/etc/environment
ExecStartPre=/usr/bin/etcdctl set /test/%m ${COREOS_PRIVATE_IPV4}
ExecStart=/usr/bin/docker run --name test --rm busybox /bin/sh -c "while true; do echo Hello World; sleep 1; done"
ExecStop=/usr/bin/etcdctl rm /test/%m
ExecStop=/usr/bin/docker kill test

hello.serviceをUnitに登録

hello.serviceをCoreOSクラスタのUnitに登録します。

$ export FLEETCTL_ENDPOINT=http://10.1.0.174:4001
$ fleetctl submit hello.service
$ fleetctl start hello.service
Job hello.service launched on 3b9bf346.../10.1.1.90

Unitの確認

登録したUnitをcatで表示します。

~/fleetctl_apps/hello/hello.service
[Unit]
Description=Hello World
After=docker.service
Requires=docker.service

[Service]
EnvironmentFile=/etc/environment
ExecStartPre=/usr/bin/etcdctl set /test/%m ${COREOS_PRIVATE_IPV4}
ExecStart=/usr/bin/docker run --name test --rm busybox /bin/sh -c "while true; do echo Hello World; sleep 1; done"
ExecStop=/usr/bin/etcdctl rm /test/%m
ExecStop=/usr/bin/docker kill test

list-unitsコマンドで、Unitの一覧を表示します。

$ fleetctl list-units
UNIT DSTATE TMACHINE STATE MACHINE ACTIVE
hello.service launched 3b9bf346.../10.1.1.90 launched 3b9bf346.../10.1.1.90 active

journalコマンドで、echoが確認できます。Unitは正常に動作しているようです。

$ fleetctl journal hello.service
Jul 26 11:04:08 coreos-beta-v3-2 docker[6802]: Hello World
Jul 26 11:04:09 coreos-beta-v3-2 docker[6802]: Hello World
Jul 26 11:04:10 coreos-beta-v3-2 docker[6802]: Hello World
Jul 26 11:04:11 coreos-beta-v3-2 docker[6802]: Hello World

statusコマンドで、Unitの状態を確認できます。

$ fleetctl status hello.service
fleetctl status hello.service
● hello.service - Hello World
Loaded: loaded (/run/fleet/units/hello.service; linked-runtime)
Active: active (running) since Mon 2014-07-26 11:01:39 UTC; 4min 31s ago
Process: 6794 ExecStartPre=/usr/bin/etcdctl set /test/%m ${COREOS_PRIVATE_IPV4} (code=exited, status=0/SUCCESS)
Main PID: 6802 (docker)
CGroup: /system.slice/hello.service
└─6802 /usr/bin/docker run --name test --rm busybox /bin/sh -c while true; do echo Hello World; sleep 1; done

etcdctl

CoreOSに登録したUnitは、ExecStartPreでetcdにローカルの環境変数をセットしています。
%mのプレースホルダはMACHINEのIDになります。

~/fleetctl_apps/hello/hello.service
ExecStartPre=/usr/bin/etcdctl set /test/%m ${COREOS_PRIVATE_IPV4}

COREOS_PRIVATE_IPV4は、IDCFクラウドにCoreOSクラスタを構築する - Part5: 再セットアップで、CoreOSのインストール時に/etc/environmentに記述しています。

etcdctlをクラスタ外部から使う場合、--peersオプションかETCDCTL_PEERS環境変数に接続先のetcdのURLをしています。
lsコマンドで/testディレクトリを確認すると、MACHINEのIDのキーが作成されています。

$ etcdctl --peers=http://10.1.0.174:4001 ls /test
/test/3b9bf346d5c64558bec638bb36aca48d

getコマンドで値を取得すると、ExecStartPreでsetしたIPアドレスを確認できます。

$ etcdctl --peers=http://10.1.0.174:4001 get /test/3b9bf346d5c64558bec638bb36aca48d
10.1.1.90

hello.serviceを削除

destroyコマンドを使い、登録したUnitを削除します。

$ fleetctl destroy hello.service
Destroyed Job hello.service

list-unitsコマンドを使い、Unitが削除されたことを確認します。

$ fleetctl list-units
UNIT DSTATE TMACHINE STATE MACHINE ACTIVE