【问题标题】:How do I replicate a docker macvlan network with podman?如何使用 podman 复制 docker macvlan 网络?
【发布时间】:2020-04-18 06:24:00
【问题描述】:

我在用于托管 Unifi 网络控制器应用程序的 Fedora 工作站上有一个可工作的 docker 实现。我使用 macvlan 为控制器分配静态 IP。创建macvlan的docker network命令是:

docker network create -d macvlan -o parent=enp8s0  --subnet 192.168.110.0/24 --gateway 192.168.110.1 --ip-range 192.168.110.224/27 --aux-address 'host=192.168.110.225' unifinet

控制器运行的容器被分配一个静态ip:

docker run --rm --init --network unifinet --ip 192.168.110.226 ....

我想用 podman 作为替代来实现它。是否有有用的在线教程解释如何使用 podman 使用的 CNI 的实现?特别是macvlan插件?我无法决定是否应该使用静态 IPAM 插件或本地主机 IPAM 插件。

Brent Baude 的 Leasing Routable IP addresses with Podman containers 是一个良好的开端,但专注于使用 dhcp IPAM 插件。

谢谢你

【问题讨论】:

    标签: cni podman macvlan


    【解决方案1】:

    额外的测试和阅读 libpod github 中的一些问题 cmets 导致了以下解决方案,该解决方案定义了一个 macvlan 并使用静态 IPAM 插件分配一个静态 IP。

    在 /etc/cni/net.d 中创建一个名为 90-unifinet.conflist 的文件:

    {
        "cniVersion": "0.4.0",
        "name": "unifinet",
        "plugins": [
        {
                "type": "macvlan",
                "master": "enp8s0",
                "ipam": {
                    "type": "static",
            "addresses": [
                {
                                  "address": "192.168.110.226/24",
                              "gateway": "192.168.110.1"
                }
            ],
                    "routes": [
                           { "dst": "0.0.0.0/0" }
                    ],
                   "dns":  {
                           "nameservers": ["192.168.110.1"]
                   }
                }
            }
        ]
    }
    

    然后以下将起作用

    podman run -it --rm --network unifinet  alpine ping 8.8.8.8 -c 4
    

    【讨论】:

      【解决方案2】:

      我看到您有一个适合您的解决方案,但我会建议使用host-local IPAM 插件,而不是static(这需要您明确分配地址)。相应的配置可能如下所示:

      {
        "cniVersion": "0.3.0",
        "name": "unifinet",
        "plugins": [
          {
            "type": "macvlan",
            "mode": "bridge",
            "master": "eth0",
            "ipam": {
              "type": "host-local",
              "ranges": [
                [{
                  "subnet": "192.168.110.0/24",
                  "rangeStart": "192.168.110.226",
                  "rangeEnd": "192.168.110.255",
                  "gateway": "192.168.110.1"
                }]
              ],
              "routes": [
                {"dst": "0.0.0.0/0"}
              ]
            }
          }
        ]
      }
      

      就像您原来的docker network create 命令一样,这将在 192.168.110.224/27 范围内分配 192.168.110.0/24 网络上的地址(我实际上指定了 192.168.110.226 的范围开始,这将避免分配你用--aux-address保留的192.168.110.225地址)。


      您可以使用podman run--ip 参数来启动具有特定IP 的容器。鉴于上面定义的网络,我们可以运行:

      podman run --net unifinet --ip 192.168.110.230 ...
      

      【讨论】:

      • 谢谢。我在静态 ipam 插件之前尝试过 host-local,但无法找到一种将 IP 显式分配给容器的方法。特定应用需要固定 IP。如果有办法实现这一点,我会非常感兴趣。
      • 就像docker run 一样,podman run 有一个--ip 参数,可以让你为容器分配一个特定的IP。该地址必须来自网络定义的有效范围。
      • 非常感谢。我以为我已经尝试过了并收到了错误。我会试试你的解决方案。顺便说一句 - 我想我已经记住了你在 docker 和 macvlan 上的古怪博客文章。谢谢你写它。
      • 应该注意--ip 标志在某些版本的 containernetworking-plugins 上是错误的,即 Red Hat/CentOS 附带的那个。 CentOS8 Stream 上的 0.8.6-2 似乎可以工作。
      猜你喜欢
      • 2017-10-31
      • 2020-07-22
      • 2017-06-24
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多