ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

k8s存储持久化(nfs用例)

2021-09-13 13:35:27  阅读:148  来源: 互联网

标签:PV pvc 192.168 用例 PVC nfs volumes k8s


 

在k8s中对于存储的资源抽象了两个概念,分别是PersistentVolume(PV)、PersistentVolumeClaim(PVC)。

  • PV是集群中的资源
  • PVC是对这些资源的请求。

PV和PVC都只是抽象的概念,在k8s中是通过插件的方式提供具体的存储实现,目前包含有NFS、ceph、iSCSI和云提供商指定的存储系统。

一、认识PV/PVC/StorageClass

1、概念介绍

  管理存储是管理计算的一个明显问题。该PersistentVolume子系统为用户和管理员提供了一个API,用于抽象如何根据消费方式提供存储的详细信息。为此,我们引入了两个新的API资源:PersistentVolume和PersistentVolumeClaim

       PV :PersistentVolume(持久化卷),是对底层的共享存储的一种抽象,PV 由管理员进行创建和配置,它和具体的底层的共享存储技术的实现方式有关,比如 Ceph、GlusterFS、NFS 等,都是通过插件机制完成与共享存储的对接。

  PersistentVolumeClaim(PVC)是由用户进行存储的请求。 它类似于pod。 Pod消耗节点资源,PVC消耗PV资源。Pod可以请求特定级别的资源(CPU和内存)。声明可以请求特定的大小和访问模式(例如,可以一次读/写或多次只读)。

  虽然PersistentVolumeClaims允许用户使用抽象存储资源,但是PersistentVolumes对于不同的问题,用户通常需要具有不同属性(例如性能)。群集管理员需要能够提供各种PersistentVolumes不同的方式,而不仅仅是大小和访问模式,而不会让用户了解这些卷的实现方式。对于这些需求,有StorageClass 资源。

  StorageClass为管理员提供了一种描述他们提供的存储的“类”的方法。 不同的类可能映射到服务质量级别,或备份策略,或者由群集管理员确定的任意策略。 Kubernetes本身对于什么类别代表是不言而喻的。 这个概念有时在其他存储系统中称为“配置文件”。

       PV是运维人员来创建的,开发操作PVC,可是大规模集群中可能会有很多PV,如果这些PV都需要运维手动来处理这也是一件很繁琐的事情,所以就有了动态供给概念,也就是Dynamic Provisioning,动态供给的关键就是StorageClass,它的作用就是创建PV模板。创建StorageClass里面需要定义PV属性比如存储类型、大小等;另外创建这种PV需要用到存储插件。最终效果是,用户提交PVC,里面指定存储类型,如果符合我们定义的StorageClass,则会为其自动创建PV并进行绑定。

  PVC和PV是一一对应的。

PV和PVC中的spec关键字段要匹配,比如存储(storage)大小。

PV和PVC中的storageClassName字段必须一致。

2、生命周期

  PV是群集中的资源。PVC是对这些资源的请求,并且还充当对资源的检查。PV和PVC之间的相互作用遵循以下生命周期:

Provisioning ——-> Binding ——–>Using——>Releasing——>Recycling

  •  供应准备Provisioning---通过集群外的存储系统或者云平台来提供存储持久化支持。
    •  - 静态提供Static:集群管理员创建多个PV。 它们携带可供集群用户使用的真实存储的详细信息。 它们存在于Kubernetes API中,可用于消费
    •  - 动态提供Dynamic:当管理员创建的静态PV都不匹配用户的PersistentVolumeClaim时,集群可能会尝试为PVC动态配置卷。 此配置基于StorageClasses:PVC必须请求一个类,并且管理员必须已创建并配置该类才能进行动态配置。 要求该类的声明有效地为自己禁用动态配置。
  •  绑定Binding---用户创建pvc并指定需要的资源和访问模式。在找到可用pv之前,pvc会保持未绑定状态。
  •  使用Using---用户可在pod中像volume一样使用pvc。
  •  释放Releasing---用户删除pvc来回收存储资源,pv将变成“released”状态。由于还保留着之前的数据,这些数据需要根据不同的策略来处理,否则这些存储资源无法被其他pvc使用。
  •  回收Recycling---pv可以设置三种回收策略:保留(Retain),回收(Recycle)和删除(Delete)。
    •  - 保留策略:允许人工处理保留的数据。
    •  - 删除策略:将删除pv和外部关联的存储资源,需要插件支持。
    •  - 回收策略:将执行清除操作,之后可以被新的pvc使用,需要插件支持。

 注:目前只有NFS和HostPath类型卷支持回收策略,AWS EBS,GCE PD,Azure Disk和Cinder支持删除(Delete)策略。

 

3、PV类型

  •  GCEPersistentDisk
  •  AWSElasticBlockStore
  •  AzureFile
  •  AzureDisk
  •  FC (Fibre Channel)
  •  Flexvolume
  •  Flocker
  •  NFS
  •  iSCSI
  •  RBD (Ceph Block Device)
  •  CephFS
  •  Cinder (OpenStack block storage)
  •  Glusterfs
  •  VsphereVolume
  •  Quobyte Volumes
  •  HostPath (Single node testing only – local storage is not supported in any way and WILL NOT WORK in a multi-node cluster)
  •  Portworx Volumes
  •  ScaleIO Volumes
  •  StorageOS

4、PV卷阶段状态

  •  Available – 资源尚未被claim使用
  •  Bound – 卷已经被绑定到claim了
  •  Released – claim被删除,卷处于释放状态,但未被集群回收。
  •  Failed – 卷自动回收失败

二、创建PV演示

1、准备nfs服务数据

1、准备nfs服务

  在nfs服务器上先建立存储卷对应的目录

# mkdir -p  /k8s_volumes/v{1,2,3,4,5}
# ls /k8s_volumes/
v1  v2  v3  v4  v5
# cd /k8s_volumes/
# echo "<h1>NFS stor 01</h1>" > v1/index.html
# echo "<h1>NFS stor 02</h1>" > v2/index.html
# echo "<h1>NFS stor 03</h1>" > v3/index.html 
# echo "<h1>NFS stor 04</h1>" > v4/index.html 
# echo "<h1>NFS stor 05</h1>" > v5/index.html 

修改nfs的配置:

# vim /etc/exports
/k8s_volumes/v1   192.168.0.*(rw,async,no_root_squash)
/k8s_volumes/v2   192.168.0.*(rw,async,no_root_squash)
/k8s_volumes/v3   192.168.0.*(rw,async,no_root_squash)
/k8s_volumes/v4   192.168.0.*(rw,async,no_root_squash)
/k8s_volumes/v5   192.168.0.*(rw,async,no_root_squash)

查看NFS配置:

# exportfs -arv
exporting 192.168.0.*:/k8s_volumes/v5
exporting 192.168.0.*:/k8s_volumes/v4
exporting 192.168.0.*:/k8s_volumes/v3
exporting 192.168.0.*:/k8s_volumes/v2
exporting 192.168.0.*:/k8s_volumes/v1

配置生效:

# showmount -e
Export list for localhost:
/k8s_volumes/v5 192.168.0.*
/k8s_volumes/v4 192.168.0.*
/k8s_volumes/v3 192.168.0.*
/k8s_volumes/v2 192.168.0.*
/k8s_volumes/v1 192.168.0.*

2、在master上创建PV

  编写yaml文件,并创建pv。创建5个pv,存储大小各不相同,是否可读也不相同:pv-demo.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv001
  labels:
    name: pv001
spec:
  nfs:
    path: /k8s_volumes/v1
    server: 192.168.0.3
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  persistentVolumeReclaimPolicy: Recycle
  capacity:
    storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv002
  labels:
    name: pv002
spec:
  nfs:
    path: /k8s_volumes/v2
    server: 192.168.0.3
  accessModes: ["ReadWriteOnce"]
  persistentVolumeReclaimPolicy: Recycle
  capacity:
    storage: 5Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv003
  labels:
    name: pv003
spec:
  nfs:
    path: /k8s_volumes/v3
    server: 192.168.0.3
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  persistentVolumeReclaimPolicy: Recycle
  capacity:
    storage: 20Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv004
  labels:
    name: pv004
spec:
  nfs:
    path: /k8s_volumes/v4
    server: 192.168.0.3
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  persistentVolumeReclaimPolicy: Recycle
  capacity:
    storage: 10Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv005
  labels:
    name: pv005
spec:
  nfs:
    path: /k8s_volumes/v5
    server: 192.168.0.3
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  persistentVolumeReclaimPolicy: Recycle
  capacity:
    storage: 15Gi

注:accessModes:支持三种类型:

ReadWriteMany 多路读写,卷能被集群多个节点挂载并读写

ReadWriteOnce 单路读写,卷只能被单一集群节点挂载读写

ReadOnlyMany 多路只读,卷能被多个集群节点挂载且只能读

nfs,它支持全部三种。但是ISCI就不支持ReadWriteMany;HostPath就不支持ReadOnlyMany和ReadWriteMany

创建PV:

# kubectl apply -f pv-demo.yaml
# kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv001   2Gi        RWO,RWX        Recycle          Available                                   45s
pv002   5Gi        RWO            Recycle          Available                                   45s
pv003   20Gi       RWO,RWX        Recycle          Available                                   45s
pv004   10Gi       RWO,RWX        Recycle          Available                                   45s
pv005   15Gi       RWO,RWX        Recycle          Available                                   45s

3、创建PVC,绑定PV

  编写yaml文件,并创建pvc。创建一个pvc,需要6G存储;所以不会匹配pv001、pv002、pv003,vol-pvc-demo.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
  namespace: default
spec:
  accessModes: ["ReadWriteMany"]
  resources:
    requests:
      storage: 10Gi

创建PVC:

# kubectl apply -f vol-pvc-demo.yaml 
查询验证:pvc已经绑定到pv004上 # kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE mypvc Bound pv004 10Gi RWO,RWX 13s # kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv001 2Gi RWO,RWX Recycle Available 21m pv002 5Gi RWO Recycle Available 21m pv003 20Gi RWO,RWX Recycle Available 21m pv004 10Gi RWO,RWX Recycle Bound default/mypvc 21m pv005 15Gi RWO,RWX Recycle Available 21m

4、pod应用:使用PVC挂载

pod-pvc-demo.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: vol-pvc
  namespace: default
spec:
  volumes:
  - name: html
    persistentVolumeClaim:
      claimName: mypvc
  containers:
  - name: myapp
    image: nginx
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html/

创建:

注意:k8s 该pod所在NODE节点服务器需要安装nfs-utils,否则挂载会报错,POD无法运行。建议每台节点都安装

# yum install nfs-utils -y

# kubectl apply -f pod-pvc-demo.yaml 
# kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
nginx-6799fc88d8-twjgm   1/1     Running   0          21h   10.244.3.33   k8snode02   <none>           <none>
producer-consumer        2/2     Running   0          20h   10.244.2.2    k8snode01   <none>           <none>
test-pod                 1/1     Running   0          12h   10.244.3.36   k8snode02   <none>           <none>
vol-pvc                  1/1     Running   0          12m   10.244.3.37   k8snode02   <none>           <none>

查询业务验证:

# kubectl exec -it vol-pvc -- df -h
Filesystem                   Size  Used Avail Use% Mounted on
overlay                       36G  3.4G   32G  10% /
tmpfs                         64M     0   64M   0% /dev
tmpfs                        2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/mapper/centos-root       36G  3.4G   32G  10% /etc/hosts
shm                           64M     0   64M   0% /dev/shm
192.168.0.3:/k8s_volumes/v4  3.6T  1.9T  1.6T  55% /usr/share/nginx/html
tmpfs                        2.0G   12K  2.0G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                        2.0G     0  2.0G   0% /proc/acpi
tmpfs                        2.0G     0  2.0G   0% /proc/scsi
tmpfs                        2.0G     0  2.0G   0% /sys/firmware


# kubectl exec -it vol-pvc -- curl 127.0.0.1
<h1>NFS stor 04</h1>

 

 

 

 

 

https://www.cnblogs.com/zjz20/p/12807286.html

https://blog.csdn.net/qq_25611295/article/details/86065053

https://www.cnblogs.com/chenqionghe/p/11609008.html

 

 

 

 

标签:PV,pvc,192.168,用例,PVC,nfs,volumes,k8s
来源: https://www.cnblogs.com/wxwgk/p/15228133.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有