1

我可以使用 cloud-init 启动单元,以便之后可以由舰队管理吗?

似乎,云单元只能启动正常的 systemd 服务,但不能让它们处于舰队控制之下。这是正确的吗?

在集群启动后自动启动特定服务的可能解决方案是什么?

解决了:

#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
4

1 回答 1

0

几周前,我也在想同样的事情。OP 提出的方法使用fleetctl 来启动该过程。我认为这会产生能够执行舰队ctl list-units 的影响,并且启动的进程将由舰队列出和管理。

您可以将 write_files 中的内容放在 units: 部分中并去掉 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 list-units 时,您不会看到该单元,它由底层systemd 管理。
  • 如果该单元由于该主机发生故障而发生故障,它将不会迁移到另一个队列主机。

感谢您的精彩问答@mbo :-)

于 2015-03-20T13:00:34.963 回答