Вопрос или проблема
Предварительные условия
Я пытаюсь перейти с Docker на Podman для производственного использования некоторых контейнеров. Некоторые из моих контейнеров нуждаются в назначении IP-адресов от DHCP-сервера в моей сети, поэтому я использовал docker-net-dhcp.
Теперь, как я понимаю, хотя это не может быть использовано в Docker для этой цели, драйвер macvlan
в Podman может.
Шаги для воспроизведения
Вот шаги, которые я сделал до сих пор:
- Убедитесь, что мой (физический) сетевой интерфейс существует:
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]
- Создайте сеть 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" } } ]
- Попробуйте настроить тестовый контейнер из минимального образа и подключите его к сети
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.
Вот шаги, которые необходимо предпринять:
-
Создайте macvlan
sudo podman network create -d macvlan -o parent=enp7s0 newnet
-
Проверьте плагин CNI
sudo /usr/libexec/cni/dhcp daemon &
И после того, как демон запущен, начните пример контейнера
sudo podman run -it --rm --network newnet alpine ip addr
Одним очень важным наблюдением, которое я сделал, является то, что (виртуальный) интерфейс внутри контейнера всегда называется
eth0@eth0
, даже несмотря на то, что мой (физический) родительский интерфейс называетсяenp7s0
, что сначала показалось мне запутанным
Еще одним наблюдением, которое я сделал, является то, что родительский интерфейс был заблокирован как используемый ранее запущенным контейнером Docker. В моем случае остановка и отключение всех сервисов контейнеров Docker и перезагрузка помогли. Мне они больше не понадобятся, так как я все равно переношу их на Podman. -
После успешного завершения теста сделайте демон постоянным сервисом:
файл сокета
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
-
включите сервис:
sudo systemctl --now enable io.podman.dhcp.socket
-
(необязательно) перезагрузите и протестируйте, что сервис работает должным образом, снова вызвав
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 запускался как отдельный сервис на вашем хосте.
Шаги для решения проблемы
-
Проверьте интерфейсы сети
Убедитесь, что ваш физический сетевой интерфейс (в данном случае
enp7s0
) активен и правильно настроен:ip addr show enp7s0
-
Создайте сеть macvlan в Podman
Создайте сеть с использованием драйвера macvlan:
sudo podman network create -d macvlan -o parent=enp7s0 newnet
Убедитесь, что команда прошла успешно, и выполните проверку:
sudo podman network inspect newnet
-
Запустите демон DHCP
Чтобы решить проблему с отсутствием сокета, необходимо запустить CNI-демон для DHCP:
sudo /usr/libexec/cni/dhcp daemon &
-
Тестовое подключение контейнера
Теперь, когда демон работает, создайте тестовый контейнер и подключите его к сети
newnet
:sudo podman run -it --rm --network newnet alpine ip addr
Это должно вернуть IP-адрес, который был назначен вашим контейнером через DHCP.
-
Настройка запуска как службы
Чтобы автоматизировать запуск демона 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
- Файл сокета:
-
Активируйте сокет и службу
Теперь активируйте созданный сокет и соответствующую службу:
sudo systemctl --now enable io.podman.dhcp.socket
-
Проверка работы
Для проверки, работает ли служба, перезапустите контейнер и снова вызовите IP-адрес:
sudo podman run -it --rm --network newnet alpine ip addr
Заключение
Следуя всем указанным шагам, вы сможете успешно настроить и использовать сеть macvlan в Podman с получением IP-адресов через DHCP. Все команды были предоставлены, чтобы упростить процесс перехода от Docker к Podman и устранить наличие проблем, связанных с конфигурацией сети. Убедитесь, что демон DHCP работает, и ваша сеть настроена должным образом. Если возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью.