先决条件
我正在尝试将一些容器从 docker 迁移到 podman 以供生产使用。我的一些容器需要从网络中的 DHCP 服务器分配 IP 地址,因此我使用了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] Failed to load cached network config: network newnet not found in CNI cache, falling back to loading network newnet from disk WARN[0000] 1 error occurred: * plugin type="macvlan" failed (delete): cni plugin macvlan failed: error dialing DHCP daemon: dial unix /run/cni/dhcp.sock: connect: no such file or directory Error: 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
问题陈述
虽然我很清楚这里出了什么问题,但我不知道该如何解决。你能给我指明正确的方向吗?
附加信息
Debian 版本
sudo lsb_release -a
No LSB modules are available.
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]
波德曼
sudo podman --version
podman version 4.1.1
答案1
我似乎对 podman 的 CNI 插件的功能存在误解。
阅读后这篇博文,我发现 podman CNI 插件必须作为单独的服务运行,以便将 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 Also=io.podman.dhcp.socket
启用服务:
sudo systemctl --now enable io.podman.dhcp.socket
(可选)重新启动并再次调用测试服务是否按预期运行
sudo podman run -it --rm --network newnet alpine ip addr