【问题标题】:CoreOS: Is it possible to start an unit with cloud-init, which is manageable by fleet?CoreOS:是否有可能使用可以由舰队管理的 cloud-init 启动一个单元?
【发布时间】:2015-05-16 00:37:10
【问题描述】:

我可以使用 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

【问题讨论】:

    标签: coreos cloud-init


    【解决方案1】:

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

    您可以将 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 :-)

    【讨论】:

    • 是的,那是我的第一次尝试。但是我需要由fleetctl管理的单元,所以对我来说,write_files的方式是强制性的。
    • 是的,有道理。我猜你只将 foo.service 发送给你的一两个舰队主机,对吧?如果您要向所有人发送服务,那么不使用fleetctl 启动技术并将其简单地放在units 节中是有意义的。我认为最大的区别在于您的解决方案,车队管理单元(很可能将其放在不同的主机上)。在将其放入单元节的解决方案中,该单元在该机器上运行。它仍然由 systemd 管理。你可以通过 systemctl status foo.service 看到它。
    • 我确实将服务发送到所有主机,但舰队设法让它正确并且只启动一个单元,如所希望的。我希望这个单位由舰队管理,因为我希望能够通过舰队对其进行升级或以其他方式管理它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多