【kubernetes】持久化存储 —— PV / PVC

一,理论

概念

PersistentVolume(简称PV)是群集中的一块存储,由管理员配置或使用存储类动态配置。 它是集群中的资源。 PV是容量插件,如Volumes。
其生命周期独立于使用PV的任何单个pod。

PersistentVolumeClaim(简称PVC)是一个持久化存储卷,在创建pod时可以定义这个类型的存储卷。

它类似于一个pod。 Pod消耗节点Node资源,PVC消耗PV资源。

原理

PV是群集中的资源。 PVC是对这些资源的请求。
PV和PVC之间的相互作用遵循以下生命周期:

(1)pv的供应方式

可以通过两种方式配置PV:静态或动态。

静态的:
集群管理员创建了许多PV。它们包含可供群集用户使用的实际存储的详细信息。

动态的:
当管理员创建的静态PV都不匹配用户的PersistentVolumeClaim时,群集可能会尝试为PVC专门动态配置卷。此配置基于StorageClasses,PVC必须请求存储类,管理员必须创建并配置该类,以便进行动态配置。

(2)绑定

用户创建pvc并指定需要的资源和访问模式。在找到可用pv之前,pvc会保持未绑定状态。
pvc和pv它们是一一对应的关系,pv如果被pvc绑定了,就不能被其他pvc使用了。

(3)回收策略

当删除pod时候,pvc和pv绑定就会解除,pv卷里的数据的回收策略persistentVolumeReclaimPolicy有3种处理方式:

保留:Retain

当删除pvc时,pv仍然存在,且处于released状态,但是它不能被其他pvc再次绑定使用,里面的数据还是存在的,当我们下次再使用的时候,数据还是存在的。
此默认的回收策略

删除:Delete

当删除pvc时,即会从Kubernetes中移除PV,也会从相关的外部设施中删除存储资产

回收:Recycle (不推荐使用,1.15可能被废弃了)

(4)使用

a)准备一个存储服务器,把它划分成多个存储空间,并定义成多个pv;
b)先创建pvc,通过定义需要使用的pv的大小和对应的访问模式,找到合适的pv;
c)在定义pod时,就可以使用这个pvc的存储卷;
d)在确保有可以绑定的pv的情况下,再创建pvc。如果没有合适的pv,那么pvc就会被创建,并处于pending状态。

二,应用

本案例以nfs为存储类

1、创建nfs共享目录
# 在宿主机创建NFS需要的共享目录
mkdir /data/volume_test/v{1,2,3,4,5,6,7,8,9,10} -p


#配置nfs共享宿主机上的/data/volume_test/v1..v10目录 新增一下配置:
vim /etc/exports
/data/volume_test/v1 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v2 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v3 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v4 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v5 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v6 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v7 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v8 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v9 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v10 192.168.40.0/24(rw,no_root_squash)

#重新加载配置,使配置成效
[root@xianchaomaster1 ~]# exportfs -arv
2、编写pv的常用字段
# 看定义pv需要的字段
# kubectl explain pv

apiVersion	  <string>
kind	      <string>
metadata	  <Object>
spec	      <Object>

# 看定义pv需要的字段
# kubectl explain pv.spec

accessModes   <[]string>   
# 访问模式:ReadWriteOnce,ReadOnlyMany,ReadWriteMany,ReadWriteOncePod
persistentVolumeReclaimPolicy   <string>  # 回收模式:Retain,Delete,Recycle
capacity	  <map[string]string>  # 指定容量大小
# capacity:
#   storage: 1Gi


# 查看定义nfs类型的pv需要的字段
# kubectl explain pv.spec.nfs
path	      <string> -required-
readOnly	  <boolean>
server	      <string> -required-
3、创建pv

创建3个存储卷。

# vim pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: v1
  labels:                        # 定义pv标签
    app: v1
spec:
  nfs:
    path: /data/volume_test/v1
    server: 192.168.40.180
  accessModes: ["ReadWriteOnce"] # 定义访问模式
  capacity:                      # 定义资源大小
    storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: v2
  labels:
    app: v2
spec:
  nfs:
    path: /data/volume_test/v2
    server: 192.168.40.180
  accessModes: ["ReadOnlyMany"]
  capacity:
    storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: v3
  labels:
    app: v3
spec:
  nfs:
    path: /data/volume_test/v3
    server: 192.168.40.180
  accessModes: ["ReadWriteMany"]
  capacity:
    storage: 3Gi
kubectl apply -f pv.yaml 

persistentvolume/v1 created
persistentvolume/v2 created
persistentvolume/v3 created
kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
v1     1Gi        RWO            Retain           Available                                   108s
v2     2Gi        ROX            Retain           Available                                   108s
v3     3Gi        RWX            Retain           Available                                   108s

【注解】
RWO:readwariteonce: 单路读写,允许同一个node节点上的pod访问。
ROX: readonlymany: 多路只读,允许不通node节点的pod以只读方式访问。
RWX: readwritemany: 多路读写,允许不同的node节点的pod以读写方式访问。

4、创建pvc,绑定符合条件的pv

创建3个pvc,访问模式,标签,资源大小均有上面符合的pv,即可!

# cat pvc.yaml 


apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-v1
spec:
  accessModes: ["ReadWriteOnce"]   # 访问模式 一致
  selector:                        # 筛选pv的标签 一致
    matchLabels:
      app: v1
  resources:                       # 资源大小 一致
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-v2
spec:
  accessModes: ["ReadOnlyMany"]
  selector:
    matchLabels:
      app: v2
  resources:
    requests:
      storage: 2Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-v3
spec:
  accessModes: ["ReadWriteMany"]
  selector:
    matchLabels:
      app: v3
  resources:
    requests:
      storage: 3Gi
kubectl apply -f pvc.yaml 

persistentvolumeclaim/pvc-v1 created
persistentvolumeclaim/pvc-v2 created
persistentvolumeclaim/pvc-v3 created
kubectl get pvc
NAME     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-v1   Bound    v1       1Gi        RWO                           86s
pvc-v2   Bound    v2       2Gi        ROX                           86s
pvc-v3   Bound    v3       3Gi        RWX                           86s

【注解】
STATUS : 状态为Bound 表示与对应pv绑定成功。

5、创建pod [deployment],挂载pvc

照常创建deploy资源,仅仅是volume挂载不同。

# vim pod-pvc.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pvc-test
spec:
  replicas: 3
  selector:
    matchLabels:
      cunchu: pvc
  template: 
    metadata:
      labels:
         cunchu: pvc
    spec:
      containers:
      - name: test-pvc
        image: xianchao/nginx:v1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          protocol: TCP
        volumeMounts:                # 挂载
        - name: nginx-html           # 必须和volumes名字一致
          mountPath: /usr/share/nginx/html
      volumes:
      - persistentVolumeClaim:       # 挂载 pvc
          claimName: pvc-v1          # 指定 pvc的名称
        name: nginx-html             # volumes 名字

在这里插入图片描述

至此,新建的3个pod的目录‘/usr/share/nginx/html’ 与 宿主机的pv1 目录‘/data/volume_test/v1/’ 共享。

6、删除pvc的步骤:
  • 先删除使用pvc的pod
  • 再删除pvc,
  • pv视情况而定,删除与保留。
  • 13
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值