K8s-存储_PV

K8s-存储_PV


引入:PV概念

​ PersistentVolume,是由管理员设置的存储,他是集群的一部分,就像节点就 是集群的资源的一样,PV也是集群中的资源,PV是Volume之类的插件,但具有 独立于使用PV的pod生命周期,此API对象包含存储实现的细节,即NFS,iSCSI 或特定于供应商的存储系统,灵活性极强;

PVC概念:持久卷申请,被pod所使用

​ PersistentVolumeClaim,使用户存储的请求,与pod相似,pod消耗节点资 源,pvc消耗pv资源,pod可以请求特定级别的资源(CPU和内存),声明可以请求 特定的大小和访问模式(例如,可以以读/写一次或只读多次模式挂载)

静态PV

​ 集群管理员创建一些 PV。它们带有可供群集用户使用的实际存储的细节。它们 存在于 Kubernetes API 中,可用于消费

动态PV

​ 动态PV 当管理员创建的静态 PV 都不匹配用户的 PersistentVolumeClaim 时,集群 可能会尝试动态地为 PVC 创建卷。此配置基于 StorageClasses:PVC 必须请求 [存储类],并且管理员必须创建并配置该类才能进行动态创建。声明该类为 "" 可 以有效地禁用其动态配置

​ 要启用基于存储级别的动态存储配置,集群管理员需要启用 API server 上的 DefaultStorageClass [准入控制器] 。例如,通过确保 DefaultStorageClass 位 于 API server 组件的 --admission-control 标志,使用逗号分隔的有序值列表 中,可以完成此操作

绑定

​ master 中的控制环路监视新的 PVC,寻找匹配的 PV(如果可能),并将它们 绑定在一起。如果为新的 PVC 动态调配 PV,则该环路将始终将该 PV 绑定到 PVC。否则,用户总会得到他们所请求的存储,但是容量可能超出要求的数量。 一旦 PV 和 PVC 绑定后,PersistentVolumeClaim 绑定是排他性的,不管它们是如何绑定的。 PVC 跟 PV 绑定是一对一的映射

下图可以很好的反映

存储工程师:搭建后端存储,将存储写入到看k8s中变成pv,即映射进去

业务部门:写pod,判断种类,编写对应的pvc,最后交给集群自身去匹配

​ 优点:有效解决各个部门之间的协调问题,灵活性强

​ 缺点:有可能需求匹配不到,该协调还是协调

官方解决方案:

​ 静态PV:工程师写好的

​ 动态PV:根据需求被自动创建,交给云处理,阿里云(对象存储)

​ 缺点:在云服务器上才能解决

持久化卷声明的保护

​ PVC 保护的目的是确保由 pod 正在使用的 PVC 不会从系统中移除,因为如果 被移除的话可能会导致数据丢失

​ 注意:当 pod 状态为 Pending 并且 pod 已经分配给节点或 pod 为 Running 状态时,PVC 处于活动状态

​ 当启用PVC 保护 alpha 功能时,如果用户删除了一个 pod 正在使用的 PVC, 则该 PVC 不会被立即删除。PVC 的删除将被推迟,直到 PVC 不再被任何 pod 使用

建议删除过程

​ 先 pod-->pvc-->pv-->对应的存储该保存保存改清空清空

持久化卷类型

PersistentVolume 类型以插件形式实现。Kubernetes 目前支持以下插件类型:

​ 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 VMware Photon Portworx Volumes ScaleIO Volumes StorageOS

持久卷演示代码

apiVersion: v1
kind: PersistentVolume
metadata: 
  name: pv0003
spec: 
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes: 
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: slow
  mountOptions:
    - hard
    - nfsvers=4.1
  nfs: 
    path: /tmp
    server: 172.17.0.2
# storageClassName: slow:存储类名字一般不具备任何意义

PV访问模式

​ PersistentVolume 可以以资源提供者支持的任何方式挂载到主机上。如下表 所示,供应商具有不同的功能,每个 PV 的访问模式都将被设置为该卷支持的特 定模式。例如,NFS 可以支持多个读/写客户端,但特定的 NFS PV 可能以只读方 式导出到服务器上。每个 PV 都有一套自己的用来描述特定功能的访问模式

分类:模式间不具备兼容关系,即互不兼容,100%匹配

​ RWO--ReadWriteOnce——该卷可以被单个节点以读/写模式挂载

​ ROX--ReadOnlyMany——该卷可以被多个节点以只读模式挂载

​ RWX--ReadWriteMany——该卷可以被多个节点以读/写模式挂载

注意

​ 一个卷一次只能使用一种访问模式挂载,即使它支持很多访问模式。例如, GCEPersistentDisk 可以由单个节点作为 ReadWriteOnce 模式挂载,或由多个 节点以 ReadOnlyMany 模式挂载,但不能同时挂载

类型支持的挂载模式

Volume 插件 ReadWriteOnce ReadOnlyMany ReadWriteMany
AWSElasticBlockStoreAWSElasticBlockStore - -
AzureFile
AzureDisk - -
CephFS
Cinder - -
FC -
FlexVolume -
Flocker - -
GCEPersistentDisk -
Glusterfs -因没有分布式锁的存在
HostPath - -
iSCSI --因没有分布式锁的存在
PhotonPersistentDisk - -
Quobyte
NFS
RBD -
VsphereVolume - -(当 pod 并列时 有效)
PortworxVolume -
ScaleIO -
StorageOS - -

回收策略

​ Retain(保留)——手动回收

​ Recycle(回收)——基本擦除(rm -rf /thevolume/*)--不建议使用

​ Delete(删除)——关联的存储资产(例如 AWS EBS、GCE PD、Azure Disk 和 OpenStack Cinder 卷)将被删除-----作用在动态PV上,像云服务器上的存 储,不用了删除,避免资源浪费

注:目前,只有 NFS 和 HostPath 支持回收策略。AWS EBS、GCE PD、Azure Disk 和 Cinder 卷支持删除策略,在新版本中NFS回收策略被移除了

状态,卷可以处在以下的某种状态

​ Available(可用)——一块空闲资源还没有被任何声明绑定

​ Bound(已绑定)——卷已经被声明绑定

​ Released(已释放)——声明被删除,但是资源还未被集群重新声明

​ Failed(失败)——该卷的自动回收失败

注:命令行会显示绑定到 PV 的 PVC 的名称

StatefulSet控制器

​ 匹配 Pod name ( 网络标识 ) 的模式为:$(statefulset名称)-$(序号),比如下 面的示例:web-0,web-1,web-2

​ StatefulSet 为每个 Pod 副本创建了一个 DNS 域名,这个域名的格式为: $(podname).(headless server name),也就意味着服务间是通过Pod域名来通 信而非 Pod IP,因为当Pod所在Node发生故障时, Pod 会被飘移到其它 Node 上,Pod IP 会发生变化,但是 Pod 域名不会有变化

​ StatefulSet 使用 Headless 服务来控制 Pod 的域名,这个域名的 FQDN 为: $(service name).$(namespace).svc.cluster.local,其中,“cluster.local” 指 的是集群的域名

​ 根据 volumeClaimTemplates,为每个 Pod 创建一个 pvc,pvc 的命名规则 匹配模式:(volumeClaimTemplates.name)-(pod_name),比如下面的 volumeMounts.name=www, Pod name=web-[0-2],因此创建出来的 PVC 是 www-web-0、www-web-1、www-web-2

​ 删除 Pod 不会删除其 pvc,手动删除 pvc 将自动释放 pv

StatefulSet的启停顺序

​ 有序部署:部署StatefulSet时,如果有多个Pod副本,它们会被顺序地创建 (从0到N-1)并且,在下一个Pod运行之前所有之前的Pod必须都是Running和 Ready状态。

​ 有序删除:当Pod被删除时,它们被终止的顺序是从N-1到0

​ 有序扩展:当对Pod执行扩展操作时,与部署一样,它前面的Pod必须都处于 Running和Ready状态

StatefulSet使用场景

​ 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于 PVC 来实现

​ 稳定的网络标识符(域名),即 Pod 重新调度后其 PodName 和 HostName 不 变,基于Headless Service服务实现

​ 有序部署,有序扩展,基于 init containers 来实现(initC)

​ 有序收缩

现在基于以下实验验证上诉功能

选择7-4作为nfs服务器

  • 安装NFS服务器,因集群作为NFS客户端,所以顺便一起执行以下安装命令

模拟5台服务器挂载点

启动服务

其它机器测试使用

创建目录挂载使用测试

能够正常挂载

也能正常写入文件,测试完成,退出,下载nfs挂载进行下面实验

  • 部署PV,基于以下模板在同一文件创建多个pvc(pod)
apiVersion: v1
kind: PersistentVolume
metadata: 
  name: nfspv1
spec: 
  capacity: 
    storage: 1Gi
  accessModes: 
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: REtain
  storageClassName: nfs
  nfs:
    path: /nfsdata/1
    server: 192.168.10.150
# 创建:注意每个pvc之间的区别,为下面实验验证

创建statefulSet,就必须创建无头服务Headless Service, 来控制 Pod 的域名 基于操作文档模板创建即可

因为主页内容是挂载点,所以使用了pv的内容

pv的组成

​ 由statefulset名字+pod名字+起来的顺序号,从0开始

​ 配顺序,先优先匹配最优的,再次优匹配

测试:扩容验证是否只有容量可以不同,其余是否可以运行不同(存储种类,回收策略) 将副本数量由3改为5

首先先创建web-3----验证有序部署

结论: web-3一直处于绑定状态,即不能正常绑定,

验证statefulset的稳定持久卷特性

​ 删除pod,再看是否创建,查看挂载的内容是否还在

还能正常查看,再次验证,进入容器闯进后删除pod,看新建的pod是否还有内容

结论:验证成功

验证statefulset的稳定的网络标识

​ 先进入之前volume里下载web-1的文件内容并查看

开另一终端,删除web-1pod,test-pd先删除ling.txt文件,再次下载,看是否成 功下载,文件内容是否改变

结论:域名不改,再次下载还能成功,即验证成功

测试回收

​ 将statefulset控制器删除,再删除pvc,看pv状态,测试保留性Retain

此时可看到nfspv1,nfspv2,nfspv3已经变成已释放状态Released 怎样将其变成可用,最简单方法,删除pv,重新新建pv

但此种方法较为麻烦,最简易方法如下,edit修改关键字信息 将claimRef:和所属的子选项删除即可

结论:删除后状态回到可用状态

posted @ 2022-07-25 17:50  Sunset_cloud  阅读(167)  评论(0编辑  收藏  举报