最近刚好遇到多容器单Pod的数据共享需求.
随着需求做完,想着写点文章分享下.
本文只分享两个场景,共享空目录,共享非空目录
背景知识
Pod
Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元
可以在单个Pod中创建多个Container,他们之间共享上下文
Pod 的共享上下文包括一组 Linux 名字空间、控制组(cgroup)和可能一些其他的隔离方面, 即用来隔离容器的技术。 在 Pod 的上下文中,每个独立的应用可能会进一步实施隔离。
Pod 类似于共享名字空间并共享文件系统卷的一组容器。
Volume
Kubernetes 卷(Volume) 这一抽象概念用于解决Container文件存储和跨Container数据共享问题
共享空目录
这个场景比较常见,也比较好处理.
通常使用volumes中的emptyDir来处理
https://kubernetes.io/zh-cn/docs/concepts/storage/volumes/#emptydir
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: registry.k8s.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /cache
name: cache-volume
- image: registry.k8s.io/test-webserver
name: test-container1
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
test-conainer和test-conainer1的/cache目录就进行保持共享,当然你要记住,之前存在于/cache的内容将会无法看到
共享非空目录
k8s本身的设计,不允许直接挂载非空目录, 所以我们这里使用initContainer进行操作
apiVersion: apps/v1
kind: Pod
spec:
initContainers:
- image:
name:
command: [
"/bin/sh",
"-c",
"mkdir /tmp/dir;
cp -r /target/folder /tmp/dir",
]
volumeMounts:
- name: sharing
mountPath: /tmp/dir
containers:
- image:
name:
volumeMounts:
- name: sharing
mountPath: /usr/local/sharing
volumes:
- name: sharing
emptyDir: {}
在PodInitialization的过程中,首先会启动initContainer. 加载它的fs,然后在这个过程中,我们会把想要的文件拷贝到/tmp/dir中,因为/tmp/dir提前被设置成了共享目录,所以这个操作会被保留下来.