【问题标题】:Require and start podman network interface using systemd使用 systemd 要求并启动 podman 网络接口
【发布时间】:2020-10-03 20:09:54
【问题描述】:

我有一个由 systemd 管理的主机服务,它侦听 Podman 默认网络接口 (cni-podman0),以便容器可以与之通信。

我遇到的问题是 Podman 仅在第一个容器启动时创建网络接口。这意味着当容器所依赖的主机服务启动时,网络接口没有启动,服务无法监听它。

所以依赖链是: Podman 容器 -needs> 主机服务 -needs> CNI 网络接口

但目前我所知道的启动界面的唯一原因是启动容器。

如何让 systemd 告诉 Podman / CNI 启动默认的桥接网络接口,以便我可以在主机服务单元中依赖它?

是否有明确调出界面的命令,我可以放在一个单元文件中吗?

【问题讨论】:

    标签: systemd podman cni


    【解决方案1】:

    除非我误解了问题,否则可以在 systemd 服务文件中使用 AfterWants 参数。

    打开您的服务文件,例如vim /etc/systemd/system/my_custom_daemon.service 并确保您拥有以下信息:

    [Unit]
    After=network.target
    Wants=network.target
    

    如果它不是作为前提条件您需要满足的主机网络,那么您需要create a custom systemd target 并在您的After/Wants 中引用它。

    【讨论】:

    • 是的,它不是主机网络,而是 Podman CNI 桥接网络,所以如果我没记错的话,必须启动它。因此,根据您的回答来表达我的问题,它在自定义 systemd 目标中添加了什么?
    • 对不起,我可能应该更清楚地表达这一点。我仍然需要我在目标之后/想要中引用的服务,不是吗? Podman 在容器启动时创建的 CNI 接口是什么?这基本上是我问题的核心,而不是一般的系统机制(我或多或少理解)。如果我的问题不清楚,如果你能帮我改写一下,我会很高兴。
    • 是的,您需要两项服务;您可以使用 systemd 启动 podman 容器:access.redhat.com/documentation/en-us/…;如果您不希望通过 systemd 启动它,那么您仍然需要创建一个虚拟服务,例如轮询某个端点或检查一些先决条件并仅在检测到容器启动时解除阻塞。
    • 您的用例似乎适合目标和Requires=xyz 的 systemd 机制。我怀疑您面临的问题可能已经有了解决方案,如果文档中没有,他们团队中的某个人可能会提供帮助。如果您认为自己遇到了错误,我会检查他们是否有 slack/irc/discord 频道或任何类型的支持论坛。
    【解决方案2】:

    我现在通过向主机服务依赖项添加一个 oneshot systemd 服务单元来解决这个问题,该服务单元使用 Podman 运行一个立即退出的 alpine 容器,该依赖项使用 Podman 运行一个立即退出的 alpine 容器。这会“欺骗”Podman 启动桥接网络接口。

    不那么老套的解决方案仍然非常受欢迎。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-15
      • 2021-11-17
      • 1970-01-01
      • 2018-07-19
      • 2013-07-14
      • 2016-06-18
      • 2020-03-10
      相关资源
      最近更新 更多