本文主要是介绍3.9 共享数据卷volume,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 一、emptyDir类型volume
- 二、hostPath类型volume
pod中每个容器都有自己独立的文件系统,文件系统来自镜像,每个容器都是通过在构建镜像时加入的详细配置文件来启动,所以在容器中添加的文件,在容器重启后又会从镜像中重新加载,导致新添加的文件会丢失。k8s提供了volume卷,用于容器之间进行共享文件,容器重启后重新加载卷中的文件数据,所以文件不会丢失。
Voume的生命周期同pod的生命周期,当pod不存在时,volume也会丢失,所以重新启动pod也会导致volume卷中的数据丢失。
volume有很多种类型,下面以最常用的emptyDir和hostPath两种类型为例。
一、emptyDir类型volume
emptyDir卷的生命周期与pod的生命周期相同,当pod被分配到节点上首先创建emptyDir卷。pod中含有多个容器时,多个容器通过pod中的pause容器共享emptyDir卷。emptyDir卷最初是空的,pod容器可以读取和写入emptyDir卷文件,emptyDir卷可以挂在到每个容器中的相同或不同路径上。当pod被从节点上删除时,emptyDir中数据将被永久删除。
下面pod中创建两个容器busybox和nginx,让两个容器通过emptyDir共享文件
emptyDir:
apiVersion: v1
kind: Pod
metadata:name: emptydir-pod
spec:containers:- image: busyboxname: busyboximagePullPolicy: IfNotPresentcommand: ["sh", "-c", "sleep 3600"]volumeMounts:- mountPath: /filesname: file-volume- image: nginxname: nginximagePullPolicy: IfNotPresentvolumeMounts:- mountPath: /contentname: file-volumevolumes:- name: file-volumeemptyDir: {}
通过上述资源文件创建pod,在nginx中的/content目录下生成一个hello.html文件,进入busybox的/files目录下可以发现共享了该文件
[root@k8s-master01 volume_work]# kubectl exec emptydir-pod -c nginx -it -- /bin/sh
# ls
bin boot content dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
# cd content
# ls
# echo "hello world" > hello.html
# ls
hello.html
[root@k8s-master01 pod_work]# kubectl exec emptydir-pod -c busybox -it -- /bin/sh
/ # ls
bin dev etc files home proc root sys tmp usr var
/ # cd files
/files # ls
hello.html
二、hostPath类型volume
hostPath卷是一种持久性存储,hostPath类型卷将主机节点的文件系统中的文件或目录挂载到集群中,在同一个节点上运行并在其中hostPath卷中使用相同路径的pod可以看到相同的文件。如果删除了一个节点上pod,并且重启的Pod也在同一个节点上,那么这个pod就可以看到已经删除的pod遗留的信息。但hostPath一个缺点就是如果pod被调度到了另一个节点上,则看到的数据不再与原来一致。
以下面hostpath.yaml为例
apiVersion: v1
kind: Pod
metadata:name: hostpath-pod
spec:containers:- image: busyboxname: busyboximagePullPolicy: IfNotPresentcommand: ["sh", "-c", "sleep 3600"]volumeMounts:- mountPath: /hello #挂载到容器位置name: hellovolumes:- name: hellohostPath:path: /root/hello #节点上位置type: DirectoryOrCreate #如果节点上不存在/root/hello目录,就创建该目录
下面创建pod,并进入容器向hostPath持久卷中写入内容
#创建pod
[root@k8s-master01 volume_work]# kubectl apply -f hostpath.yaml
pod/hostpath-pod created#查看pod被调到了kus-node01节点上
[root@k8s-master01 volume_work]# kubectl get pod hostpath-pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
hostpath-pod 1/1 Running 0 15s 10.244.1.178 k8s-node01 <none> <none>#进入pod中的容器,并进入/hello目录下写入hello.html内容
[root@k8s-master01 volume_work]# kubectl exec hostpath-pod -it -- /bin/sh
/ # cd /hello
/hello # echo "hello nginx" > hello.html
/hello # ls
hello.html
容器中已经向持久卷中写入了hello.html内容,下面进入k8s-node01节点上的/root/hello目录查看,发现宿主机节点上已经持久化了容器中写入内容。
[root@k8s-node01 ~]# cd /hello
[root@k8s-node01 hello]# ls
hello.html
在上述案例中创建pod时指定的type: DirectoryOrCreate,当节点目录不存在时就创建该目录,如果存在就用存在的目录。type还有以下选项可用
type名字 | type的值 |
---|---|
空字符串 | 创建hostPath卷之前不会做任何检查,也是默认选项 |
DirectoryOrCreate | 如果节点上不存在hostPath指定目录,则创建该目录,权限设置为0755 |
Directory | hostPath指定目录必须存在,否则创建pod失败 |
File | hostPath指定的路径下必须存在文件 |
Socket | hostPath指定路径下必须存在UNIX套接字 |
CharDevice | hostPath指定路径下必须存在字符设备 |
BlockDevice | BlockDevice hostPath指定路径下必须存在块设备 |
这篇关于3.9 共享数据卷volume的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!