如何在容器化世界中唯一地处理 'process'?

How to uniquely address a 'process' in a containerised world?

这是一个一般性问题,但为了论证,您可以假设我们有一组进程通过 AMQP 和 HTTP 的组合进行通信。有两种具体情况需要考虑。

简单的:

较难的:

现在您可以自己分配一个 UUID,但您需要一个 table 来映射它。 这可能有多个列,但有时单个 URI(或 URI 之类的东西)很有用,例如作为 "originated from/reply to" 地址。


另一种看待这个问题的方式。 在过去很容易识别进程。

主机名(或 IP 地址)+ PID 就足够了

然后是虚拟化,IP 地址标识分配给 VM 的虚拟网络端口,PID 标识其中的进程。 主机名和 IP 地址仍然足够。 有时你也需要虚拟主机(虽然我一直不清楚为什么)

现在将容器添加到容器中,容器不一定有自己的 IP 地址。一个 但是如果你是 运行 kubernetes 或 docker swarm,你可能不知道主机。

现在我们不再谈论流程,而是谈论服务。 它曾经足以使用主机名(或 IP 地址)和端口(YMMV - Can an IP address and a port number together uniquely identify a process ID?)来识别服务。

现在我们有了负载平衡器和其他技巧(例如缓存代理)来将消息重定向到实际提供服务的其他地方。

服务可能由容器或包含多个容器的 pod 提供,在这种情况下,您可能需要对 pod 或容器进行寻址。 参见示例 看起来每个 docker 实例的容器名称都是唯一的,但不会超出此范围。

因此,您可能希望通过几种不同的方式处理邮件。 有没有一个好的标准方法来做到这一点?

在我看来,最明显的用途是 URI(但我可能错了)。 是否有推荐的 URI 形式来处理 所有 可能的情况? (对于简单的情况,显然我们有 procotocl://host:port/)

经过一些考虑,我认为 host+pid 仍然足以(但不一定是最好的方法)来识别进程,前提是您注意以下几点:

  • 你说的谁的PID可能有歧义。 它可以是容器的命名空间或主机的 PID。

  • 如果您从容器外部引用进程,则需要使用主机的 PID 而不是容器内部出现的 PID,因为它位于单独的进程命名空间中。 例如参见 [​​=10=]

  • 容器可能会自己识别主机和PID(毕竟它应该是一个沙箱)

  • IP 地址将相对于内部网络(正常)

  • 主机名将通过 DNS 查找(正常)

现在 URI 指的是端口而不是 PID,所以 URI 在这里不合适。 PID@HOST 可能是一个明智的表示法,但要注意与 user@host 的混淆。

除了容器和 Pod ID 之外,还有其他更方便的方法来识别处理资源,例如 stateful sets