CoreOS: Можно ли запустить юнит с помощью cloud-init, который будет управляться флотом?

Могу ли я запускать юниты с помощью 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

person mbo    schedule 13.03.2015    source источник


Ответы (1)


Несколько недель назад я задавался тем же вопросом. В подходе, представленном OP, для запуска процесса использовался Fleetctl. Я думаю, что это повлияло на возможность создания блоков списка Fleetctl, и запущенный процесс был бы указан и управлялся флотом.

Вы можете поместить содержимое из write_files в раздел unit: и избавиться от раздела 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, она управляется базовым systemd.
  • если устройство выйдет из строя из-за сбоя этого узла, оно не будет перенесено на другой узел парка.

Спасибо за отличный вопрос и ответ @mbo :-)

person Greg    schedule 20.03.2015
comment
Да, это была моя первая попытка. Но мне нужен был управляемый с помощью Fleetctl юнит, поэтому путь через write_files был для меня обязательным. - person mbo; 20.03.2015
comment
да, имеет смысл. Я думаю, вы отправляете foo.service только одному или двум хостам вашего флота, верно? если вы отправляете сервис всем им, то имеет смысл не использовать метод запуска Fleetctl, а просто поместить его в раздел юнитов. Я думаю, что большая разница в вашем решении, флот управляет устройством (возможно, размещая его на другом хосте). В решении, в котором вы поместили его в раздел единиц, эта единица работает на этой машине. он по-прежнему управляется (systemd). вы можете увидеть это с помощью systemctl status foo.service. - person Greg; 20.03.2015
comment
Я действительно отправляю сервис на все хосты, но флот справляется с этим правильно и запускает только один модуль, как и хотел. Я хочу, чтобы этим юнитом управлял флот, потому что я хочу иметь возможность улучшать его или иначе управлять им через флот. - person mbo; 21.03.2015