【发布时间】: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