emptyDir
emptyDir类型的存储卷创建于Pod被调度到宿主机上的时候,同一个Pod内的多个容器能读写emptyDir中的同一个文件,一旦这个Pod销毁或者漂移开该宿主机,emptyDir中的数据就会被永久删除。emptyDir类型的存储卷主要用作临时空间或者不同容器之间的数据共享。容器的crashing事件并不会导致emptyDir中的数据被删除。
emptyDir支持内存作为存储资源,emptyDir.medium设为Memory即可,但如果遇到node节点重启,emptyDir中的数据也会全部丢失。
以下演示如何在Pod中不同容器之间共享数据。
vi emptydir-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: emptydir-pod
spec:
#定义emptyDir存储卷,名称my-emptydir-vol
volumes:
- name: my-emptydir-vol
emptyDir: {}
containers:
- name: busybox-1
image: busybox:latest
command:
- "sleep"
- "3600"
#将my-emptydir-vol存储卷Mount到容器中
volumeMounts:
- name: my-emptydir-vol
#此路径为容器中目录
mountPath: /data-1
- name: busybox-2
image: busybox:latest
command:
- "sleep"
- "3600"
#将my-emptydir-vol存储卷Mount到容器中
volumeMounts:
- name: my-emptydir-vol
mountPath: /data-2
kubectl apply -f emptydir-pod.yaml
进入容器busybox-1,存在/data-1目录
kubectl exec -it emptydir-pod -c busybox-1 sh
ls
bin data-1 dev etc home proc root sys tmp usr var
在容器busybox-1向共享目录中/data-1创建一个文件
cd data-1
echo "hello world" > hello.txt
exit
容器busybox-2的共享目录中/data-2确实能够访问容器busybox-1创建的文件,注意busybox-1:/data-1 = busybox-2:/data-2
kubectl exec -it emptydir-pod -c busybox-2 sh
cat /data-2/hello.txt
hello world
exit
我们看看emptyDir存储卷在宿主机的位置。在k8s-node1节点,在Pod临时目录下存在my-emptydir-vol目录,容器创建的文件就存放在该目录中。Pod的临时目录会在Pod销毁时删除,其中my-emptydir-vol也会被附带删除。
kubectl get pod -o yaml | grep nodeName
nodeName: k8s-node1
kubectl get pod -o yaml | grep uid
uid: e70923f9-156a-4fde-98be-e77f3f65fbd9
#在k8s-node1节点
tree /var/lib/kubelet/pods/e70923f9-156a-4fde-98be-e77f3f65fbd9/
/var/lib/kubelet/pods/e70923f9-156a-4fde-98be-e77f3f65fbd9/
├── containers
│ ├── busybox-1
│ │ ├── 753e3ae2
│ │ └── 96560e76
│ └── busybox-2
│ ├── 1a8b5849
│ └── a6a696a2
├── etc-hosts
├── plugins
│ └── kubernetes.io~empty-dir
│ ├── my-emptydir-vol
│ │ └── ready
│ └── wrapped_default-token-wtqgl
│ └── ready
└── volumes
├── kubernetes.io~empty-dir
│ └── my-emptydir-vol
│ └── hello.txt
└── kubernetes.io~secret
└── default-token-wtqgl
├── ca.crt -> ..data/ca.crt
├── namespace -> ..data/namespace
└── token -> ..data/token
cat /var/lib/kubelet/pods/e70923f9-156a-4fde-98be-e77f3f65fbd9/volumes/kubernetes.io~empty-dir/my-emptydir-vol/hello.txt
hello world
删除Pod,查看Pod临时目录。发现已经没有Pod临时目录e70923f9-156a-4fde-98be-e77f3f65fbd9了。
kubectl delete -f emptydir-pod.yaml
#在k8s-node1节点
ls /var/lib/kubelet/pods/