如何在 k8s 部署中将文件挂载到同一子路径?

How can I mount files in the same sub path in k8s deployment?

我现在在我的部署中定义了这些卷安装,

volumeMounts:
        - name: website-storage
          mountPath: /app/upload
          readOnly: false
          subPath: foo/upload
        - name: website-storage
          mountPath: /app/html
          readOnly: true
          subPath: foo/html/html

现在我想从我的 PVC 安装另一条路径到 /app/html/website-content,这就是我尝试的,

volumeMounts:
        - name: website-storage
          mountPath: /app/upload
          readOnly: false
          subPath: foo/upload
        - name: website-storage
          mountPath: /app/html
          readOnly: true
          subPath: foo/html/html
        - name: website-storage
          mountPath: /app/html/website-content
          readOnly: true
          subPath: foo/website-content

这不起作用,并且在安装过程中出错。是否有可能做到这一点?我必须在安装之前明确创建 website-content 文件夹吗?提前致谢!

在我看来 app/html 已经挂载并且是只读的,最好使用不同的路径,

第 2 您需要与更多 pods 共享音量吗?

您不能将一个卷装载到另一个卷中。相反,您可以将它安装到不同的位置并在容器启动期间创建指向该位置的符号链接。

问题的原因是在 pod 初始化期间尝试在 /app/html 位置创建目录 website-content 这将导致错误,因为 /app/html 是只读安装的.

您不能在只读系统中创建文件夹,这意味着您无法挂载卷,因为文件夹不存在,但如果已经创建了文件夹,则可以挂载卷。

因此,您只需在将卷附加到容器之前在卷的 foo/html/html 位置创建一个目录 website-content。然后,因为它将被安装到 /app/html 位置,所以会有目录 /app/html/website-content.

例如,您可以为此使用 init container。将此代码添加到您的部署文件中:

initContainers:
  - name: init-container
    image: busybox
    volumeMounts:
    - name: website-storage
      mountPath: /my-storage
      readOnly: false
    command: ['sh', '-c', 'mkdir -p /my-storage/foo/html/html/website-content']

当 pod 为 运行 时,您使用 kubectl describe pod {pod-name}:

检查 pod 上的挂载点
Mounts:
/app/html from website-storage (ro,path="foo/html/html")
/app/html/website-content from website-storage (ro,path="foo/website-content")
/app/upload from website-storage (rw,path="foo/upload")