【问题标题】:Kubernetes mountPropagation clarificationsKubernetes mountPropagation 说明
【发布时间】:2022-05-03 23:34:53
【问题描述】:

我有一个 docker 镜像 A,其中包含我需要与同一个 K8s pod 中的另一个容器 B 共享的文件夹。

起初我决定使用共享卷(emptyDir)并启动A作为初始化容器,将文件夹的所有内容复制到共享卷中。这很好用。

然后查看 k8s 文档,我意识到我可以在容器之间使用 mountPropagation。 因此,我将 initContainer 更改为同一个 pod 中的普通容器(侧车),并执行了我想与容器 B 共享的容器 A 文件夹的挂载。这工作正常,但我需要等待容器运行 A环形。还是不...

然后我决定回到 InitContainer 模式并做同样的事情,这意味着将 A 中的文件夹挂载到共享卷中,然后容器完成,因为它是一个 InitContainer,然后使用容器 B 中新挂载的文件夹。它有效!!!!

所以我的问题是,如果这在所有 Kubernetes 集群上都是预期的,有人可以解释一下吗?并向我解释为什么我的另一个容器仍然可以看到 A 中不再作为容器运行的已挂载文件夹?

这是一个简单的清单来演示它。

apiVersion: v1
kind: Pod
metadata:
  name: testvol
spec:
  initContainers:
    - name: busybox-init
      image: busybox
      securityContext:
        privileged: true
      command: ["/bin/sh"]
      args: ["-c", "mkdir -p /opt/connectors; echo \"bar\" > /opt/connectors/foo.txt;  mkdir -p /opt/connectors_new; mount --bind /opt/connectors /opt/connectors_new; echo connectors mount is ok"]
      volumeMounts:
        - name: connectors
          mountPath: /opt/connectors_new
          mountPropagation: Bidirectional

  containers:
    - name: busybox
      image: busybox
      command: ["/bin/sh"]
      args: ["-c", "cat /opt/connectors/foo.txt; trap : TERM INT; (while true; do sleep 1000; done) & wait"]
      volumeMounts:
        - name: connectors
          mountPath: /opt/connectors
          mountPropagation: HostToContainer
  volumes:
    - name: connectors
      emptyDir: {}

这里是重现行为的清单

【问题讨论】:

  • 你能举一个你最终工作配置的例子吗?您描述的 mount-propagation 选项看起来像是控制 Linux 挂载在卷中的工作方式,因此根本不需要它是非常不寻常的。 (如果你可以在镜像 B 的 Dockerfile 中 COPY --from=image-a,那是最好的,如果不能,你描述的 emptyDir 卷是标准方法。)
  • “这在所有 Kubernetes 集群上都是预期的”是什么意思? ?它是否可以在任何 K8s 集群中工作,例如自我管理/即服务,或者在任何版本中?可以发一下yaml文件吗?我将尝试在我的实验室环境中进行复制。
  • 我已经编辑了帖子以添加清单来重现它,我迫切需要一些解释。这肯定会节省将数据从 A 复制到共享卷的时间
  • @DavidMaze 将这些文件静态添加到 B docker 映像中确实不太灵活,因为它们具有不同的生命周期,我们希望能够在不更新 B 映像的情况下更新这些 A 映像。使用 docker 镜像作为卷使用 docker compose 非常简单,而使用 K8s 则如此复杂,尽管看起来并非如此。
  • 您显示的内容看起来像普通的emptyDir 音量设置,还有额外的mountPropagation: 选项;我不认为他们在这里有所作为。这与您的第一次尝试有何不同?

标签: docker kubernetes volumes


【解决方案1】:

这是因为您的容器在 pod 中运行。 pod 是定义卷的位置,而不是容器。因此,您正在 pod 中创建一个空目录的卷。然后你将它安装在你的 init 容器中并进行更改。这会更改 pod 上的卷。

然后,当您的 init 容器完成时,pod 级别的文件不会消失,它们仍然存在,因此您的第二个容器在从 pod 挂载相同卷时会拾取文件。

这是预期行为,根本不需要 mountPropagation 字段。 mountPropagation 字段可能对 emptyDir 卷有一些影响,但与保存文件无关:

https://kubernetes.io/docs/concepts/storage/volumes/#emptydir

Pod 中的所有容器都可以在 emptyDir 卷中读取和写入相同的文件,尽管该卷可以安装在每个容器中相同或不同的路径上。当 Pod 因任何原因从节点中移除时,emptyDir 中的数据将被永久删除。

注意:容器崩溃不会从节点中删除 Pod。 emptyDir 卷中的数据在容器崩溃时是安全的。

这里的注释没有明确说明它,但这意味着它在从 initContainer 到 Container 的转换中也是安全的。只要您的 pod 存在于节点上,您的数据就会存在于卷中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 2018-12-16
    • 1970-01-01
    • 2017-07-07
    • 2021-10-05
    相关资源
    最近更新 更多