容器和Pod是短暂的,会被频繁的销毁和创建,容器销毁时,保存在容器内部文件系统中的数据都会被清除。为了持久化保存容器中的数据,可以使用 Kubernetes Volume。
本质上 Kubernetes Volume 是一个目录,当它被mount到Pod中,pod中的所有容器都可以访问这个 Volume,k8s 支持支持多种 backend 类型,包括emptyDir,hostPath,NFS,Ceph 等等,Volume 提供了各种 backend 的抽象,容器在使用Volume读写数据时不需要关心数据到底如何存放在本地节点的文件系统中还是云硬盘上。
emptyDir
apiVersion: v1
kind: Pod
metadata:
name: producer-consumer
spec:
containers:
- image: busybox
name: producer
volumeMounts:
- mountPath: /producer_dir
name: shared-volume
args:
- /bin/sh
- -c
- echo "hello world" > /producer_dir/hello; sleep 5
- image: busybox
name: consumer
volumeMounts:
- mountPath: /consumer_dir
name: shared-volume
args:
- /bin/sh
- -c
- cat /consumer_dir/hello; sleep 5
volumes:
- name: shared-volume
emptyDir: {}
这里我们创建了一个Pod,它有两个容器,它们共享一个volume:
我们定义了一个emptyDir 类型的Volume shared-volume
producer 容器将shared-volume mount 到 /produce_dir 目录
consumer 容器将shared-volume mount 到 /consumer_dir 目录
producer 写数据,consumer 读数据。
kubectl log 显示容器 consumer 成功读到了 producer 写入的数据,验证了两个容器共享 emptyDir Volume。
emptyDir
是Host上创建的临时目录,其优点是能够方便的为Pod中的容器提供共享存储,不需要额外的配置。但是它不具备持久性,如果Pod不存在了,那么它也就不复存在。
hostPath
如果Pod被销毁了,hostPath 对应的目录还是会被保留,从这一点来看,hostPath的持久性比emptyDir强,不过一旦Host崩溃,hostPath 也就无法被访问了。
网友评论