Volume: 数据卷

kubernetes Pod中多个容器访问的共享目录。volume被定义在pod上,被这个pod的多个容器挂载到相同或不同的路径下。volume的生命周期与pod的生命周期相同,pod内的容器停止和重启时一般不会影响volume中的数据。所以一般volume被用于持久化pod产生的数据。

volume类型有多种本次介绍常用的两种:

emptyDir

emptyDir的生命周期与所属的pod相同。
pod删除时,其emptyDir中的数据也会被删除。

emptyDir类型的volume在pod分配到node上时被创建,kubernetes会在node上自动分配一个目录,因此无需指定宿主机node上对应的目录文件。

适用场合:emptyDir Volume主要用于某些应用程序无需永久保存的临时目录,多个容器的共享目录等。

示例:

1、编写yaml文件(运行两个容器)

kind: Pod
apiVersion: v1
metadata:
  name: producer-consumer
spec:
  containers:
  - name: producer
    image: busybox
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - mountPath: /producer_dir
      name: shared-volume
    args:
    - /bin/sh
    - -c
    - echo "hello world" > /producer_dir/hello.txt ; sleep 30000

  - name: consumer
    image: busybox
    imagePullPolicy: IfNotPresent
    volumeMounts:
      - mountPath: /consumer_dir
        name: shared-volume
    args:
    - /bin/sh
    - -c
    - cat /consumer_dir/hello.txt ;sleep 30000

  volumes:
  - name: shared-volume
    emptyDir: {}

2、验证:
在这里插入图片描述
在这里插入图片描述
第二个容器,可以查看到刚创建的文件,即:多个容器的共享目录
在这里插入图片描述
docker inspect e8fdb49412e0
在这里插入图片描述
查看到本地路径,有刚在容器创建的文件
在这里插入图片描述
在这里插入图片描述
删除pod
在这里插入图片描述
本地目录也被清除
在这里插入图片描述
hostPath

将主机节点的文件系统中的文件或目录挂载到集群中。

相对于emtpyDir来说,hostPath就等于运行容器是使用的命令:

docker run -v /host/path:/container/path 

除了path属性之外,用户还可以指定type:
空 空字符串(默认),挂载hostPath卷之前不会执行任何检查
DirectoryOrCreate 如果指定的位置没有目录,将创建空目录,权限755,与kubelet具有相同的所有权
Directory 指定的位置必须存在目录
FileOrCreate 如果指定的位置没有文件,将创建空文件,权限644,与kubelet具有相同的所有权
File 指定的位置必须存在文件
Socket 指定的位置必须存在Unix套接字
CharDevice 指定的位置必须存在字符设备
BlockDevice 指定的路径下必须存在块设备

//这里没有创建新的yaml文件,直接将emptyDir.yaml文件的volumes字段更改为:hostPath.

[root@node01 volume]# mkdir /data/hostPath -p

---省略部分同上---
  volumes: 
  - name: shared-volume 
    hostPath: 
      path: "/data/hostPath"
      type: Directory 

特殊存储卷

NFS卷:

为什么用它?解决单个node宕机,本机的挂载目录也随之不可用,在其他node新建pod,也没有数据的问题。

怎么用? 将目录挂载到远端一台NFS服务器,node宕机,其他节点新建的pod,也可使用数据,数据不会丢失!

在这里插入图片描述
PV与PVC:
请添加图片描述

PV(Persistent Volume) 持久化卷,是对底层的共享存储的一种抽象。PV由kubernetes管理员进行创建和配置,它与底层具体的共享存储技术有关,并通过插件完成与共享存储的对接。

PVC(Persistent Volume Claim) 是持久卷声明,是用户对于存储需求的一种声明。其实就是用户向kubernetes系统发出的一种资源需求申请。

示例:这里将NFS服务部署在master节点上,需要在master节点上提前规划好共享的目录

创建流程四步骤:创建pv - pvc - pod

1、部署NFS服务

yum install nfs-utils rpcbind -y

[root@master ~]# mkdir /nfsdata
[root@master ~]# vim /etc/exports
/nfsdata *(rw,sync,no_root_squash)

[root@master ~]# systemctl start rpcbind
[root@master ~]# systemctl enable rpcbind
[root@master ~]# systemctl start nfs-server
[root@master ~]# systemctl enable nfs-server

2、创建pv1.yaml文件

kind: PersistentVolume 
apiVersion: v1 
metadata: 
  name: pv1 
spec: 
  capacity: 
    storage: 1Gi 
  accessModes:  
    - ReadWriteOnce 
  persistentVolumeReclaimPolicy: Recycle 
  storageClassName: nfs 
  nfs:
    path: /nfsdata
    server: 172.16.0.168
    
 重要参数释义:
capacity最大容量:目前只支持存储空间大小的设置( storage=1Gi )
accessModes访问模式:底层不同的存储类型可能支持的访问模式不同
ReadWriteOnce(RWO):读写权限,但是只能被单个节点挂载
ReadOnlyMany(ROX): 只读权限,可以被多个节点挂载
ReadWriteMany(RWX):读写权限,可以被多个节点挂载
persistentVolumeReclaimPolicy持久卷回收策略:
Retain (保留) 保留数据,需要管理员手工清理数据
Recycle(回收) 清除 PV 中的数据,效果相当于执行 rm -rf /thevolume/*
Delete (删除) 与 PV 相连的后端存储完成 volume 的删除操作,当然这常见于云服务商的存储服务
storageClassName存储类别:
具有特定类别的PV只能与请求了该类别的PVC进行绑定
未设定类别的PV则只能与不请求任何类别的PVC进行绑定

使用命令生成pv:
kubectl apply -f pv1.yaml

3、创建一个PVC,向刚才的PV申请使用空间
pvc.yaml

kind: PersistentVolumeClaim 
apiVersion: v1 
metadata: 
  name: pvc1 
spec: 
  accessModes: 
    - ReadWriteOnce
  storageClassName: nfs 
  resources: 
    requests: 
      storage: 1Gi

4、创建一个Pod,来使用上述PVC

kind: Pod 
apiVersion: v1 
metadata: 
  name: pod1 
spec: 
  containers: 
  - name: pod1 
    image: busybox
    imagePullPolicy: IfNotPresent 
    args: 
    - /bin/sh 
    - -c 
    - sleep 30000 
    volumeMounts: 
    - mountPath: "/data" 
      name: mydata 
  volumes: 
  - name: mydata 
    persistentVolumeClaim: 
      claimName: pvc1 

命令执行三个yaml文件:
kubectl apply -f pod.yaml

验证:注意看status变化
在这里插入图片描述

在这里插入图片描述
在NFS服务器(即master)创建测试文件
在这里插入图片描述
进入容器(node1)查看到,刚创建的文件

在这里插入图片描述


Logo

开源、云原生的融合云平台

更多推荐