使用共享卷在同一个 Pod 中的容器之间进行通信
此页面展示了如何使用卷在同一个 Pod 中运行的两个容器之间进行通信。另请参阅如何通过 在容器之间共享进程命名空间 来允许进程进行通信。
开始之前
您需要拥有一个 Kubernetes 集群,并且 kubectl 命令行工具必须配置为与您的集群通信。建议在至少有两个节点(不充当控制平面主机)的集群上运行本教程。如果您还没有集群,可以使用 minikube 创建一个,或者可以使用以下 Kubernetes 游乐场之一
要检查版本,请输入kubectl version
。创建运行两个容器的 Pod
在本练习中,您将创建一个运行两个容器的 Pod。这两个容器共享一个卷,它们可以使用该卷进行通信。以下是 Pod 的配置文件
apiVersion: v1
kind: Pod
metadata:
name: two-containers
spec:
restartPolicy: Never
volumes:
- name: shared-data
emptyDir: {}
containers:
- name: nginx-container
image: nginx
volumeMounts:
- name: shared-data
mountPath: /usr/share/nginx/html
- name: debian-container
image: debian
volumeMounts:
- name: shared-data
mountPath: /pod-data
command: ["/bin/sh"]
args: ["-c", "echo Hello from the debian container > /pod-data/index.html"]
在配置文件中,您可以看到 Pod 具有一个名为 shared-data
的卷。
配置文件中列出的第一个容器运行一个 nginx 服务器。共享卷的挂载路径为 /usr/share/nginx/html
。第二个容器基于 debian 镜像,挂载路径为 /pod-data
。第二个容器运行以下命令,然后终止。
echo Hello from the debian container > /pod-data/index.html
请注意,第二个容器在 nginx 服务器的根目录中写入 index.html
文件。
创建 Pod 和两个容器
kubectl apply -f https://k8s.io/examples/pods/two-container-pod.yaml
查看有关 Pod 和容器的信息
kubectl get pod two-containers --output=yaml
以下是输出的一部分
apiVersion: v1
kind: Pod
metadata:
...
name: two-containers
namespace: default
...
spec:
...
containerStatuses:
- containerID: docker://c1d8abd1 ...
image: debian
...
lastState:
terminated:
...
name: debian-container
...
- containerID: docker://96c1ff2c5bb ...
image: nginx
...
name: nginx-container
...
state:
running:
...
您可以看到 debian 容器已终止,而 nginx 容器仍在运行。
获取到 nginx 容器的 shell
kubectl exec -it two-containers -c nginx-container -- /bin/bash
在您的 shell 中,验证 nginx 是否正在运行
root@two-containers:/# apt-get update
root@two-containers:/# apt-get install curl procps
root@two-containers:/# ps aux
输出类似于以下内容
USER PID ... STAT START TIME COMMAND
root 1 ... Ss 21:12 0:00 nginx: master process nginx -g daemon off;
回想一下,debian 容器在 nginx 根目录中创建了 index.html
文件。使用 curl
向 nginx 服务器发送 GET 请求
root@two-containers:/# curl localhost
输出显示 nginx 提供了由 debian 容器编写的网页
Hello from the debian container
讨论
Pod 可以拥有多个容器的主要原因是支持辅助应用程序,这些应用程序可以帮助主要应用程序。辅助应用程序的典型示例包括数据提取器、数据推送器和代理。辅助应用程序和主要应用程序通常需要相互通信。通常,这通过共享文件系统(如本练习中所示)或通过环回网络接口(localhost)来完成。这种模式的一个示例是 Web 服务器以及一个辅助程序,该程序会轮询 Git 存储库以获取新更新。
本练习中的卷提供了一种方法,使容器在 Pod 的生命周期内进行通信。如果 Pod 被删除并重新创建,则存储在共享卷中的任何数据都会丢失。
下一步
了解有关 复合容器模式 的更多信息。
了解有关 用于模块化架构的复合容器 的信息。
请参阅 配置 Pod 以使用卷进行存储。
请参阅 卷。
请参阅 Pod。