【发布时间】: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