【问题标题】:Container in one pod communicating with one in a multicontainer pod一个 pod 中的容器与多容器 pod 中的一个容器进行通信
【发布时间】:2021-07-13 00:46:15
【问题描述】:
  • 我正在尝试弄清楚 Kubernetes 中的网络,尤其是多容器 pod 的处理。在我的简单场景中,我总共有 3 个 pod。一个有两个容器,另一个只有一个容器,它想与那个多容器 pod 中的特定容器通信。我想弄清楚 Kubernetes 是如何处理这些容器之间的通信的。

    为此,我在“sidecar 架构”中有一个简单的多容器 pod,YAML 文件如下:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
 - name: nginx-container
    image: nginx
    ports:
    - containerPort: 80
 - name: sidecar
    image: curlimages/curl
    command: ["/bin/sh"]
    args: ["-c", "echo Hello from the sidecar container; sleep 300"]
    ports:
    - containerPort: 5000
  • 我想用这个 YAML 文件实现的是,在 pod“nginx”中,有两个容器,一个运行 nginx 并侦听该 pod 的端口 80,另一个运行简单的 curl 映像(与 nginx 不同的任何东西)不违反 Kubernetes 的每个 pod 约定一个容器)并且可以在 pod 的 5000 端口上监听通信。

    然后我有另一个 YAML 文件再次运行 nginx 映像。该容器将尝试与另一个 pod 上的 nginx 和 curl 图像进行通信。 YAML文件如下:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-simple
  labels:
    app: nginx
spec:
  containers:
 - name: nginx-container
    image: nginx
    ports:
    - containerPort: 80
  • 部署 pod 后,我只需使用以下命令即可公开 nginx pod:

    kubectl expose pods/nginx

  • 然后我在 nginx-simple 容器内启动一个终端。(带有一个容器的 Pod)。当我 curl 我从 kubectl get svc 获得的 IP 地址时,这是我之前使用端口 80 的公开命令生成的服务,我可以轻松获得 nginx 的欢迎消息。但是,当我尝试与 curl 容器通信时,问题就开始了。当我卷曲相同的 IP 地址但这次使用端口 5000(我在 Yaml 文件中设置的容器端口)时,我收到连接被拒绝错误。我在这里做错了什么?

提前致谢。

P.S:我也很高兴听到您对这个主题的学习材料建议。非常感谢。

【问题讨论】:

  • 仅仅因为您在 yaml 中声明了一个端口,并不意味着您有一个容器正在监听该端口。您在该容器中运行的应用程序是 curl,它没有监听任何端口。
  • 我明白了,但我不应该能够 ping 这个 curl 容器吗?我试图弄清楚一个 pod 中的容器如何与另一个 pod 中的特定容器进行通信,该容器是一个多容器容器。谢谢。
  • 不,一旦 curl 命令终止,容器就会死掉。您需要该容器中的服务器进程
  • 您不与容器通信,而是与 pod 通信。 pod 中的容器共享相同的网络空间,因此 pod 中的容器可以通过 'localhost' 相互通信,并且可以使用服务或直接使用 pod IP 访问 pod 本身。对于 pod 之外的进程,组成 pod 的容器是不可见的。如果应该在外部访问多个容器,则将它们暴露在不同的 pod 上。它们就像在主机上运行的进程。

标签: docker kubernetes containers


【解决方案1】:

curl 是一个命令行工具。监听端口的不是服务器,而是可以用来访问服务器的客户端工具。

此容器不包含监听端口的服务器

 - name: sidecar
   image: curlimages/curl
   command: ["/bin/sh"]
   args: ["-c", "echo Hello from the sidecar container; sleep 300"]
   ports:
   - containerPort: 5000

部署在 Kubernetes 上的服务通常是包含某种形式的网络服务器的容器,但也可能是其他类型的服务。


我至少应该能够 ping curl 容器吗?

不,容器不是虚拟机。容器通常只包含一个进程,并且容器只能执行该进程所做的事情。在 Kubernetes 上,这些进程通常是监听的网络服务器,例如在端口 8080 上,因此通常您只能通过向它们发送 HTTP 请求来检查它们是否还活着。参见例如Configure Liveness, Readiness and Startup Probes.

当我运行 telnet pod-ip 5000 时,我无法 ping 这个 curl 容器。

curl 二进制文件不是侦听任何端口的进程。例如。它无法响应ICMP。您通常可以 ping 节点,但不能 ping 容器。 Curl 是一个 http-client,通常用于 **send 和 http-request,等待 http-response 然后进程终止。通过检查 Pod,您可能会看到 curl 容器已终止。

我试图弄清楚多容器 pod 中的通信是如何处理的。每个 pod 都有自己唯一的 ip 地址,并且 pod 中的容器可以使用 localhost。我明白了,但是不同 pod 中的容器如何以多容器 pod 中的特定容器为目标?

我建议您将 两个 网络服务器(例如两个 nginx 容器)添加到一个 pod。但是他们必须监听不同的端口,例如端口 8080 和端口 8081。客户端可以通过使用 Pod IP 和容器端口 <Pod IP>:<containerPort> 来选择要与之交互的容器。例如。添加两个 nginx-container,配置它们监听不同的端口,让它们服务不同的内容。

【讨论】:

  • 首先感谢您的时间和回答。嗯……我明白了。实际上我想通了,但我至少不应该能够 ping 卷曲容器吗?当我运行 telnet pod-ip 5000 时,我无法 ping 这个 curl 容器。我试图弄清楚如何在多容器 pod 中处理通信。每个 pod 都有自己唯一的 ip 地址,并且 pod 中的容器可以使用 localhost。我明白了,但是不同 pod 中的容器如何以多容器 pod 中的特定容器为目标?
  • 我已经更新了回答问题的答案。
  • 感谢乔纳斯的彻底回答。所以简而言之,我们有责任让多容器 pod 中的容器监听不同的端口,而不同 pod 中的另一个容器想要通信的应该知道它想要与之通信的容器的端口号?这是正确的吗?
  • 其他 pod 不需要知道特定容器的端口。您通常使用协议的默认端口,例如http的端口80,并且您为每个应用程序创建一个服务,该服务可以将端口80映射到例如targetPort 8081 和其他 Pod 应该只访问服务。参见例如kubernetes.io/docs/concepts/services-networking/service
  • 现在一切都一清二楚了。非常感谢您的时间和帮助乔纳斯。亲切的问候。
猜你喜欢
  • 2018-03-15
  • 1970-01-01
  • 2022-12-20
  • 1970-01-01
  • 2017-02-20
  • 2017-08-25
  • 2021-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多