Volume是Pod中能够被多个容器共享的磁盘目录。我们知道,默认情况下Docker容器中的数据都是非持久化的,在容器消亡后数据也会消失。因此Docker提供了Volume机制以便实现数据的持久化。Kubernetes中Volume的概念与Docker中的Volume类似,但不完全相同。具体区别如下 :
- Kubernetes中的Volume与Pod的生命周期相同,但与容器的生命周期不相关。当容器终止或重启时,Volume中的数据也不会丢失。
- 当Pod被删除时,Volume才会被清理。并且数据是否丢失取决于Volume的具体类型,比如emptyDir类型的Volume数据会丢失,而PV类型的数据则不会丢失

Kubernetes提供了非常丰富的Volume类型,下面是一些常用的Volume类型
- emptyDir
- hostPath
1.emptyDir
一个emptyDir volume是在Pod分配到Node时创建的。顾名思义,它的初始内容为空,在 同一个Pod中的所有容器 均可以读写这个emptyDir volume。当 Pod 从 Node 上被删除(Pod 被删除,或者 Pod 发生迁移),emptyDir 也会被删除,并且数据永久丢失。
例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - image: hub.atshooter.com/k8s/nginx:v1.0 name: test-container volumeMounts: - mountPath: /cache #挂在到容器内部的/cache目录下 name: cache-volume #以及通过哪个volume挂载的:cache-volume volumes: - name: cache-volume emptyDir: {} |
进入运行起来的pod查看是否被创建了cache这个目录

在同一pod里运行多个容器,共同挂载同一 volume 测试是否共享
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - image: hub.atshooter.com/k8s/nginx:v1.0 name: test-container volumeMounts: - mountPath: /cache #挂在到容器内部的/cache目录下 name: cache-volume #以及通过哪个volume挂载的:cache-volume - name: test-shooter image: redis:latest volumeMounts: - mountPath: /test name: cache-volume volumes: - name: cache-volume emptyDir: {} |
容器启动后
查看test-container 与 my-redis


2. hostPath
hostpath 将宿主机目录,映射到容器中 同docker的 -v 参数差不多 (至于你宿主机上的目录挂载如何来的,不关心)
1 2 3 4 |
注意:要将本地宿主机的目录,权限设置为kubenetes的权限,这样他才可以写入 查看docker权限 ps aux|grep docker |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - image: hub.atshooter.com/k8s/nginx:v1.0 name: test-container volumeMounts: - mountPath: /cache #挂在到容器内部的/cache目录下 name: cache-volume #以及通过哪个volume挂载的:cache-volume volumes: - name: cache-volume hostPath: path: /data #宿主机目录 type: Directory #挂载类型 |
启动后进入容器内部查看catch目录,并且创建一个文件

然后去对应节点根目录下data文件夹下查看是否有此目录

当然也可以多容器共享这个目录。
- 本文固定链接: https://www.yoyoask.com/?p=2293
- 转载请注明: shooter 于 SHOOTER 发表