最近刚好遇到多容器单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....