我可以使用 cloud-init 启动单位,以便以后由舰队管理它们吗?
似乎只有正常的系统服务才能由云单元启动,但不能将它们置于队列控制之下。这是对的吗?
在引导集群后自动启动特定服务的可能解决方案是什么?
解决:
#cloud-config
write_files:
- path: /home/core/foo.service
owner: core:core
permissions: 0644
content: |
[Unit]
Description=Foo
Requires=docker.service
After=docker.service
[Service]
User=core
TimeoutStartSec=0
KillMode=none
EnvironmentFile=/etc/environment
ExecStartPre=-/usr/bin/docker kill foo
ExecStartPre=-/usr/bin/docker rm foo
ExecStartPre=/usr/bin/docker pull registry.example.com/foo
ExecStart=/usr/bin/docker run --name foo registry.example.com/foo
ExecStop=/usr/bin/docker stop foo
coreos:
etcd:
discovery: https://discovery.etcd.io/<token>
addr: $private_ipv4:4001
peer-addr: $private_ipv4:7001
units:
- name: etcd.service
command: start
- name: fleet.service
command: start
- name: auto-start-foo.service
command: start
content: |
[Unit]
Description=Autostarts foo-service
Requires=docker.service
After=docker.service
[Service]
WorkingDirectory=/home/core/
ExecStart=/usr/bin/fleetctl start foo.service
Type=oneshot
几周前,我也在想同样的事情。 OP提出的方法使用fleetctl来启动该过程。 我认为这会影响能够进行 fleetctl 列表单位,并且启动的过程将由 舰队 列出和管理。
您可以将write_files中的内容放在单元中:部分并删除write_files部分,如下所示:
#cloud-config
coreos:
etcd:
discovery: https://discovery.etcd.io/<token>
addr: $private_ipv4:4001
peer-addr: $private_ipv4:7001
units:
- name: etcd.service
command: start
- name: fleet.service
command: start
- name: foo.service
command: start
content: |
[Unit]
Description=Foo
Requires=docker.service
After=docker.service
[Service]
User=core
TimeoutStartSec=0
KillMode=none
EnvironmentFile=/etc/environment
ExecStartPre=-/usr/bin/docker kill foo
ExecStartPre=-/usr/bin/docker rm foo
ExecStartPre=/usr/bin/docker pull registry.example.com/foo
ExecStart=/usr/bin/docker run --name foo registry.example.com/foo
ExecStop=/usr/bin/docker stop foo
但是,这确实意味着:
- 当您执行 fleetctl 列表时,您不会看到该单位 - 单位,它正在由底层系统进行管理。
- 如果设备由于此主机故障而发生故障,则不会迁移到另一台主机舰队主机。
感谢您的精彩提问和回答@mbo:-)