数据持久化的主要方式简介
pod是临时的,pod中的数据随着pod生命周期的结束也会被一起删除。
pod想实现数据持久化主要有以下几种方式:
- emptyDir:类似于docker run –v /xx,在物理机里随机产生一个目录(这个目录其实挂载的是物理机内存),然后把这个目录挂载到容器里/xx目录。当pod删除时,emptyDir对应的目录也会被删除。一般做临时存储。
- hostPath:类似于docker run –v /data:/xx,将物理机里的/data目录隐射到容器里的/xx目录,删除pod后,数据仍然保留。pod迁移数据不会跟着迁移,继续保留在原来的物理机。
- NFS网络存储
解决了hostPath存在的问题,但在pod中配置不便。 - 持久性存储
创建PV,从PV创建PVC - 动态卷供应
不需要提前创建PV,只要创建好storageClass之后就不用管PV了,用户创建PVC时,storageClass会自动创建一个pv和这个pvc绑定。
使用emptyDir做临时存储
类似于docker run –v /xx,在物理机里随机产生一个目录(这个目录其实挂载的是物理机内存),然后把这个目录挂载到容器里/xx目录。当pod删除时,emptyDir对应的目录也会被删除。一般做临时存储或两个容器之间的共享存储。
- 创建新目录
mkdir ~/volume
cd ~/volume
- 创建
emp.yaml
文件
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
volumes:
- name: volume1 ## 创建一个卷
emptyDir: {}
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: pod1
volumeMounts:
- name: volume1 ## 将创建的卷挂载
mountPath: /usr/share/nginx/html
注意:/usr/share/nginx/html目录不存在的话会自动创建
- 创建pod,查看状态
kubectl apply -f emp.yaml
kubectl get pod
- 查看该pod在哪个主机运行
kubectl get pod -o wide
- 在sun005上查看容器属性
docker ps | grep pod1
docker inspect 86711c8d7914
- 上传文件测试,可以看到实现了数据共享
kubectl cp emp.yaml pod1:/usr/share/nginx/html
kubectl exec pod1 -- ls /usr/share/nginx/html
cd /var/lib/kubelet/pods/3d5a4eb0-3201-4c83-85a5-abb1d8ae390f/volumes/kubernetes.io~empty-dir/volume1
ls
- 删除此pod,可以看到,临时目录也被删除
kubectl delete -f emp.yaml
使用hostPath做本地存储
类似于docker run –v /data:/xx,将物理机里的/data目录隐射到容器里的/xx目录,如果删除pod后,数据仍然保留。pod迁移数据不会跟着迁移,继续保留在原来的物理机。
- 创建
hostpath.yaml
文件
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
volumes:
- name: volume1 ## 创建一个hostPath的卷,名字为volume1
hostPath:
path: /var/www/html
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: pod1
volumeMounts: ## 将创建的卷挂载
- name: volume1
mountPath: /usr/share/nginx/html
- 创建pod,查看pod运行的节点
kubectl apply -f hostpath.yaml
kubectl get pod -o wide
- 在sun005上测试,可以看到数据成功共享
docker ps | grep pod1
docker inspect b7e6821a834f
kubectl cp emp.yaml pod1:/usr/share/nginx/html
kubectl cp hostpath.yaml pod1:/usr/share/nginx/html
kubectl exec pod1 -- ls /usr/share/nginx/html
ls /var/www/html
- 删除此pod,可以看到,在物理机上该目录仍然存在
kubectl delete -f emp.yaml