跳到主要内容

22、Kubernetes - 实战:数据存储 PV 和 PVC

一、环境安装

参考

MiniKube方式部署

KubeAdm方式部署

Kind方式部署

二、PV 和 PVC介绍

PV(Persistent Volume)

持久化卷,是对底层的共享存储的一种抽象。一般情况下PVKubernetes管理员进行创建和配置,它与底层具体的共享存储技术有关,并通过插件完成与共享存储的对接。

PVC(Persistent Volume Claim)

持久化卷声明,是用户对于存储需求的一种声明。换句话说,PVC其实就是用户向Kubernetes系统发出的一种资源需求申请。

特点:

屏蔽底层存储实现的细节,方便用户使用。

使用了PVPVC之后,工作可以得到进一步的细分:

  • 存储:存储工程师维护
  • PV:Kubernetes管理员维护
  • PVC:Kubernetes用户维护

三、PV 和 PVC使用

yml 配置

PV

apiVersion: v1  
kind: PersistentVolume
metadata:
  name: pv1
spec:
  nfs: 存储类型,与底层真正存储对应
  capacity:  存储能力,目前只支持存储空间的设置
    storage: 2Gi
  accessModes:  访问模式
  storageClassName: 存储类别
  persistentVolumeReclaimPolicy: 回收策略

PV的关键配置参数说明:

  • 存储类型:底层实际存储的类型,Kubernetes支持多种存储类型,每种存储类型的配置都有所差异

  • 存储能力(capacity):目前只支持存储空间的设置(storage=1Gi),不过未来可能会加入IOPS、吞吐量等指标的配置

  • 访问模式(accessModes):用于描述用户应用对存储资源的访问权限,访问权限包括下面几种方式:

  • ReadWriteOnceRWO):读写权限,但是只能被单个节点挂载

  • ReadOnlyManyROX):只读权限,可以被多个节点挂载

  • ReadWriteManyRWX):读写权限,可以被多个节点挂载

  • 需要注意的是,底层不同的存储类型可能支持的访问模式不同

  • 回收策略(persistentVolumeReclaimPolicy):当PV不再被使用了之后,对其的处理方式。目前支持三种策略:

  • Retain(保留):保留数据,需要管理员手工清理数据

  • Recycle(回收):清除PV中的数据,效果相当于执行rm -rf /thevolume/*

  • Delete(删除):与PV相连的后端存储完成Volume的删除操作,当然这常见于云服务商的存储服务

  • 需要注意的是,底层不同的存储类型可能支持的回收策略不同

  • 存储类别:PV可以通过storageClassName参数指定一个存储类别

  • 具有特定类别的PV只能与请求了该类别的PVC进行绑定

  • 未设定类别的PV则只能与不请求任何类别的PVC进行绑定

  • 状态(status):一个PV的生命周期中,可能会处于4中不同的阶段:

  • Available(可用):表示可用状态,还未被任何PVC绑定

  • Bound(已绑定):表示PV已经被PVC绑定

  • Released(已释放):表示PVC被删除,但是资源还未被集群重新声明

  • Failed(失败):表示该PV的自动回收失败

PVC

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc
  namespace: dev
spec:
  accessModes: 访问模式
  selector: 采用标签对PV选择
  storageClassName: 存储类别
  resources: 请求空间
    requests:
      storage: 5Gi

PVC的关键配置参数说明:

  • 访问模式(accessModes):用于描述用户应用对存储资源的访问权限
  • 选择条件(selector):通过Label Selector的设置,可使PVC对于系统中己存在的PV进行筛选
  • 存储类别(storageClassName):PVC在定义时可以设定需要的后端存储的类别,只有设置了该class的PV才能被系统选出
  • 资源请求(resources):描述对存储资源的请求

1 NFS准备工作

1)创建NFS共享目录

mkdir -pv /root/data/{pv1,pv2,pv3}

2)vim /etc/exports

/root/data/pv1     172.30.1.0/24(rw,no_root_squash)
/root/data/pv2     172.30.1.0/24(rw,no_root_squash)
/root/data/pv3     172.30.1.0/24(rw,no_root_squash)

2 创建PV

vimpv.yml

apiVersion: v1
kind: PersistentVolume
metadata:
  name:  pv1
spec:
  capacity: 
    storage: 1Gi
  accessModes:
  - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /root/data/pv1
    server: 172.30.1.100

---

apiVersion: v1
kind: PersistentVolume
metadata:
  name:  pv2
spec:
  capacity: 
    storage: 2Gi
  accessModes:
  - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /root/data/pv2
    server: 172.30.1.100

---

apiVersion: v1
kind: PersistentVolume
metadata:
  name:  pv3
spec:
  capacity: 
    storage: 3Gi
  accessModes:
  - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /root/data/pv3
    server: 172.30.1.100

创建pv

kubectl create -f pv.yml

 

3 创建PVC

vimpvc.yml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc1
  namespace: dev
spec:
  accessModes: 
  - ReadWriteMany
  resources:
    requests:
      storage: 1Gi

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc2
  namespace: dev
spec:
  accessModes: 
  - ReadWriteMany
  resources:
    requests:
      storage: 1Gi

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc3
  namespace: dev
spec:
  accessModes: 
  - ReadWriteMany
  resources:
    requests:
      storage: 1Gi

创建PVC

kubectl create -f pvc.yml 

 

4 创建Pod

Pod yml

vimpod-pvc.yml

apiVersion: v1
kind: Pod
metadata:
  name: pod1
  namespace: dev
spec:
  containers:
  - name: busybox
    image: busybox:1.30
    command: ["/bin/sh","-c","while true;do echo pod1 >> /root/out.txt; sleep 10; done;"]
    volumeMounts:
    - name: volume
      mountPath: /root/
  volumes:
    - name: volume
      persistentVolumeClaim:
        claimName: pvc1
        readOnly: false
---
apiVersion: v1
kind: Pod
metadata:
  name: pod2
  namespace: dev
spec:
  containers:
  - name: busybox
    image: busybox:1.30
    command: ["/bin/sh","-c","while true;do echo pod2 >> /root/out.txt; sleep 10; done;"]
    volumeMounts:
    - name: volume
      mountPath: /root/
  volumes:
    - name: volume
      persistentVolumeClaim:
        claimName: pvc2
        readOnly: false 
kubectl create -f  pod-pvc.yml

 

5 查看PV

PV是全局资源,所以不用指定namespace

kubectl get pv -o wide

 

6 查看PVC

kubectl get pvc -n dev -o wide

 

7 查看 Pod

kubectl get pods -n dev -o wide