Kubernetes存储卷PV及PVC

K8S上可用的存储卷类型:

emptyDir

空目录,只在节点本地使用,一旦Pod被删除,则这个存储卷也会随之删除;所以,emptyDir这种存储卷不是做为持久化而设计的,可以做为临时目录,按需创建。也可以当做缓存空间来使用。emptyDir存储卷的生命周期同Pod容器。

示例:

apiVersion: v1
kind: Pod
metadata:
  name: pod-demo
  namespace: default
  labels:
    app: myapp
    tier: frontend
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    ports:
    - name: http
      containerPort: 80
    volumeMounts:  #容器挂载
    - name: html
      mountPath: /data/web/html/
  - name: busybox
    image: busybox:latest
    command: ["/bin/sh" ,"-c","sleep 3600"]
    volumeMounts:  #容器挂载
    - name: html
      mountPath: /data/
  volumes:     #定义存储
  - name: html
    emptyDir: {}

gitRepo

在Pod创建时,会自动连接至Git仓库(需要确保宿主机有git命令,它是基于宿主机来驱动的。),将Git仓库里的代码克隆至宿主机的某个目录,并把这个目录做为存储卷挂载至Pod上。实质上gitRepo是建立在emptyDir之上的。gitRepo本质上也是emptyDir

hostPath

宿主机路径,将宿主机文件系统上的路径做为存储卷挂载至Pod容器中。Pod删除后,此存储卷不会被删除,数据不会丢失。不过在跨节点调度时,必须保证每个节点主机上的相同路径有相同的数据。

示例:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-volume
  namespace: default
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html/ #Pod内容器中被挂载的目录
  volumes:
  - name: html
    hostPath:
      path: /data/nginx/v1/  #宿主机path
      type: DirectoryOrCreate

nfs

使用远端文件存储资源,将可访问的文件服务作为存储卷挂载至Pod中。

示例:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-volume-nfs
  namespace: default
spec:
  containers:
  - name: nginx-nfs
    image: nginx
    ports:
    - containerPort: 80
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html/
  volumes:
  - name: html
    nfs:
      path: /nfs/data/
      server: 172.17.1.36

pvc

PVC (Persistent Volume Claim)持久化卷请求。

PVC示意图:

存储设备由存储管理员去管理,pv由K8S集群管理员定义,pvc由K8S用户或开发者定义

使用PVC的流程:

  1. 配置存储空间 --- 由存储管理员配置存储设备(如NFS,iSCSI,Ceph RBD,Glusterfs),并且划割好了很多可被独立使用的存储空间;
  2. 定义PV --- K8S集群管理员将配置好的那些存储空间引入至K8S集群中,定义成PV (Persistent Volume,持久化卷);
  3. 定义PVC --- K8S用户在创建Pod时如果要用到PVC时,必须先创建PVC( 在K8S集群中找一个能符合条件的存储卷PV来用)。注意:PV和PVC是一一对应关系,一旦某个PV被一个PVC占用,那么这个PV就不能再被其他PVC占用,被占用的PV的状态会显示为Bound。PVC创建以后,就相当于一个存储卷,可以被多个 Pod所使用。
  4. 使用PVC --- 在Pod中去使用PVC,如果符合PVC条件的PV不存在,而这时去使用这个PVC,则Pod这时会显示Pending(挂起)状态。

接下来演示一个使用NFS做为后端存储的PVC使用示例:

1. 配置NFS共享存储:

这里用192.168.100.3做为NFS共享存储服务器。

# 安装NFS软件包
yum install nfs-utils -y
# 创建存储目录
mkdir /data/nfs/volumes/v{1,2,3,4,5} -p
# 编辑/etc/exports文件
[root@test1 ~]# vim /etc/exports
/data/nfs/volumes/v1    192.168.100.0/24(rw,no_root_squash)
/data/nfs/volumes/v2    192.168.100.0/24(rw,no_root_squash)
/data/nfs/volumes/v3    192.168.100.0/24(rw,no_root_squash)
/data/nfs/volumes/v4    192.168.100.0/24(rw,no_root_squash)
/data/nfs/volumes/v5    192.168.100.0/24(rw,no_root_squash)
# 导出共享目录
[root@test1 ~]# exportfs -arv
exporting 192.168.100.0/24:/data/nfs/volumes/v5
exporting 192.168.100.0/24:/data/nfs/volumes/v4
exporting 192.168.100.0/24:/data/nfs/volumes/v3
exporting 192.168.100.0/24:/data/nfs/volumes/v2
exporting 192.168.100.0/24:/data/nfs/volumes/v1
# 启动nfs
[root@test1 ~]# systemctl start nfs
[root@test1 ~]# showmount -e localhost
Export list for localhost:
/data/nfs/volumes/v5 192.168.100.0/24
/data/nfs/volumes/v4 192.168.100.0/24
/data/nfs/volumes/v3 192.168.100.0/24
/data/nfs/volumes/v2 192.168.100.0/24
/data/nfs/volumes/v1 192.168.100.0/24

 注意:K8S集群节点上也需要安装nfs:yum install nfs-utils -y,否则在使用nfs做为存储卷时不能正常挂载。

2. 创建PV

PV也是标准的K8S资源,但是PV是K8S集群级别的资源,而不是namespace(名称空间)级别的资源。所以在定义PV时,不需要指定namespace。这就意味着PV不限名称空间,所有名称空间都可使用。需要注意的是PVC是namespace级别的资源。

PV的访问模式(accessModes <[]string>

  • ReadWriteOnce --- 单路读写,显示简写:RWO
  • ReadOnlyMany --- 多路只读,显示简写:ROX
  • ReadWriteMany --- 多路读写,显示简写:RWX

    注意:定义PV清单文件时,访问模式不支持简写,简写仅用于显示时。

需要注意的是,有些后端存储设备是不支持多路读写的,在定义PV的访问模式时,需要确认后端存储设备支持的访问模式。PV的访问模式只能是存储设备支持的访问模式的子集。参考如下:https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes

 

capacity: 指定PV的可用存储容量,单位:M | G | T | P | E (1000换算),Mi | Gi | Ti | Pi | Ei (1024换算)

PV的回收策略(persistentVolumeReclaimPolicy <string>):
如果某个已经绑定PV的PVC被删除了,那么这个PV将被回收,回收策略有以下三种:

  • Retain --- 默认,表示保留PV中存在的数据,在PV下次被PVC绑定时,数据还存在;通常都使用这种回收策略。
  • Recycle --- 回收,表示将删除PV里面的数据,并将其状态置为空闲状态,供其他PVC去绑定;危险!
  • Delete --- 删除,表示如果PVC删除了,那么PV也随之删除,数据会被清除。危险!

编辑PV清单文件:

[root@s1 ~]# cat pv-demo.yaml 
---
apiVersion: v1
kind: PersistentVolume
metadata: 
  name: pv001
  labels:
    name: pv001
spec: 
  nfs:
    path: /data/nfs/volumes/v1
    server: 192.168.100.3
  accessModes: ['ReadWriteOnce', 'ReadWriteMany', 'ReadOnlyMany']
  capacity:
    storage: 20Gi

---
apiVersion: v1
kind: PersistentVolume
metadata: 
  name: pv002
  labels:
    name: pv002
spec: 
  nfs:
    path: /data/nfs/volumes/v2
    server: 192.168.100.3
  accessModes: ['ReadWriteOnce', 'ReadWriteMany']
  capacity:
    storage: 10Gi

---
apiVersion: v1
kind: PersistentVolume
metadata: 
  name: pv003
  labels:
    name: pv003
spec: 
  nfs:
    path: /data/nfs/volumes/v3
    server: 192.168.100.3
  accessModes: ['ReadOnlyMany']
  capacity:
    storage: 5Gi

---
apiVersion: v1
kind: PersistentVolume
metadata: 
  name: pv004
  labels:
    name: pv004
spec: 
  nfs:
    path: /data/nfs/volumes/v4
    server: 192.168.100.3
  accessModes: ['ReadOnlyMany', 'ReadWriteOnce']
  capacity:
    storage: 15Gi

---
apiVersion: v1
kind: PersistentVolume
metadata: 
  name: pv005
  labels:
    name: pv005
spec: 
  nfs:
    path: /data/nfs/volumes/v5
    server: 192.168.100.3
  accessModes: ['ReadWriteOnce', 'ReadWriteMany', 'ReadOnlyMany']
  capacity:
    storage: 10Gi

应用PV清单文件pv-demo.yaml

[root@s1 ~]# kubectl apply -f pv-demo.yaml 
persistentvolume/pv001 created
persistentvolume/pv002 created
persistentvolume/pv003 created
persistentvolume/pv004 created
persistentvolume/pv005 created

 查看生成的PV:

[root@s1 ~]# kubectl get pv  
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv001   20Gi       RWO,ROX,RWX    Retain           Available                                   52s
pv002   10Gi       RWO,RWX        Retain           Available                                   51s
pv003   5Gi        ROX            Retain           Available                                   51s
pv004   15Gi       RWO,ROX        Retain           Available                                   51s
pv005   10Gi       RWO,ROX,RWX    Retain           Available                                   51s

3. 定义PVC,并使用

accessModes <[]string>

PVC也需要定义访问模式,且PVC的访问模式必须得是PV的子集。也就是说只有符合PVC访问模式的PV,才能够与PVC进行绑定。注意:PVC必须与Pod在同一名称空间才能被Pod使用。

编辑清单文件pod-vol-pvc.yaml

[root@s1 ~]# vim pod-vol-pvc.yaml              
---
#定义PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
  namespace: default
spec:
  accessModes: ['ReadWriteMany']
  resources:
    requests:
      storage: 8Gi

---
#定义Pod
apiVersion: v1
kind: Pod
metadata:
  name: pod-vol-pvc
  namespace: default
spec:
  containers:
  - name: myapp-pvc
    image: ikubernetes/myapp:v1
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html/
  volumes:
  - name: html
    persistentVolumeClaim:
      claimName: mypvc      #使用上述定义的PVC的名称  

应用清单文件:

[root@s1 ~]# kubectl apply -f pod-vol-pvc.yaml 
persistentvolumeclaim/mypvc created
pod/pod-vol-pvc created

再来查看PV列表:

从上图可以看出,名为pv002的PV符合PVC定义的条件被绑定了。

查看PVC:

[root@s1 ~]# kubectl get pvc
NAME    STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mypvc   Bound    pv002    10Gi       RWO,RWX                       4m11s

注意:如果此时发现Pod没有正常运行,查看pod描述信息中的Events,显示Pod挂载volume pv002失败。去检查Pod调度到的那个节点主机是否安装了nfs-utils包。然后安装即可:yum install -y nfs-utils

在kubernetes 1.9+ ,只要PV被PVC绑定着,那么PV就不能被删除。

存储类(StorageClass)

使用上述PVC时,有一个弊端:当K8S用户创建要使用PVC时,必须确保K8S集群中已经存在符合PVC条件的PV,否则Pod就会处于Pending(挂起)状态。

存储类(StorageClass)就是来解决这个问题的。使用存储类时,无需事先创建好PV。而是在使用PVC时,根据PVC的条件,动态创建PV供PVC绑定。

定义存储类,可以从任意维度去给存储分类:如存储性能、存储所在区域等等。

定义好存储类以后,PVC再去申请PV时,不再直接针对PV进行绑定,而是通过存储类去动态创建符合PVC条件的PV,再进行绑定。

但是后端的存储设备必须要支持RESTful 风格的创建请求接口,才能通过存储类实现PV的动态供给。支持RESTful 有后端存储设备有Ceph,Glusterfs通过第三方接口也可以实现RESTful风格的接口。但是去部署这样的后端存储设备,也不是一件容易的事件。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值