在 pod 中的容器之间共享非持久卷

Sharing non-persistent volume between containers in a pod

我正在尝试将两个 nodejs 应用程序放入同一个 pod 中,因为通常它们应该位于同一台机器上,但不幸的是它们紧密耦合在一起,以至于它们中的每一个都在寻找另一个的文件夹(pos/app.js 需要/pos-service,pos-service/app.js 需要/pos)

最后,该文件夹应该包含:

/pos 
/pos-service

他们的卷不需要持久化,所以我尝试使用 emptyDir 共享他们的卷,如下所示:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pos-deployment
  labels:
    app: pos
spec:
  replicas: 1
  selector:
    matchLabels:
      app: pos
  template:
    metadata:
      labels:
        app: pos
    spec:
      volumes:
      - name: shared-data
        emptyDir: {}
      containers:
      - name: pos-service
        image: pos-service:0.0.1
        volumeMounts:
        - name: shared-data
          mountPath: /pos-service
      - name: pos
        image: pos:0.0.3
        volumeMounts:
        - name: shared-data
          mountPath: /pos

然而,当 pod 启动时,我执行到每个容器中,它们似乎仍然是孤立的,看不到彼此的文件夹

感谢任何帮助,谢谢

这是一个社区 Wiki 答案,因此请随时对其进行编辑并添加您认为重要的任何其他详细信息。

既然这个问题已经解决了,或者更确切地说是澄清了,因为实际上这里没有什么可以解决的,让我们post一个社区维基答案,因为它是部分基于关于几个不同用户的评论。

正如 Matt and David Maze 已经提到的,它按预期工作,在您的示例中,没有任何内容可以将任何内容复制到您的 emptyDir 卷:

With just the YAML you've shown, nothing ever copies anything into the emptyDir volume, unless the images' startup knows to do that. – David Maze Dec 28 '20 at 12:45

顾名思义,emptyDir comes totally empty, so it's your task to pre-populate it with the desired data. It can be done with the init container by temporarily mounting your emptyDir to a different mount point e.g. /mnt/my-epmty-dir and copying the content of specific directory or directories already present in your container e.g. /pos and /pos-service as in your example and then mounting it again to the desired location. Take a look at this example 出现在我的一个较早的答案中,因为它可以用完全相同的方式完成。您的 Deployment 可能如下所示:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pos-deployment
  labels:
    app: pos
spec:
  replicas: 1
  selector:
    matchLabels:
      app: pos
  template:
    metadata:
      labels:
        app: pos
    spec:
      volumes:
      - name: shared-data
        emptyDir: {}
      initContainers:
      - name: pre-populate-empty-dir-1
        image: pos-service:0.0.1
        command: ['sh', '-c', 'cp -a /pos-service/* /mnt/empty-dir-content/']
        volumeMounts:
         - name: shared-data
           mountPath: "/mnt/empty-dir-content/"
      - name: pre-populate-empty-dir-2
        image: pos:0.0.3
        command: ['sh', '-c', 'cp -a /pos/* /mnt/empty-dir-content/']
        volumeMounts:
         - name: shared-data
           mountPath: "/mnt/empty-dir-content/"
      containers:
      - name: pos-service
        image: pos-service:0.0.1
        volumeMounts:
        - name: shared-data
          mountPath: /pos-service
      - name: pos
        image: pos:0.0.3
        volumeMounts:
        - name: shared-data
          mountPath: /pos

值得一提的是,这并不奇怪,因为 mountLinux 或其他 nix-基于 个操作系统。

如果你有,例如/var/log/your-app 在你的主磁盘上,填充了日志,然后你安装一个新的空磁盘定义为它的安装点 /var/log/your-app,你不会在那里看到任何内容。它不会从您的主磁盘上的原始位置删除,它只会变得不可用,因为在这个位置现在您已经安装了完全不同的卷(恰好是空的或可能有完全不同的内容)。当您卸载并再次访问您的 /var/log/your-app 时,您会看到它的原始内容。我希望一切都清楚。