3.9 共享数据卷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: busybox
    name: busybox
    imagePullPolicy: IfNotPresent
    command: ["sh", "-c", "sleep 3600"]
    volumeMounts:
    - mountPath: /files
      name: file-volume
  - image: nginx
    name: nginx
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - mountPath: /content
      name: file-volume
  volumes:
  - name: file-volume
    emptyDir: {}

通过上述资源文件创建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: busybox
    name: busybox
    imagePullPolicy: IfNotPresent
    command: ["sh", "-c", "sleep 3600"]
    volumeMounts:
    - mountPath: /hello 		#挂载到容器位置
      name: hello
  volumes:
  - name: hello
    hostPath:
      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
DirectoryhostPath指定目录必须存在,否则创建pod失败
FilehostPath指定的路径下必须存在文件
SockethostPath指定路径下必须存在UNIX套接字
CharDevicehostPath指定路径下必须存在字符设备
BlockDeviceBlockDevice hostPath指定路径下必须存在块设备
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值