Ошибка сети Podman macvlan

Вопрос или проблема

Предварительные условия

Я пытаюсь перейти с Docker на Podman для производственного использования некоторых контейнеров. Некоторые из моих контейнеров нуждаются в назначении IP-адресов от DHCP-сервера в моей сети, поэтому я использовал docker-net-dhcp.

Теперь, как я понимаю, хотя это не может быть использовано в Docker для этой цели, драйвер macvlan в Podman может.

Шаги для воспроизведения

Вот шаги, которые я сделал до сих пор:

  1. Убедитесь, что мой (физический) сетевой интерфейс существует:
    ip addr show enp7s0
    2: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group 
     default qlen 1000
    link/ether 50:e5:49:36:fd:ee brd ff:ff:ff:ff:ff:ff
    inet 10.0.1.115/24 brd 10.0.1.255 scope global dynamic enp7s0
       valid_lft 59635sec preferred_lft 59635sec
    inet 10.0.1.22/24 brd 10.0.1.255 scope global secondary dynamic enp7s0:1002
       valid_lft 59635sec preferred_lft 59635sec
    [ipv6 ommitted]
    
  2. Создайте сеть Podman:
    sudo podman network create -d macvlan -o parent=enp7s0 newnet
    

    и проверьте

    sudo podman network inspect newnet
    [
        {
            "name": "newnet",
            "id": "884e74728f045cb5209bbaf5e5cf35f1ab7640b11e74ec988fc08ddf97575cf7",
            "driver": "macvlan",
            "network_interface": "enp7s0",
            "created": "2022-06-19T16:45:29.660485744+02:00",
            "ipv6_enabled": false,
            "internal": false,
            "dns_enabled": false,
            "ipam_options": {
                "driver": "dhcp"
            }
        }
    ]
    
  3. Попробуйте настроить тестовый контейнер из минимального образа и подключите его к сети newnet, запрашивая его IP-адрес:
    sudo podman run -it --rm --net newnet alpine ip addr
    WARN[0000] Не удалось загрузить кэшированную конфигурацию сети: сеть newnet не найдена в кэше CNI, переход к загрузке сети newnet с диска
    WARN[0000] 1 ошибка произошла:
     * плагин type="macvlan" не удался (удаление): плагин CNI macvlan не удался: ошибка набора DHCP-демона: вызов unix /run/cni/dhcp.sock: соединение: нет такого файла или каталога
    
    Ошибка: плагин type="macvlan" не удался (добавление): плагин CNI macvlan не удался: ошибка набора DHCP-демона: вызов unix /run/cni/dhcp.sock: соединение: нет такого файла или каталога
    

Описание проблемы

Хотя я очевидно вижу, что здесь пошло не так, у меня нет никакой идеи, как это исправить. Можете ли вы указать мне правильное направление?

Дополнительная информация

Версия Debian

sudo lsb_release -a
Нет доступных модулей LSB.
Distributor ID: Debian
Description:    Debian GNU/Linux 11 (bullseye)
Release: 11
Codename:       bullseye

Установленные пакеты (сокращенные до релевантных)

sudo apt list --installed
Listing... Done
containerd.io/bullseye,now 1.6.6-1 amd64 [installed]
containernetworking-plugins/unknown,now 100:1.1.1-1 amd64 [installed]
containernetworking/unknown,now 100:1.1.1-1 amd64 [installed,automatic]
containers-common/unknown,now 100:0.48.0-1 amd64 [installed,automatic]
podman/unknown,now 100:4.1.1-1 amd64 [installed]
python3-podman-compose/unknown,now 100:1.0.3-1 all [installed]
python3/stable,now 3.9.2-3 amd64 [installed]

Podman

sudo podman --version
podman version 4.1.1

Похоже, у меня было недопонимание по поводу того, что плагин CNI для Podman может делать.

Прочитав этот блог-пост, мне стало очевидно, что плагин CNI Podman должен работать как отдельный сервис для распределения аренды DHCP от DHCP в сети хоста к macvlan.

Вот шаги, которые необходимо предпринять:

  1. Создайте macvlan

    sudo podman network create -d macvlan -o parent=enp7s0 newnet
    
  2. Проверьте плагин CNI

    sudo /usr/libexec/cni/dhcp daemon &
    

    И после того, как демон запущен, начните пример контейнера

    sudo podman run -it --rm --network newnet alpine ip addr
    

    Одним очень важным наблюдением, которое я сделал, является то, что (виртуальный) интерфейс внутри контейнера всегда называется eth0@eth0, даже несмотря на то, что мой (физический) родительский интерфейс называется enp7s0, что сначала показалось мне запутанным
    Еще одним наблюдением, которое я сделал, является то, что родительский интерфейс был заблокирован как используемый ранее запущенным контейнером Docker. В моем случае остановка и отключение всех сервисов контейнеров Docker и перезагрузка помогли. Мне они больше не понадобятся, так как я все равно переношу их на Podman.

  3. После успешного завершения теста сделайте демон постоянным сервисом:

    файл сокета

    sudo nano /usr/lib/systemd/system/io.podman.dhcp.socket
    
    [Unit]
    Description=DHCP Client for CNI
    
    [Socket]
    ListenStream=%t/cni/dhcp.sock
    SocketMode=0600
    
    [Install]
    WantedBy=sockets.target
    

    файл сервиса

    sudo nano /usr/lib/systemd/system/io.podman.dhcp.service
    [Unit]
    Description=DHCP Client CNI Service
    Requires=io.podman.dhcp.socket
    After=io.podman.dhcp.socket
    
    [Service]
    Type=simple
    ExecStart=/usr/libexec/cni/dhcp daemon
    TimeoutStopSec=30
    KillMode=process
    
    [Install]
    WantedBy=multi-user.target
    Также=io.podman.dhcp.socket
    
  4. включите сервис:

    sudo systemctl --now enable io.podman.dhcp.socket
    
  5. (необязательно) перезагрузите и протестируйте, что сервис работает должным образом, снова вызвав

    sudo podman run -it --rm --network newnet alpine ip addr
    

Ответ или решение

Ошибка сети macvlan в Podman: Решение проблемы

Migrating from Docker to Podman может быть сложным процессом, особенно когда речь идет о сетевых конфигурациях, требующих взаимодействия с сервером DHCP. В вашем случае возникла ошибка при попытке использования драйвера macvlan и получения IP-адреса через DHCP. В этой статье мы подробно рассмотрим вашу ситуацию и предоставим пошаговое руководство по устранению возникших проблем.

Проблема и ее причина

Вы столкнулись с ошибкой, связанной с отсутствием сокета DHCP:

plugin type="macvlan" failed (add): cni plugin macvlan failed: error dialing DHCP daemon: dial unix /run/cni/dhcp.sock: connect: no such file or directory

Эта ошибка указывает на то, что Podman не может подключиться к демону DHCP. В отличие от Docker, Podman требует, чтобы CNI-плагин для работы с DHCP запускался как отдельный сервис на вашем хосте.

Шаги для решения проблемы

  1. Проверьте интерфейсы сети

    Убедитесь, что ваш физический сетевой интерфейс (в данном случае enp7s0) активен и правильно настроен:

    ip addr show enp7s0
  2. Создайте сеть macvlan в Podman

    Создайте сеть с использованием драйвера macvlan:

    sudo podman network create -d macvlan -o parent=enp7s0 newnet

    Убедитесь, что команда прошла успешно, и выполните проверку:

    sudo podman network inspect newnet
  3. Запустите демон DHCP

    Чтобы решить проблему с отсутствием сокета, необходимо запустить CNI-демон для DHCP:

    sudo /usr/libexec/cni/dhcp daemon &
  4. Тестовое подключение контейнера

    Теперь, когда демон работает, создайте тестовый контейнер и подключите его к сети newnet:

    sudo podman run -it --rm --network newnet alpine ip addr

    Это должно вернуть IP-адрес, который был назначен вашим контейнером через DHCP.

  5. Настройка запуска как службы

    Чтобы автоматизировать запуск демона DHCP, создайте файл сокета и файл службы для systemd:

    • Файл сокета:
      sudo nano /usr/lib/systemd/system/io.podman.dhcp.socket

      Вставьте следующий код:

      
      [Unit]
      Description=DHCP Client for CNI

    [Socket]
    ListenStream=%t/cni/dhcp.sock
    SocketMode=0600

    [Install]
    WantedBy=sockets.target

    
    - **Файл службы**:
    ```bash
    sudo nano /usr/lib/systemd/system/io.podman.dhcp.service

    Вставьте следующий код:

    [Unit]
    Description=DHCP Client CNI Service
    Requires=io.podman.dhcp.socket
    After=io.podman.dhcp.socket
    
    [Service]
    Type=simple
    ExecStart=/usr/libexec/cni/dhcp daemon
    TimeoutStopSec=30
    KillMode=process
    
    [Install]
    WantedBy=multi-user.target
    Also=io.podman.dhcp.socket
  6. Активируйте сокет и службу

    Теперь активируйте созданный сокет и соответствующую службу:

    sudo systemctl --now enable io.podman.dhcp.socket
  7. Проверка работы

    Для проверки, работает ли служба, перезапустите контейнер и снова вызовите IP-адрес:

    sudo podman run -it --rm --network newnet alpine ip addr

Заключение

Следуя всем указанным шагам, вы сможете успешно настроить и использовать сеть macvlan в Podman с получением IP-адресов через DHCP. Все команды были предоставлены, чтобы упростить процесс перехода от Docker к Podman и устранить наличие проблем, связанных с конфигурацией сети. Убедитесь, что демон DHCP работает, и ваша сеть настроена должным образом. Если возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...