假设有一个Nginx应用程序和一个用于采集Nginx访问日志的日志采集程序。这两个应用程序之间存在“密切协作关系”,因此将它们定义在同一个Pod中,如图3-4所示。
在这种环境下,我们会想到一个问题:日志采集程序是否可以读取到Nginx的访问日志文件呢?
你的答案可能是否定的,因为这两个容器的文件系统是隔离的。
不过,在Pod中,我们可以通过配置“Volume”(卷)轻松实现数据的共享。具体来说,当创建一个Pod时,Kubernetes首先在Pod所在节点的文件系统上创建一个空目录,然后将该目录挂载到容器的日志目录中,如图3-5所示。
图3-4 Pod中定义的多个容器
图3-5 Pod中容器之间的数据共享
通过这种方式,在Nginx容器的“/var/log/nginx”目录写入文件后,日志采集程序容器的“/var/log/nginx”目录中也可以访问和使用该文件。
接下来,运行一个Pod来验证这个结论。创建一个名为“pod-volume.yaml”的文件,内容如下:
创建Pod资源:
[root@k8s-master ~]# kubectl apply -f pod-volume.yaml
查看Pod对象:
进入“web”容器中,在挂载目录下创建一个文件:
[root@k8s-master ~]# kubectl exec -it pod-volume -c web -- bash [root@pod-volume /]# cd /var/log/nginx/ [root@pod-volume /]# touch file.log
同样,你也可以在“collect”容器的挂载目录下看到创建的文件:
[root@k8s-master ~]# kubectl exec -it pod-volume -c collect -- bash [root@pod-volume /]# ls /var/log/nginx/ access.log error.log file.log
这说明“web”和“collect”容器共享“/var/log/nginx”日志目录。
小结:通过创建一个“Pause容器”并将应用容器加入该容器的网络命名空间中,实现了网络共享。通过将“Volume”挂载到应用容器的数据目录中,实现了数据共享。实现这两种共享机制的前提是必须确保Pod中的所有容器都运行在同一节点上,这也说明了为什么Pod是最小调度单元。