V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
libook
V2EX  ›  Docker

使用 Macvlan 的容器间歇性失联

  •  
  •   libook · 2023-10-16 16:08:49 +08:00 · 782 次点击
    这是一个创建于 441 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一台 PC 作为家用服务器使用,上面使用 Docker 跑了若干容器。

    由于防火墙和透明代理配置的需要,需要部分容器使用独立 IP 来跑,并在相关规则中添加这些 IP 的规则。 于是我开始使用 Docker 提供的 macvlan 功能,创建了一个 macvlan 类型的 network ,相关容器配置使用这个 network ,并指定独立 IP 。

    容器创建出来后是可以按照预期运行的,在其他设备访问这些 IP 也都可以正确访问到这些容器。

    问题是在这些容器开始建立一些网络连接后,这些容器就会变得不可访问,直到连接断开才重新恢复访问。容器本身的运行状态正常(无闪退、死机)。其他非 macvlan 容器访问正常。

    举个例子,用容器跑 aria2 或 transmission ,没有任务的时候可以正常访问,添加任务后,当任务与一定数量节点建立联系后,aria2 或 transmission 的 RPC API 就无法访问,直到任务完成后又恢复访问。

    不光从容器外部访问会失联,使用 docker exec 进入到正在运行的容器内部,执行 curl 127.0.0.1 也会失联或延迟数十秒返回结果。

    如何排查问题可能出在哪?

    系统情况:

    • 平台:AMD64
    • 宿主系统:Debian 11
    • 内核版本:5.10.0-25-amd64
    • Docker 版本:24.0.6
    • containerd 版本:1.6.24
    • runc 版本:1.1.9
    • docker-init 版本:0.19.0
    • 网卡接口 MTU:1500
    • Docker 内 macvlan 网络 MTU:1400 ( com.docker.network.driver.mtu )
    • ulimit:1048576
    • sysctl net.core.somaxconn:4096
    • /proc/sys/net/ipv4/tcp_max_syn_backlog:4096
    zljklang
        1
    zljklang  
       2023-10-30 15:20:44 +08:00
    用网桥
    libook
        2
    libook  
    OP
       2023-10-30 16:42:05 +08:00
    @zljklang #1 可以具体说明配置什么样的网桥吗?
    因为需要独立 IP ,所以没有使用 docker 默认的网桥网络,而是用了 macvlan ,我需要确保从外面用容器自己的 IP 访问容器。
    zljklang
        3
    zljklang  
       2023-10-31 09:30:53 +08:00
    docker network create kind -o com.docker.network.bridge.default_bridge=true -o com.docker.network.bridge.enable_icc=true -o com.docker.network.bridge.enable_ip_masquerade=true -o com.docker.network.bridge.host_binding_ipv4=0.0.0.0 -o com.docker.network.bridge.name=vmbr0 -o com.docker.network.driver.mtu=1500 --driver bridge --subnet 192.168.3.33/27 --gateway 192.168.3.254
    zljklang
        4
    zljklang  
       2023-10-31 09:33:36 +08:00
    先手动命令新建网桥 vmbr0 ,在执行上面这个命令,--gateway 网关就填网桥 ip
    libook
        5
    libook  
    OP
       2023-10-31 11:10:34 +08:00
    @zljklang #3 还没试,有两个疑问:
    1. 我需要容器拥有一个与宿主机并列的独立 IP ,因为路由器要根据这个独立 IP 来添加规则,不能用 docker 宿主机的 IP ,否则会把宿主机上其他使用网桥的容器也一并按规则处理了。这个指令看起来是在 docker 宿主机内部创建了一个子网,是不是说最终还是是的使用 docker 宿主机的 IP+容器端口来访问容器?
    2. 在宿主机上执行 docker exec 进入容器内部,在容器内部 curl 容器上服务进程所监听的端口( 127.0.0.1:端口号),依然会出现与外部访问一样的失联问题,我理解在容器内部访问容器本地端口应该是走的容器内的 lo interface ,而不是任何其他宿主机上创建的网桥或 macvlan ,依然会出现失联问题的话,会不会是更底层的网络管理或实现方面的问题?
    libook
        6
    libook  
    OP
       2023-10-31 11:11:59 +08:00
    @zljklang 我路由器是个独立硬件设备,不运行在 docker 宿主机上。
    zljklang
        7
    zljklang  
       2023-10-31 11:18:49 +08:00
    会分到路由器给的 IP ,路由器上也能看到 ip
    zljklang
        8
    zljklang  
       2023-10-31 11:20:06 +08:00
    或者可以不用改,直接在路由上添加静态路由也可以直接访问容器 ip ,这个要在宿主机上开启包转发功能。
    zljklang
        9
    zljklang  
       2023-10-31 11:27:24 +08:00
    那是不是是你服务的问题,curl 127.0.0.1 也有问题
    libook
        10
    libook  
    OP
       2023-10-31 11:37:39 +08:00
    @zljklang #9 试过 Transmission 和 aria2 ,都有这个问题,但以 bridge 网络来跑就没有问题,用 macvlan 跑就有问题,让我不禁怀疑是不是当前内核版本底层的网络实现有 bug 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1118 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:39 · PVG 02:39 · LAX 10:39 · JFK 13:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.