尝试在Pod中的两个容器之间共享文件,我必须使用volume并在此路径的入口路径中创建文件。
apiVersion: v1
kind: Pod
metadata:
name: pod-5
spec:
containers:
- name: busybox
image: busybox
command: ["sh", "-c", "if [ -f /workdir/foo ]; then sleep 3600; else exit; fi"]
volumeMounts:
- name: workdir
mountPath: "/workdir"
initContainers:
- name: install
image: busybox
command: ["sh", "-c", "touch /workdir/foo; hostname > /workdir/foo"]
volumeMounts:
- name: workdir
mountPath: "/workdir"
volumes:
- name: workdir
emptyDir: {}
如果我不使用volume并在init容器中创建一个文件并尝试从另一个容器中读取它,它将无法正常工作。
apiVersion: v1
kind: Pod
metadata:
name: pod-5
spec:
containers:
- name: busybox
image: busybox
command: ["sh", "-c", "if [ -f /workdir/foo ]; then sleep 3600; else exit; fi"]
initContainers:
- name: install
image: busybox
command: ["sh", "-c", "touch /workdir/foo; hostname > /workdir/foo"]
为什么?我以为Pod中的所有容器都应该共享网络和文件系统。
答案 0 :(得分:2)
让我们首先解释Pod到底是什么。 Pod是Kubernetes可以部署和管理的最小单元。换句话说,如果您需要在Kubernetes中运行单个容器,则需要为该容器创建一个Pod。同时,一个Pod可以包含多个容器,通常是因为这些容器相对紧密地耦合在一起。如何紧密耦合?好吧,这样想吧:容器中的容器代表了在容器前世界中在同一服务器上运行的进程。
现在将pod视为要在其上运行容器的本地计算机中。
假设您有两个容器initcontainer(容器1)和主容器(容器2)在同一网络中运行,它们都在本地环境中运行。现在,如果您在一个容器中创建一个文件并期望该文件出现在另一个容器中那根本不是事实。文件存在于其自己的文件系统中的另一个容器中,其他容器无法访问它。但是要在两个容器之间共享文件系统,您可以创建将卷从本地安装到容器1,然后将相同路径安装到容器2。这样,两个容器都可以共享文件系统。
同样的事情也适用于kubernetes环境中的Pod。
在Kubernetes中,您可以使用共享的Kubernetes卷作为在Pod中的容器之间共享数据的简单有效的方法。在大多数情况下,使用主机上与Pod中所有容器共享的目录就足够了
答案 1 :(得分:2)
同一容器中的容器共享网络名称空间和IPC名称空间,但是它们具有独立的安装名称空间和文件系统。因此,我们使用卷来共享安装。要了解有关名称空间的更多信息,请检查linux名称空间doc。