CoreOSを使用して、フリートでシステム化されたユニットをスケジュールしています。私は2つのユニット(firehose.service
とfirehose-announce.service
を持っています。firehose-announce.service
をfirehose.service
と共に開始および停止できるようにしています。ここにfirehose-announce.service
のユニットファイルがあります] _:
[Unit]
Description=Firehose etcd announcer
BindsTo=firehose@%i.service
After=firehose@%i.service
Requires=firehose@%i.service
[Service]
EnvironmentFile=/etc/environment
TimeoutStartSec=30s
ExecStartPre=/bin/sh -c 'sleep 1'
ExecStart=/bin/sh -c "port=$(docker inspect -f '{{range $i, $e := .NetworkSettings.Ports }}{{$p := index $e 0}}{{$p.HostPort}}{{end}}' firehose-%i); echo -n \"Adding socket $COREOS_PRIVATE_IPV4:$port/tcp to /firehose/upstream/firehose-%i\"; while netstat -lnt | grep :$port >/dev/null; do etcdctl set /firehose/upstream/firehose-%i $COREOS_PRIVATE_IPV4:$port --ttl 300 >/dev/null; sleep 200; done"
RestartSec=30s
Restart=on-failure
[X-Fleet]
X-ConditionMachineOf=firehose@%i.service
firehose.service
の開始と停止もfirehose-announce.service
を開始または停止するという概念でBindsTo
を使用しようとしています。しかし、これは決して正しく起こりません。 firehose.service
が停止すると、firehose-announce.service
は障害状態になります。しかし、firehose.service
を起動すると、firehose-announce.service
が起動しません。
ここで何が悪いのですか?
私は最終的に正しい組み合わせを見つけて、これを希望どおりに機能させるようになりました。
私のfirehose-announce.service
ユニットでは、BindsTo
のみを設定します。ユニット全体は次のとおりです。
[Unit]
Description=Firehose etcd announcer
BindsTo=firehose@%i.service
[Service]
EnvironmentFile=/etc/environment
TimeoutStartSec=30s
ExecStartPre=/bin/sh -c 'sleep 1'
ExecStart=/bin/sh -c "port=$(docker inspect -f '{{range $i, $e := .NetworkSettings.Ports }}{{$p := index $e 0}}{{$p.HostPort}}{{end}}' firehose-%i); echo -n \"Adding socket $COREOS_PRIVATE_IPV4:$port/tcp to /firehose/upstream/firehose-%i\"; while netstat -lnt | grep :$port >/dev/null; do etcdctl set /firehose/upstream/firehose-%i $COREOS_PRIVATE_IPV4:$port --ttl 300 >/dev/null; sleep 200; done"
RestartSec=30s
Restart=on-failure
[X-Fleet]
X-ConditionMachineOf=firehose@%i.service
これにより、firehose-announce.service
が停止したときにfirehose.service
ユニットが停止します。すごい。しかし、それをどのように再開するのでしょうか?
依存関係を逆にして、firehose.service
ユニットに次のようにします。
[Unit]
Description=Firehose server
Wants=firehose-announce@%i.service
Before=firehose-announce@%i.service
[Service]
ExecStartPre=/usr/bin/docker pull firehose/server
ExecStartPre=-/usr/bin/docker rm -f firehose-%i
ExecStart=/usr/bin/docker run --name firehose-%i -p 7474 --env-file /home/core/firehose.env firehose/server
ExecStop=/usr/bin/docker rm -f firehose-%i
User=core
TimeoutStartSec=5m
TimeoutStopSec=20s
RestartSec=30s
Restart=on-failure
[Install]
WantedBy=multi-user.target
[X-Fleet]
X-Conflicts=firehose@*.service
これは、firehose.service
が起動時にfirehose-announce.service
を起動することを望んでいることを示しています(ただし、firehose-announce.service
が起動できない場合でも失敗しないでください)。また、firehose.service
がfirehose-announce.service
の前に始まることも確認します。
私はこれをテストしましたが、ユニットは希望どおりに一緒に停止および開始するように見えます。