吾八哥博客

您现在的位置是:首页 > 云原生 > Kubernetes > 正文

Kubernetes

吾八哥学k8s(九):kubernetes里持久化存储

吾八哥2020-07-03Kubernetes2811

在容器中磁盘文件都是临时的,在容器销毁的时候磁盘文件会丢失,容器始终以最纯净的状态启动,这也是容器一个很重要的特征。但有些场景下却需要一些持久化存储的,例如:程序运行的日志、数据库文件、对象存储文件等,k8s里提供了PersistentVolume(PV)和PersistentVolumeClaim(PVC)两个资源对象来解决这个问题。

持久化存储概念

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

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

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

PV使用

PV分静态和动态两种,静态PV由管理员提前创建,动态PV无需提前创建,只需要指定PVC的StorageClass即可,这里就以一个具体的例子来学习PV的用法,PV的类型选用NFS,需要提前安装好NFS服务器。

测试创建PV的pv.yaml文件如下:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
  labels:
    pv: nfs-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: nfs
  nfs:
    path: /data/nfs
    server: 192.16.1.100

相关参数说明

  • capacity: 容量

  • accessModes: 访问模式,包括如下三种:

  • ReadWriteOnce:具有读写权限,只能被单节点读写模式挂载,命令行中可缩写为RWO

  • ReadOnlyMany:具有只读权限,可以被多个节点只读模式挂载,命令行中可缩写为ROX

  • ReadWriteMany:具有读写权限,可以被多个节点读写模式挂载,命令行中可缩写为RWX

  • persistentVolumeReclaimPolicy: 回收策略,也就是释放持久化卷时的策略,有以下几种:

  • Retain:保留,允许手动回收资源,删除PVC时PV仍存在,管理员可手动回收卷

  • Delete:删除,如果Volume插件支持,删除PVC时会同时删除PV,动态卷默认为Delete

  • Recycle:回收,清除PV中的所有数据,相当于执行rm -rf

  • storageClassName:PV的类

  • nfs:nfs服务器配置,path为nfs服务器上的目录,server为nfs服务器的地址

创建PV并查看状态

5bug-MacBook:~/codes/projects/k8s-demo$ kubectl create -f pv.yaml
persistentvolume/nfs-pv created
5bug-MacBook:~/codes/projects/k8s-demo$ kubectl get pv
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
nfs-pv   1Gi        RWX            Recycle          Available           nfs                     6s

创建PV后,PV会有如下几种状态:

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

  • Bound(已绑定):已经被PVC绑定

  • Released(已释放):PVC被删除,但是资源还未被重新使用

  • Failed(失败): 自动回收失败

删除PV

在删除PV之前,建议先删除绑定在该PV上的PVC,删除PV执行如下命令:

5bug-MacBook:~/codes/projects/k8s-demo$ kubectl delete pv nfs-pv
persistentvolume "nfs-pv" deleted

PVC使用

创建PVC使用的资源类型为PersistentVolumeClaim,主要包括存储空间、访问模式、PV选择条件和存储类别等信息的设置。

这里创建PVC的学习例子的pvc.yaml文件如下:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  storageClassName: nfs
  selector:
    matchLabels:
      pv: nfs-pv

这里的一些参数设置条件要符合PV设定的条件才能进行绑定PV,例如accessModes、storageClassName、storage、selector。

创建PVC并查看状态

5bug-MacBook:~/codes/projects/k8s-demo$ kubectl create -f pvc.yaml
persistentvolumeclaim/nfs-pvc created
5bug-MacBook:~/codes/projects/k8s-demo$ kubectl get pv
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE
nfs-pv   1Gi        RWX            Recycle          Bound    default/nfs-pvc   nfs                     13m
5bug-MacBook:~/codes/projects/k8s-demo$ kubectl get pvc
NAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nfs-pvc   Bound    nfs-pv   1Gi        RWX            nfs            10s

执行创建后PV的状态由Available变为Bound,PVC受限于namespace,只有相同namespace下的PVC才能挂载到pod内。

删除PVC

如果该pvc会pod挂载了,删除该pvc的时候pod会受影响的,删除之前请慎重,删除pvc执行如下命令:

5bug-MacBook:~/codes/projects/k8s-demo$ kubectl delete pvc nfs-pvc
persistentvolumeclaim "nfs-pvc" deleted

StorageClass

每个StorageClass都包含provisioner、parameters和reclaimPolicy这三个参数,不同的StorageClass对象支持的扩展参数是不一样的。定义一个StorageClass的例子如下:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: test
provisioner: kubernetes.io/aws-ebs
parameters:
  type: io1
  iopsPerGB: "10"
  fsType: ext4
reclaimPolicy: Retain
allowVolumeExpansion: true
mountOptions:
  - debug
volumeBindingMode: Immediate

参数说明:

  • provisioner:指定配置PV的卷的类型

  • parameters:描述卷的参数,取决于provisioner来接受不同的参数

  • reclaimPolicy:回收策略,可以是Delete、Retain,默认为Delete

  • mountOptions:指定挂载参数,取决于卷插件是否支持,设置前需要进行确认

kubernetes本身支持的动态PV创建不包括nfs,所以需要使用额外插件实现,可参考:https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client

关于StorageClass的详细说明可以参考:https://kubernetes.io/zh/docs/tasks/administer-cluster/change-default-storage-class/

使用实例

这里以在pod里挂载pvc为例来体验挂载pvc的使用:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
          - name: nfs-pvc
            mountPath: /opt
      volumes:
      - name: nfs-pvc
        persistentVolumeClaim:
          claimName: nfs-pvc

指定volumes为要挂载的PVC即可。