1

我正在尝试将两个 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 启动时,我执行到每个容器中,它们似乎仍然是孤立的,并且看不到彼此的文件夹

我会欣赏任何帮助,谢谢

4

1 回答 1

2

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

由于这个问题已经得到解决,或者更确切地说,实际上这里没有什么需要解决的,所以让我们发布一个社区 Wiki答案,因为它部分基于几个不同用户的评论。

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

仅使用您显示的 YAML,没有任何东西可以将任何内容复制到 emptyDir 卷中,除非图像的启动知道这样做。– 大卫迷宫 20 年 12 月 28 日 12:45

正如其名称可能暗示的那样,emptyDir它完全是空的,因此您的任务是使用所需的数据预先填充它。可以通过将您的容器临时挂载emptyDir到不同的挂载点来完成,例如并/mnt/my-epmty-dir复制容器中已经存在的特定目录或目录的内容,例如在您的示例中,然后将其再次挂载到所需的位置。看一下这个例子,它出现在我的一个较早的答案中,因为它可以以同样的方式完成。您可能如下所示:/pos/pos-serviceDeployment

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

值得一提的是,这里没有什么令人惊讶的,因为它在Linux或其他基于 nix 的操作系统上是如何mount工作的。

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

于 2021-01-30T19:14:39.850 回答