众合信隆创客空间
    • 版块
    • 标签
    • 最新
    • 热门
    • 世界
    • header.workstation
    • 未解决
    • 已解决
    • Upgrade
    • 注册
    • 登录

    Docker / Podman 容器运行一段时间后丢失网络的问题

    已定时 已固定 已锁定 已移动 开发者园地
    1 帖子 1 发布者 3 浏览
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • B 离线
      baonaihao
      最后由 Leaguetech Support 编辑

      Docker / Podman 容器运行一段时间后丢失网络的问题

      本文大部分资料来自于 Podman Blog 和 GitHub issues

      Podman 的一个长期存在的问题是,根容器可能会在一段时间后失去网络连接。对于许多用户来说,并不清楚是什么导致了这些问题。

      Netavark 配置 NAT 和端口转发防火墙规则。当另一个进程删除我们的防火墙规则时,容器将失去连接。其中一个进程是 firewalld,当执行 firewall-cmd --reload 时,它将删除所有防火墙规则,然后只添加 firewalld 已知的规则,从而使 Podman 容器失去连接。有趣的是,这个命令甚至不需要用户执行。一些应用程序在更新时运行此命令,例如,dnf 更新就可能导致 firewalld 重新加载,使用户更难知道发生了什么。

      注意:从 firewalld 2.0 开始,它可能不再刷新所有规则,而只刷新 firewalld 特定的规则。

      恢复规则的一个解决方案是简单地重新启动容器,因为所有必要的规则都将在容器启动时添加。然而,这是不期望的,因为一些容器应用可能需要很长时间来停止和/或启动。为了解决这个问题,Podman 很久以前就添加了 podman network reload 命令。此命令将删除网络配置,然后再添加回去。它最近运行得很好,但仍然有一个大问题:在规则丢失后,需要显式执行命令,因此,它不会帮助那些不知道规则何时丢失的用户。

      在 Netavark v1.9.0 中,添加了一个名为 netavark-firewalld-reload.service 的新 systemd 服务,它应该可以一劳永逸地解决这个问题。这个服务运行一个小的 netavark 命令,它在 dbus 上监听 `firewalld reload` 事件。每次重新加载 firewalld 并刷新 netavark 防火墙规则时都会发出此事件。如果收到事件,服务将添加回所有 netavark 防火墙规则。

      新的 systemd 服务被设计成只有在 firewalld 本身也在运行时才运行,除非需要,否则不会消耗资源。下面显示了如何启用该服务的示例。

      首先,启用服务,请注意,启用并不一定意味着在 boot 时启动。对于这个单元, Netavark 添加了一个 wants to firewalld,这意味着只有当 firewalld 启动时服务才会启动。这确保了在未使用或禁用 firewalld 的系统上,它不会不必要地运行。当 firewalld 停止时,服务也将停止。

      $ sudo systemctl enable --now netavark-firewalld-reload.service
      Created symlink /etc/systemd/system/firewalld.service.wants/netavark-firewalld-reload.service → /usr/lib/systemd/system/netavark-firewalld-reload.service.
      

      现在重新启动 firewalld,服务也会启动。

      $ sudo systemctl restart firewalld.service
      $ sudo systemctl status netavark-firewalld-reload.service 
      ● netavark-firewalld-reload.service - Listen for the firewalld reload event and reapply all netavark firewall rules.
           Loaded: loaded (/usr/lib/systemd/system/netavark-firewalld-reload.service; enabled; preset: disabled)
          Drop-In: /usr/lib/systemd/system/service.d
                   └─10-timeout-abort.conf
           Active: active (running) since Mon 2025-06-30 18:00:00 CET; 20s ago
         Main PID: 72000 (netavark)
            Tasks: 3 (limit: 38149)
           Memory: 15.0M
              CPU: 8ms
           CGroup: /system.slice/netavark-firewalld-reload.service
                   └─72000 /usr/libexec/podman/netavark firewalld-reload
      
      Jun 30 18:00:00 pholzing-fedora systemd[1]: Started netavark-firewalld-reload.service - Listen for the firewalld reload event and reapply all netavark firewall rules..
      

      这是一个 Netavark 特定的功能,如果仍然在使用旧的 CNI 后端,它将无法工作。

      Docker / Podman 容器运行一段时间后丢失网络的问题

      本文大部分资料来自于 Podman Blog 和 GitHub issues

      Podman 的一个长期存在的问题是,根容器可能会在一段时间后失去网络连接。对于许多用户来说,并不清楚是什么导致了这些问题。

      Netavark 配置 NAT 和端口转发防火墙规则。当另一个进程删除我们的防火墙规则时,容器将失去连接。其中一个进程是 firewalld,当执行 firewall-cmd --reload 时,它将删除所有防火墙规则,然后只添加 firewalld 已知的规则,从而使 Podman 容器失去连接。有趣的是,这个命令甚至不需要用户执行。一些应用程序在更新时运行此命令,例如,dnf 更新就可能导致 firewalld 重新加载,使用户更难知道发生了什么。

      注意:从 firewalld 2.0 开始,它可能不再刷新所有规则,而只刷新 firewalld 特定的规则。

      恢复规则的一个解决方案是简单地重新启动容器,因为所有必要的规则都将在容器启动时添加。然而,这是不期望的,因为一些容器应用可能需要很长时间来停止和/或启动。为了解决这个问题,Podman 很久以前就添加了 podman network reload 命令。此命令将删除网络配置,然后再添加回去。它最近运行得很好,但仍然有一个大问题:在规则丢失后,需要显式执行命令,因此,它不会帮助那些不知道规则何时丢失的用户。

      在 Netavark v1.9.0 中,添加了一个名为 netavark-firewalld-reload.service 的新 systemd 服务,它应该可以一劳永逸地解决这个问题。这个服务运行一个小的 netavark 命令,它在 dbus 上监听 `firewalld reload` 事件。每次重新加载 firewalld 并刷新 netavark 防火墙规则时都会发出此事件。如果收到事件,服务将添加回所有 netavark 防火墙规则。

      新的 systemd 服务被设计成只有在 firewalld 本身也在运行时才运行,除非需要,否则不会消耗资源。下面显示了如何启用该服务的示例。

      首先,启用服务,请注意,启用并不一定意味着在 boot 时启动。对于这个单元, Netavark 添加了一个 wants to firewalld,这意味着只有当 firewalld 启动时服务才会启动。这确保了在未使用或禁用 firewalld 的系统上,它不会不必要地运行。当 firewalld 停止时,服务也将停止。

      $ sudo systemctl enable --now netavark-firewalld-reload.service
      Created symlink /etc/systemd/system/firewalld.service.wants/netavark-firewalld-reload.service → /usr/lib/systemd/system/netavark-firewalld-reload.service.
      

      现在重新启动 firewalld,服务也会启动。

      $ sudo systemctl restart firewalld.service
      $ sudo systemctl status netavark-firewalld-reload.service 
      ● netavark-firewalld-reload.service - Listen for the firewalld reload event and reapply all netavark firewall rules.
           Loaded: loaded (/usr/lib/systemd/system/netavark-firewalld-reload.service; enabled; preset: disabled)
          Drop-In: /usr/lib/systemd/system/service.d
                   └─10-timeout-abort.conf
           Active: active (running) since Mon 2025-06-30 18:00:00 CET; 20s ago
         Main PID: 72000 (netavark)
            Tasks: 3 (limit: 38149)
           Memory: 15.0M
              CPU: 8ms
           CGroup: /system.slice/netavark-firewalld-reload.service
                   └─72000 /usr/libexec/podman/netavark firewalld-reload
      
      Jun 30 18:00:00 pholzing-fedora systemd[1]: Started netavark-firewalld-reload.service - Listen for the firewalld reload event and reapply all netavark firewall rules..
      

      这是一个 Netavark 特定的功能,如果仍然在使用旧的 CNI 后端,它将无法工作。

      1 条回复 最后回复 回复 引用 0
      • L Leaguetech Support 于 将此主题从 闲聊~新人~讨论区 移至此处

      你好!看起来您对这段对话很感兴趣,但您还没有一个账号。

      厌倦了每次访问都刷到同样的帖子?您注册账号后,您每次返回时都能精准定位到您上次浏览的位置,并可选择接收新回复通知(通过邮件或推送通知)。您还能收藏书签、为帖子顶,向社区成员表达您的欣赏。

      有了你的建议,这篇帖子会更精彩哦 💗

      注册 登录
      • 1 / 1
      • 第一个帖子
        最后一个帖子