前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >kubernetes中持久化存储之PV和PVC

kubernetes中持久化存储之PV和PVC

原创
作者头像
极客运维圈
修改2020-02-10 17:09:26
2.8K0
修改2020-02-10 17:09:26
举报
文章被收录于专栏:乔边故事乔边故事

持久化存储

Kubernetes为了能更好的支持有状态应用的数据存储问题,除了基本的HostPath和EmptyDir提供的数据持久化方案之外,还提供了PV,PVC和StorageClass资源对象来对存储进行管理。

PV的全称是Persistent Volume(持久化卷),是对底层数据存储的抽象,PV由管理员创建、维护以及配置,它和底层的数据存储实现方法有关,比如Ceph,NFS,ClusterFS等,都是通过插件机制完成和共享存储对接。

PVC的全称是Persistent Volume Claim(持久化卷声明),我们可以将PV比喻为接口,里面封装了我们底层的数据存储,PVC就是调用接口实现数据存储操作,PVC消耗的是PV的资源。

StorageClass是为了满足用于对存储设备的不同需求,比如快速存储,慢速存储等,通过对StorageClass的定义,管理员就可以将存储设备定义为某种资源类型,用户根据StorageClass的描述可以非常直观的知道各种存储资源的具体特性,这样就可以根据应用特性去申请合适的资源了。

PV

前面介绍了PV的基本概念,在介绍中我们知道PV可以用很多共享存储做底层存储设备,这里用NFS作为存储设备做测试。(首先安装好NFS,具体的安装方法见4.4 存储设备安装)

PV作为存储设备,主要包括存储能力,访问模式,存储类型,回收信息等关键信息。

下面我们定义一个PV的YAML文件:

代码语言:txt
复制
apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv01
  labels:
    storage: pv
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 1Gi
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /data/k8s
    server: 172.16.1.128

参数说明:

(1)、accessMode:访问模式,有ReadWriteOnce,ReadOnlyMany,ReadWriteMany。其中:

  • ReadWriteOnce:表示具有读写权限,但是只能被一个node挂载一次
  • ReadOnlyMany:表示具有只读权限,可以被多个node多次挂载
  • ReadWriteMany:表示具有读写权限,可以被多个node多次挂载

(2)、capacity:持久卷资源和容量的描述,存储大小是唯一可设置或请求的资源。

(3)、persistentVolumeReclaimPolicy: 回收策略,也就是释放持久化卷时的策略,其有以下几种:

  • Retain:保留数据,如果要清理需要手动清理数据,默认的策略;
  • Delete:删除,将从Kubernetes中删除PV对象,以及外部基础设施中相关的存储资产,比如AWS EBS, GCE PD, Azure Disk, 或Cinder volume;
  • Recycle:回收,清楚PV中的所有数据,相当于执行rm -rf /pv-volume/*;

然后我们创建PV:

代码语言:txt
复制
# kubectl create -f pv01-daemo.yaml

然后观察其PV:

代码语言:txt
复制
[root@master volume]# kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM               STORAGECLASS   REASON   AGE
my-pv01   1Gi        RWO            Recycle          Available                                               3s

PV的状态说明:

  • Available(可用):表示可用状态,还未被任何 PVC 绑定
  • Bound(已绑定):表示 PVC 已经被 PVC 绑定
  • Released(已释放):PVC 被删除,但是资源还未被集群重新声明
  • Failed(失败): 表示该 PV 的自动回收失败

PVC

基于上节创建的PV,我们来创建PVC,创建PVC所用的类型是PersistentVolumeClaim,其apiVersion为v1,具体帮助文档可以通过kubectl explain PersistentVolumeClaim来查看。

首先我们确定PV是正常的:

代码语言:txt
复制
[root@master volume]# kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM               STORAGECLASS   REASON   AGE
my-pv01   1Gi        RWO            Recycle          Available                                               6s

我们可以看到STATUS的状态是Available,表示可用。

接下来,我们定义PVC的YAML文件,如下:

代码语言:txt
复制
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-test
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

spec参数说明:

(1)、accessModes:主要定义卷所应该拥有的访问模式

(2)、resources:主要定义卷应该拥有的最小资源

(3)、dataSource:定义如果提供者具有卷快照功能,就会创建卷,并将数据恢复到卷中,反之不创建

(4)、selector:定义绑定卷的标签查询

(5)、storageClassName:定义的storageClass的名字

(6)、volumeMode:定义卷的类型

(7)、volumeName:需要绑定的PV的名称链接

然后执行以下命令创建PVC:

代码语言:txt
复制
[root@master volume]# kubectl apply -f pvc-test.yaml 
persistentvolumeclaim/pvc-test created

然后查看PVC和PV的状态:

代码语言:txt
复制
[root@master volume]# kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   REASON   AGE
my-pv01   1Gi        RWO            Recycle          Bound    default/pvc-test                            19m                        18h
[root@master volume]# kubectl get pvc
NAME        STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-test    Bound    my-pv01   1Gi        RWO                           34s

我们从上面可以看到pvc处于Bound状态,Bound的VOLUME是my-pv01,我们再看pv的状态有Available变为Bound,其CLAIM是default/pvc-test,其中default为namespace名称。

在上面我们创建了一个PVC,其绑定了我们创建的PV,如果此时我们再创建一个PVC,结果又会如何?

我们copy以下上面的PVC文件,将其名称改一下,如下:

代码语言:txt
复制
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-test2
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

然后创建这个YAML文件,并查看其状态,如下:

代码语言:txt
复制
[root@master volume]# kubectl apply -f pvc-test2.yaml 
persistentvolumeclaim/pvc-test2 created
[root@master volume]# kubectl get pvc
NAME        STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-test    Bound     my-pv01   1Gi        RWO                           9m34s
pvc-test2   Pending                                                      4s

我们可以看到我们刚创建的pvc-test2的STATUS处于Pending状态,这是由于PVC没有找到达到其要求的PV,我们可以查看我们已有的PV,如下:

代码语言:txt
复制
[root@master volume]# kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   REASON   AGE
my-pv01   1Gi        RWO            Recycle          Bound    default/pvc-test                            31m
pv01      1Gi        RWO            Recycle          Bound    default/www-web-0                           18h
pv02      1Gi        RWO            Recycle          Bound    default/www-web-1                           18h

我们发现PV都已经用完了,就无法绑定,这是因为一个PV只能允许一个PVC绑定,这时候如果我们再创建一个PV,我们就会发现PVC的状态会变为Bound状态,如下我们创建一个新的pv,然后观察其状态:

代码语言:txt
复制
[root@master volume]# kubectl get pvc
NAME        STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-test    Bound    my-pv01   1Gi        RWO                           16m
pvc-test2   Bound    my-pv02   1Gi        RWO                           7m21s
www-web-0   Bound    pv01      1Gi        RWO                           18h
www-web-1   Bound    pv02      1Gi        RWO                           18h
[root@master volume]# kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   REASON   AGE
my-pv01   1Gi        RWO            Recycle          Bound    default/pvc-test                            36m
my-pv02   1Gi        RWO            Recycle          Bound    default/pvc-test2                           23s
pv01      1Gi        RWO            Recycle          Bound    default/www-web-0                           18h
pv02      1Gi        RWO            Recycle          Bound    default/www-web-1                           18h

当然,如果我们把PV删除了会是什么效果呢?我们做如下操作:

代码语言:txt
复制
[root@master volume]# kubectl delete -f pv02.yaml 
persistentvolume "my-pv02" deleted

删除PV,然后我们会发现其hold住了,然后我们另开一个终端查看PV和PVC的状态:

代码语言:txt
复制
[root@master ~]# kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS        CLAIM               STORAGECLASS   REASON   AGE                           42m
my-pv02   1Gi        RWO            Recycle          Terminating   default/pvc-test2                           6m37s                         18h
[root@master ~]# kubectl get pvc
NAME        STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-test2   Bound    my-pv02   1Gi        RWO                           18m

我们发现PVC依然是Bound状态,而PV已经变为Terminating了,这时候如果我们把PVC删除了,其PV也不在了,如下:

代码语言:txt
复制
[root@master volume]# kubectl delete pvc pvc-test2
persistentvolumeclaim "pvc-test2" deleted
[root@master ~]# kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   REASON   AGE
my-pv01   1Gi        RWO            Recycle          Bound    default/pvc-test                            50m
pv01      1Gi        RWO            Recycle          Bound    default/www-web-0                           18h
pv02      1Gi        RWO            Recycle          Bound    default/www-web-1                           18h

如果我们的Pod没有挂载PVC,我们先删PVC,再删PV就会一下全部删除了。

注意:

(1)、如果我们的PVC需求的容量大于PV的可用容量,绑定是不会成功的;

(2)、如果我们的PVC需求的容量小于PV的可用容量,绑定的容量是PV的可用容量;

-----------------------

公众号:乔边故事(ID:qiaobiangushi)

知乎: 乔边故事

头条号:乔边故事

只要脸皮够厚,整个世界都将被你踩在脚下。

-----------------------

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 持久化存储
  • PV
  • PVC
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com