Podman containers (IP addresses )

Теги

Аренда маршрутизируемых IP-адресов с помощью контейнеров Podman.

В большинстве случаев традиционное сетевое взаимодействие контейнеров (Podman) осуществлялось с помощью мостов и трансляции сетевых адресов (NAT) или путем привязки к сети хоста. По мере того, как роль контейнеров развивалась, росли и случаи использования более динамичных сетевых конфигураций. Один из таких случаев - пользователи, которые хотят, чтобы их контейнеры арендовали IP-адреса у существующих серверов DHCP в их сетевой инфраструктуре без каких-либо изменений в контейнере.

Существует несколько способов решения этой проблемы, в зависимости от ваших обстоятельств. Самый простой - использовать плагины macvlan и dhcp, поставляемые с containernetworking-plugins. Примечание: Это решение применимо только к контейнерам с корневой системой. Бескорневые контейнеры не используют containernetworking-plugins.

Плагин macvlan является частью пакета containernetworking-plugins. Согласно его описанию, macvlan похож на коммутатор, подключенный к сетевому интерфейсу хоста. Используя виртуальные интерфейсы в сочетании с интерфейсом хоста, каждое устройство может иметь отдельный MAC-адрес. Этот факт позволяет существующим серверам DHCP в существующей сети взаимодействовать с устройствами и назначать им адреса. Плагин macvlan также требует использования плагина dhcp containernetworking-plugin. Плагин dhcp является прокси-клиентом DHCP от имени контейнера.

Создание файла конфигурации CNI.

Чтобы настроить этот сценарий, необходимо сначала вручную создать новый файл конфигурации сетевого интерфейса контейнера (CNI). Перед созданием файла необходимо знать, какой интерфейс хоста будет использоваться для привязки. Эту информацию можно получить с помощью IP tools или ifconfig.

В приведенном ниже примере сетевой интерфейс хоста, к которому осуществляется привязка, - enp0s31f6. Другим важным полем является имя сети; в данном случае это example. Это интерфейс, который подключается к целевой сети:

$ cat /etc/cni/net.d/90-example.conflist
{
    "cniVersion": "0.4.0",
    "name": "example",
    "plugins": [
        {
            "type": "macvlan",
            "master": "enp0s31f6",
            "ipam": {
                "type": "dhcp"
            }
        }
    ]
}

Запуск плагина DHCP

Как упоминалось ранее, плагины macvlan и dhcp containernetworking-plugins действуют совместно. Плагин dhcp является прокси-клиентом DHCP для контейнера, поскольку в большинстве образов контейнеров отсутствует клиент DHCP для взаимодействия с сервером DHCP. Хотя плагины можно запускать вручную, обычно вы автоматизируете эту процедуру. Оба варианта приведены ниже.

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

$ sudo /usr/libexec/cni/dhcp daemon &

Когда дело доходит до автоматизации этой процедуры, поскольку плагин dhcp использует сокет, его использование может быть автоматизировано с помощью systemd. Вам просто нужен socket и service файл.

Файл socket выглядит следующим образом:

$ cat /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

И service файл:

$ cat /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

Вам нужно только включить и запустить socket. Все остальное сделает systemd:

$ sudo systemctl --now enable io.podman.dhcp.socket

Прежде чем использовать плагин macvlan, убедитесь, что запущен плагин dhcp. Чтобы использовать сеть-enabled с macvlan, просто укажите ее как сеть, которая будет использоваться с контейнером, используя флаг --network.

Рассмотрим следующий пример запуска контейнера Alpine и проверки IP-адреса сетевого интерфейса eth0:

$ sudo podman run -it --rm --network example alpine ip addr show eth0
2: eth0@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
	link/ether 2a:53:89:31:01:73 brd ff:ff:ff:ff:ff:ff
	inet 192.168.1.222/24 brd 192.168.1.255 scope global eth0
   	valid_lft forever preferred_lft forever
	inet6 fe80::2853:89ff:fe31:173/64 scope link
   	valid_lft forever preferred_lft forever

В примере сеть хоста - 192.168.1.0/24. Обратите внимание, как интерфейс eth0 для контейнера арендует IP-адрес 192.168.1.122. Будьте внимательны, такая конфигурация может исчерпать доступные адреса DHCP, если вы используете большое количество недолговечных контейнеров и DHCP-сервер с длинными арендами.

Примечание: Помните, что цель плагина dhcp - быть прокси-клиентом DHCP для образов контейнеров, в которых не установлен какой-либо клиент DHCP (например, dhclient). Если вы хотите отказаться от использования плагина, вы можете создать образ контейнера, содержащий DHCP-клиент, и обеспечить его выполнение при запуске образа контейнера.

Альтернативные подходы к macvlan.

Как было сказано выше, существует несколько способов разрешить контейнерам арендовать IP-адреса в сети хоста. Хотя подход macvlan является самым простым, вы можете использовать подход на основе моста, используя метод dhcp для управления IP-адресами (IPAM).


Сложная настройка dhcp-relays для обеспечения взаимодействия между хостом, контейнерами и DHCP-сервером выходит за рамки данной заметки.