先决条件

先决条件

先决条件

我正在尝试将一些容器从 docker 迁移到 podman 以供生产使用。我的一些容器需要从网络中的 DHCP 服务器分配 IP 地址,因此我使用了docker-net-dhcp

现在,据我了解,虽然它不能在 docker 中用来执行此操作,但macvlanpodman 中的驱动程序可以。

重现步骤

以下是我迄今为止完成的步骤:

  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] 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。

以下是需要采取的步骤:

  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
    Also=io.podman.dhcp.socket
    
  4. 启用服务:

    sudo systemctl --now enable io.podman.dhcp.socket
    
  5. (可选)重新启动并再次调用测试服务是否按预期运行

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

相关内容