Требовать и запускать сетевой интерфейс podman с помощью systemd

У меня есть служба хоста, управляемая systemd, которая прослушивает сетевой интерфейс Podman по умолчанию (cni-podman0), чтобы контейнеры могли с ним разговаривать.

У меня проблема в том, что Podman создает сетевой интерфейс только при запуске первого контейнера. Это означает, что при запуске службы хоста, от которой зависят контейнеры, сетевой интерфейс не работает, и служба не может его прослушивать.

Итак, цепочка зависимостей следующая: Контейнер Podman -needs> Host Service -needs> Сетевой интерфейс CNI.

Но в настоящее время единственная причина, по которой я знаю, чтобы вызвать интерфейс, - это запуск контейнера.

Как я могу заставить systemd указать Podman / CNI запустить сетевой интерфейс моста по умолчанию, чтобы я мог полагаться на него в модуле обслуживания хоста?

Есть ли команда для явного вызова интерфейса, которую я мог бы поместить в файл модуля?


person fahrradflucht    schedule 14.06.2020    source источник


Ответы (2)


Если я не понял вопрос неправильно, можно использовать параметры After и Wants в вашем служебном файле systemd.

Откройте свой служебный файл, например vim /etc/systemd/system/my_custom_daemon.service и убедитесь, что у вас есть следующее:

[Unit]
After=network.target
Wants=network.target

Если это не сеть хоста, которой вы должны удовлетворять в качестве предварительного условия, вам потребуется создайте настраиваемую цель systemd и укажите ее в своем After/Wants.

person ccpizza    schedule 14.06.2020
comment
Да, это не хост-сеть, это мостовая сеть Podman CNI, поэтому, если я не ошибаюсь, что-то должно запускать ее. Итак, чтобы сформулировать мой вопрос в терминах вашего ответа, что он помещает в настраиваемую цель systemd? - person fahrradflucht; 14.06.2020
comment
@fahrradflucht: см. unix.stackexchange.com/a/301999/15312 - person ccpizza; 14.06.2020
comment
Извините, мне, наверное, следовало сформулировать это более четко. Мне все еще нужна услуга, на которую я ссылаюсь после / желаний цели, не так ли? И что это за интерфейс CNI, который Подман создает при запуске контейнера? Это в основном суть моего вопроса, а не общая механика systemd (которую я более или менее понимаю). Если бы это не было ясно из моего вопроса, я был бы рад, если бы вы помогли мне перефразировать его. - person fahrradflucht; 14.06.2020
comment
да, вам понадобятся две услуги; вы можете использовать systemd для запуска контейнера podman: redhat.com/documentation/en-us/; и если вы предпочитаете не запускать его через systemd, вам все равно потребуется создать фиктивную службу, которая, например, будет опрашивать некоторую конечную точку или проверять некоторые предварительные условия и разблокировать только тогда, когда обнаруживается, что контейнер работает. - person ccpizza; 14.06.2020
comment
Я очень ценю ваши усилия, но я уже использую systemd в качестве контейнера. Моя проблема действительно в том, что я не знаю, как запустить интерфейс без запуска контейнера. Я отредактировал вопрос, чтобы было понятнее. - person fahrradflucht; 14.06.2020
comment
Ваш вариант использования, кажется, вписывается в механизм systemd целей и Requires=xyz. Я подозреваю, что проблема, с которой вы столкнулись, может уже иметь решение, и кто-то из их команды может помочь, если его еще нет в документации. Если вы думаете, что столкнулись с ошибкой, я бы проверил, есть ли у них канал slack / irc / discord или какой-либо форум поддержки. - person ccpizza; 14.06.2020

На данный момент я решил это, добавив служебный модуль oneshot systemd, который запускает немедленно выходящий контейнер alpine с помощью Podman, к зависимостям службы хоста, который запускает немедленно выходящий контейнер alpine с помощью Podman. Это «обманывает» Подмана, заставляя подключать сетевой интерфейс моста.

Менее хакерские решения по-прежнему более чем приветствуются.

person fahrradflucht    schedule 14.06.2020