我有一个码头形象A,其中包含一个文件夹,我需要与另一个容器B共享在同一个K8s吊舱。
起初,我决定使用共享卷(emptyDir),并启动A作为init容器,将文件夹的所有内容复制到共享卷中。这个很好用。
然后看着k8s文档,我意识到我可以在容器之间使用mountPropagation。因此,我将initContainer更改为同一个容器中的一个普通容器(侧车),并执行了容器A文件夹的挂载操作。我想要与容器B共享该文件夹。这很好,但我需要保持容器运行A与等待循环同步。或者不是..。
然后,我决定回到InitContainer模式并执行同样的操作,这意味着在共享卷中装入A中的文件夹,然后容器完成,因为它是一个InitContainer,然后使用容器B中新挂载的文件夹,它工作了!
所以我的问题是,能不能有人解释一下,如果这是所有库伯奈特星系团的预期?并向我解释为什么我的另一个容器仍然可以看到来自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: {}在这里,再现行为的清单
发布于 2022-05-03 15:34:53
这是因为你的容器在一个容器中运行。容器是定义卷的地方,而不是容器。因此,您正在您的荚中创建一个卷,它是一个空目录。然后,您将其安装在init容器中并进行更改。这就改变了吊舱上的音量。
然后,当init容器完成时,pod级别的文件不会消失,它们仍然存在,所以当第二个容器从容器中安装相同的卷时,第二个容器就会拾取文件。
这是预期的行为,根本不需要mountPropagation字段。mountPropagation字段可能对emptyDir卷有一定影响,但与保存文件无关:
https://kubernetes.io/docs/concepts/storage/volumes/#emptydir
Pod中的所有容器都可以在emptyDir卷中读取和写入相同的文件,尽管该卷可以安装在每个容器中相同或不同的路径上。当Pod因任何原因从节点中删除时,emptyDir中的数据将被永久删除。 注意:容器崩溃不会从节点中移除Pod。emptyDir卷中的数据在容器崩溃期间是安全的。
这里的注释没有显式地声明它,但这意味着它在initContainer到容器转换之间也是安全的。只要您的吊舱存在于节点上,您的数据就会在卷中。
https://stackoverflow.com/questions/63279759
复制相似问题