同一个pod中的每个容器都有独立的文件系统吗?

Dav*_*ong 7 kubernetes

尝试在 Pod 内的两个容器之间共享文件,我必须使用卷并在该卷的口路径中创建文件。

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: {}
Run Code Online (Sandbox Code Playgroud)

如果我不使用卷并在 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"]
Run Code Online (Sandbox Code Playgroud)

为什么?我认为 Pod 中的所有容器都应该共享网络和文件系统。

Arg*_*dhu 5

同一 Pod 中的容器共享网络命名空间和 IPC 命名空间,但它们具有单独的挂载命名空间和文件系统。因此,我们使用卷来共享挂载。要了解有关命名空间的更多信息,请查看 linux 命名空间文档


avi*_*jha 4

让\xe2\x80\x99s 首先解释一下 Pod 是什么。Pod 是 Kubernetes 可以部署和管理的最小单元。换句话说,如果您需要在 Kubernetes 中运行单个容器,那么您需要为该容器创建一个 Pod。同时,一个 Pod 可以包含多个容器,通常是因为这些容器耦合得比较紧密。耦合有多紧密?好吧,这样想:pod 中的容器代表在前容器世界中在同一服务器上运行的进程。

\n\n

现在,将 pod 想象为在您尝试运行容器的本地计算机中。
\n举例来说,您有两个容器 initcontainer(容器 1)和主容器(容器 2)在同一网络中运行。它们都在您的本地环境中运行。现在,如果您在一个容器中创建一个文件并期望文件存在于其他容器中,这根本不是真的。该文件存在于其自己的文件系统中的不同容器中,其他容器无法访问它。但是要在两个容器之间共享文件系统,您可以创建从本地到容器 1 的卷挂载,然后以相同的路径挂载到容器 2。这样两个容器就可以共享文件系统。

\n\n

同样的事情也适用于 kubernetes 环境中的 Pod。
\n在 Kubernetes 中,您可以使用共享 Kubernetes Volume 作为在 Pod 中的容器之间共享数据的简单而高效的方式。对于大多数情况,使用主机上与 Pod 内的所有容器共享的目录就足够了

\n