同 Pod 内的容器使用共享卷通信

    你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 如果你还没有集群,你可以通过 构建一 个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

    要获知版本信息,请输入 .

    在这个练习中,你会创建一个包含两个容器的 Pod。两个容器共享一个卷用于他们之间的通信。 Pod 的配置文件如下:

    pods/two-container-pod.yaml

    在配置文件中,你可以看到 Pod 有一个共享卷,名为 shared-data

    1. echo Hello from the debian container > /pod-data/index.html

    注意,第二个容器在 nginx 服务器的根目录下写了 index.html 文件。

    创建一个包含两个容器的 Pod:

    1. kubectl apply -f https://k8s.io/examples/pods/two-container-pod.yaml

    查看 Pod 和容器的信息:

    这是输出的一部分:

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. ...
    5. name: two-containers
    6. namespace: default
    7. spec:
    8. ...
    9. containerStatuses:
    10. - containerID: docker://c1d8abd1 ...
    11. image: debian
    12. ...
    13. lastState:
    14. terminated:
    15. ...
    16. name: debian-container
    17. ...
    18. ...
    19. name: nginx-container
    20. ...
    21. state:
    22. running:
    23. ...

    你可以看到 debian 容器已经被终止了,而 nginx 服务器依然在运行。

    1. kubectl exec -it two-containers -c nginx-container -- /bin/bash

    在 shell 中,确认 nginx 还在运行。

    输出类似于这样:

    1. USER PID ... STAT START TIME COMMAND
    2. root 1 ... Ss 21:12 0:00 nginx: master process nginx -g daemon off;

    回忆一下,debian 容器在 nginx 的根目录下创建了 index.html 文件。 使用 curl 向 nginx 服务器发送一个 GET 请求:

    1. root@two-containers:/# curl localhost

    输出表示 nginx 提供了 debian 容器写的页面:

    Pod 能有多个容器的主要原因是为了支持辅助应用(helper applications),以协助主应用(primary application)。 辅助应用的典型例子是数据抽取,数据推送和代理。辅助应用和主应用经常需要相互通信。 就如这个练习所示,通信通常是通过共享文件系统完成的,或者,也通过回环网络接口 localhost 完成。 举个网络接口的例子,web 服务器带有一个协助程序用于拉取 Git 仓库的更新。