在 Kubernetes 中,Pod 是最小的可部署单元,可包含一个或多个容器。这些容器共享相同的网络命名空间,这意味着它们可以使用 localhost 相互通信,并共享相同的 IP 地址和端口空间。
下面的示例演示了同一个 Pod 中的两个容器如何通过 localhost 进行通信。我们将创建一个简单的 Pod 定义,其中包含两个容器:一个运行 Nginx 服务器,另一个运行 busybox 容器,用于卷曲 Nginx 服务器。
[代码清单]
apiVersion: v1
kind: Pod
metadata:
name: multi-container-pod
spec:
containers:
- name: nginx-container
image: nginx
ports:
- containerPort: 80
- name: busybox-container
image: busybox
command: ['sh', '-c', 'while true; do sleep 3600; done']
[执行结果]
要验证通信,可以执行 `busybox` 容器,并对 Nginx 服务器进行 curl:`kubectl exec -it multi-container-pod -c busybox-container -- curl http://localhost`
该命令将返回默认的 Nginx 欢迎页面,确认容器共享相同的网络命名空间。
在 Pod 中,所有容器共享相同的网络命名空间,其中包括相同的 IP 地址和端口空间。这样,同一个 Pod 中的容器就可以直接通过本地主机相互通信,而无需任何额外配置。这意味着这些容器是紧密耦合的,旨在协同工作,通常构成单个应用程序或服务的一部分。Pod 中的容器还可以共享存储卷,这使它们可以轻松共享数据。然而,尽管共享网络和存储,每个容器仍在自己的隔离环境中运行,并可拥有自己独特的运行时配置。
[小知识]
Pod 是短暂的,这意味着它们不是持久的实体。如果 Pod 死了,它不会复活;相反,会创建一个具有新网络身份的新 Pod。这就是不建议依赖 Pod IP 进行通信的原因;相反,应该使用 Kubernetes 服务来提供稳定的网络端点。