在 pod 中的容器之间共享非持久卷
Sharing non-persistent volume between containers in a pod
我正在尝试将两个 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 启动时,我执行到每个容器中,它们似乎仍然是孤立的,看不到彼此的文件夹
感谢任何帮助,谢谢
这是一个社区 Wiki 答案,因此请随时对其进行编辑并添加您认为重要的任何其他详细信息。
既然这个问题已经解决了,或者更确切地说是澄清了,因为实际上这里没有什么可以解决的,让我们post一个社区维基答案,因为它是部分基于关于几个不同用户的评论。
正如 Matt and David Maze 已经提到的,它按预期工作,在您的示例中,没有任何内容可以将任何内容复制到您的 emptyDir
卷:
With just the YAML you've shown, nothing ever copies anything into the
emptyDir volume, unless the images' startup knows to do that. – David
Maze Dec 28 '20 at 12:45
顾名思义,emptyDir
comes totally empty, so it's your task to pre-populate it with the desired data. It can be done with the init container by temporarily mounting your emptyDir
to a different mount point e.g. /mnt/my-epmty-dir
and copying the content of specific directory or directories already present in your container e.g. /pos
and /pos-service
as in your example and then mounting it again to the desired location. Take a look at this example 出现在我的一个较早的答案中,因为它可以用完全相同的方式完成。您的 Deployment
可能如下所示:
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
值得一提的是,这并不奇怪,因为 mount
在 Linux 或其他 nix-基于 个操作系统。
如果你有,例如/var/log/your-app
在你的主磁盘上,填充了日志,然后你安装一个新的空磁盘定义为它的安装点 /var/log/your-app
,你不会在那里看到任何内容。它不会从您的主磁盘上的原始位置删除,它只会变得不可用,因为在这个位置现在您已经安装了完全不同的卷(恰好是空的或可能有完全不同的内容)。当您卸载并再次访问您的 /var/log/your-app
时,您会看到它的原始内容。我希望一切都清楚。
我正在尝试将两个 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 启动时,我执行到每个容器中,它们似乎仍然是孤立的,看不到彼此的文件夹
感谢任何帮助,谢谢
这是一个社区 Wiki 答案,因此请随时对其进行编辑并添加您认为重要的任何其他详细信息。
既然这个问题已经解决了,或者更确切地说是澄清了,因为实际上这里没有什么可以解决的,让我们post一个社区维基答案,因为它是部分基于关于几个不同用户的评论。
正如 Matt and David Maze 已经提到的,它按预期工作,在您的示例中,没有任何内容可以将任何内容复制到您的 emptyDir
卷:
With just the YAML you've shown, nothing ever copies anything into the emptyDir volume, unless the images' startup knows to do that. – David Maze Dec 28 '20 at 12:45
顾名思义,emptyDir
comes totally empty, so it's your task to pre-populate it with the desired data. It can be done with the init container by temporarily mounting your emptyDir
to a different mount point e.g. /mnt/my-epmty-dir
and copying the content of specific directory or directories already present in your container e.g. /pos
and /pos-service
as in your example and then mounting it again to the desired location. Take a look at this example 出现在我的一个较早的答案中,因为它可以用完全相同的方式完成。您的 Deployment
可能如下所示:
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
值得一提的是,这并不奇怪,因为 mount
在 Linux 或其他 nix-基于 个操作系统。
如果你有,例如/var/log/your-app
在你的主磁盘上,填充了日志,然后你安装一个新的空磁盘定义为它的安装点 /var/log/your-app
,你不会在那里看到任何内容。它不会从您的主磁盘上的原始位置删除,它只会变得不可用,因为在这个位置现在您已经安装了完全不同的卷(恰好是空的或可能有完全不同的内容)。当您卸载并再次访问您的 /var/log/your-app
时,您会看到它的原始内容。我希望一切都清楚。