首页 > 其他分享 >11、NFS-CSI网络存储、SC提供动态制备模板 PV和PVC动态制备

11、NFS-CSI网络存储、SC提供动态制备模板 PV和PVC动态制备

时间:2023-03-11 18:33:02浏览次数:64  
标签:11 PV 制备 demo PVC pvc nfs 动态 root

PV和PVC

在Pod级别定义存储卷有两个弊端
◼ 卷对象的生命周期无法独立于Pod而存在
◼ 用户必须要足够熟悉可用的存储及其详情才能在Pod上配置和使用卷
PV和PVC可用于降低这种耦合关系
◼ PV(Persistent Volume:持久卷)是集群级别的资源,负责将存储空间引入到集群中,通常由管理员定义,支持声明式创建,不能够被pod直接使用
◼ PVC(Persistent Volume Claim:持久卷请求)支持声明式创建,是名称空间级别的资源,由用户定义,用于在空闲的PV中申请使用符合过滤条件的PV之一,与选定的PV是“一对一”的关系
◼ 用户在Pod上通过pvc插件请求绑定使用定义好的PVC资源

IN-Tree的卷类型插件
persistenVolumeClaim:
claimName:<PVC_NAME>
PV如何满足PVC期望(动静态制备)
1、管理员事先创建多种规格的PV  #空间、接口、访问逻辑 (不推荐)  
2、管理流程,提交工单 #(不推荐)
前两种提前准备好PV的,叫做静态制备(Static Provisioning)。


3、管理员不去创建PV,取而代之,创建StorageClass(PV模板)
管理员创建SC资源对象:配置了远程存储服务管理接口的API调用操作
远程存储是nfs或coph,nfs支持远程管理,必要时用到PV,用户向模板请求说,我要创建个PVC,我需要多大空间,把这个请求创建提交个SC(PV模板),SC自己对接到远程存储服务器上,通过它的管理接口临时按需精准创建所需要的空间,动态的创建成PV,并于PVC建立管理关系,这种机制称为PV的动态制备(Dynamic Provisioning)

并非所有的卷类型都能作为PV或PVC来使用的:如本地卷hostPath,可以使用local(麻烦,一般不用)
nfs可以定义成PV,然后在pod上使用PVC来引用它,但nfs这个pv不支持动态制备,得手动去创建它
PV资源
PV是标准的资源类型,除了负责关联至后端存储系统外,它通常还需要定义支持的存储特性
◆Volume Mode:当前PV卷提供的存储空间模型,分为块设备和文件系统两种
◆StorageClassName:当前PV隶属的存储类;
◆AccessMode:支持的访问模型,分为单路读写、多路读写和多路只读
◆Size:当前PV允许使用的空间上限
在对象元数据上,还能够根据需要定义标签
在PVC删除时,一般需要定义PV回收策略:Retain、Recycle和Delete
Retain:原封不动保存(生产中建议使用)
Recycle:清除原有的PVC相关数据,相当于回收再利用(已废弃)
Delete:删除PVC,自动删除PV
PVC资源
PVC也是标准的资源类型,它允许用户按需指定期望的存储特性,并以之为条件,按特定的条件顺序进行PV过滤
VolumeMode → LabelSelector → StorageClassName → AccessMode → Size
前三个需要精准匹配,后两个只要容纳就可以
支持动态预配的存储类,还可以根据PVC的条件按需完成PV创建
PV和PVC可以属于同一个存储类,但PVC只能在同一个存储类中找PV
PV和PVC也可以不属于任何一个存储类,但PVC也只能在不属于任何存储类的PV中去找
使用静态PV和PVC的配置卷的步骤


基于NFS的静态PV和PVC示例
NFS PV 资源定义示例
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs-demo
spec:
capacity: #存储空间
storage: 5Gi #最大允许使用存储空间5G
volumeMode: Filesystem #Filesystem或Block或块设备
accessModes: #访问模式
- ReadWriteMany #多路读写ReadWriteMany 单路读写ReadWriteOnce 多路只读ReadOnlyM
persistentVolumeReclaimPolicy: Retain #卷回收策略
mountOptions: #对应远端存储服务的要求 nfs挂载选项
- hard
- nfsvers=4.1
nfs:
path: "/data/redis" #远端服务器路径
server: nfs.magedu.com #远端服务器地址
PVC 资源定义示例
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-demo
namespace: default
spec: #期望,绑定PV,PV要满足什么要求
accessModes: ["ReadWriteMany"] #访问模式支持多路读写
volumeMode: Filesystem #卷模型时文件系统
resources: #期望存库空间
requests:
storage: 3Gi #期待最小3G
limits:
storage: 10Gi #期待最大10G,需满足这个范围
在Pod上使用PVC卷
apiVersion: v1
kind: Pod
metadata:
name: volumes-pvc-demo
namespace: default
spec:
containers:
- name: redis
image: redis:alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 6379
name: redisport
volumeMounts:
- mountPath: /data
name: redis-rbd-vol
volumes:
- name: redis-rbd-vol #给卷定义名字
persistentVolumeClaim: #使用卷插件类型
claimName: pvc-demo #卷插件类型pvc-demo
查看四种访问模式文档定义:
[root@K8s-master01 ~]#kubectl explain pv.spec
FIELDS:
accessModes
https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes
单路读写:ReadWriteOnce #简写模式 RWO
多路只读:ReadOnlyMany #简写模式 ROX
多路读写:ReadWriteMany #简写模式 RWX
单个pod单路读写:ReadWriteOncePod #简写模式 RWOP

支持多路读写,其他的模式是可以兼容进来的
范例一
第一步:
定义PV
[root@K8s-master01 chapter5]#cat pv-nfs-demo.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs-demo
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
- ReadWriteOnce
- ReadOnlyMany
persistentVolumeReclaimPolicy: Retain
mountOptions:
- hard
- nfsvers=4.1
nfs:
path: "/data/redis003"
server: 10.0.0.106

第二步:
在nfs-server上定义共享目录
[root@ubuntu2004 ~]#ls /data/
redis001 redis002 redis003

[root@ubuntu2004 ~]#vim /etc/exports
/data/redis001 10.0.0.0/24(rw,no_subtree_check,no_root_squash)
/data/redis003 10.0.0.0/24(rw,no_subtree_check,no_root_squash)
加载
[root@ubuntu2004 ~]#exportfs -ar
查看
[root@ubuntu2004 ~]#showmount -e 10.0.0.106
Export list for 10.0.0.106:
/data/redis003 10.0.0.0/24
/data/redis001 10.0.0.0/24

第三步:
创建PV
[root@K8s-master01 chapter5]#kubectl apply -f pv-nfs-demo.yaml
persistentvolume/pv-nfs-demo created
查看PV
[root@K8s-master01 chapter5]#kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS AGE
pv-nfs-demo 5Gi RWO,ROX,RWX Retain Available 45s

Available:当前还未被任何PVC绑定

第四步:
定义PVC
[root@K8s-master01 chapter5]#cat pvc-demo-0001.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-demo-0001
namespace: default
spec:
accessModes: ["ReadWriteMany"] #访问模式
volumeMode: Filesystem #卷模型,文件系统
resources: #范围
requests:
storage: 3Gi
limits:
storage: 10Gi

创建PVC斌查看PVC
[root@K8s-master01 chapter5]#vim pvc-demo-0001.yaml
[root@K8s-master01 chapter5]#kubectl apply -f pvc-demo-0001.yaml
persistentvolumeclaim/pvc-demo-0001 created
[root@K8s-master01 chapter5]#kubectl get pvc -n default
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-demo-0001 Bound pv-nfs-demo 5Gi RWO,ROX,RWX 23s
Bound:已绑定PV,PV名: pv-nfs-demo
再次查看PV
[root@K8s-master01 chapter5]#kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-nfs-demo 5Gi RWO,ROX,RWX Retain Bound default/pvc-demo-0001 14m
PV已绑定,这时PVC就可以被使用了,任何pod想使用PVC,只要在卷类型里面把卷插件类型定义为PersistentVolumeClaim,并指明名称叫pvc-demo-0001

第五步:
定义pod
[root@K8s-master01 chapter5]#cat volumes-pvc-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-pvc-demo
namespace: default
spec:
containers:
- name: redis
image: redis:6
imagePullPolicy: IfNotPresent
ports:
- containerPort: 6379
name: redisport
volumeMounts:
- mountPath: /data
name: redis-pvc-vol #引用卷名称
volumes:
- name: redis-pvc-vol #定义卷名称(上下一致)
persistentVolumeClaim:
claimName: pvc-demo-0001 #引用PVC的名称

创建并查看pod
[root@K8s-master01 chapter5]#kubectl apply -f volumes-pvc-demo.yaml
pod/pod-pvc-demo created
[root@K8s-master01 chapter5]#kubectl get pods
NAME READY STATUS RESTARTS AGE
pod-pvc-demo 1/1 Running 0 42s
跑在哪个节点上,此时已经并不关键了

交互式进入pod-pvc-demo
[root@K8s-master01 chapter5]#kubectl exec -it pod-pvc-demo -- /bin/sh
# redis-cli
127.0.0.1:6379> set hellokey mengfanchao
OK
127.0.0.1:6379> get hellokey
"mengfanchao"
127.0.0.1:6379> bgsave
Background saving started
# ls /data
dump.rdb

到后端nfs-server验证数据
[root@ubuntu2004 ~]#ls /data/redis003/
dump.rdb

删除pod-pvc-demo pod,PVC和PV时是正常存在的
[root@K8s-master01 chapter5]#kubectl delete -f volumes-pvc-demo.yaml
再次出创建pod-pvc-demo pod
[root@K8s-master01 chapter5]#kubectl apply -f volumes-pvc-demo.yaml
pod/pod-pvc-demo created
再次进入交互式接口查看数据
[root@K8s-master01 chapter5]#kubectl exec -it pod-pvc-demo -- /bin/sh
# redis-cli
127.0.0.1:6379> keys *
1) "hellokey"
127.0.0.1:6379> get hellokey
"mengfanchao"
数据是从PVC加载来的,删除pod,卷是一直存在的,因为卷是PVC定义的

删除pod,PVC和PV是不受影响的。 删除PVC,查看PV的状态
删除pod
[root@K8s-master01 chapter5]#kubectl delete -f volumes-pvc-demo.yaml
pod "pod-pvc-demo" deleted
查看PVC
[root@K8s-master01 chapter5]#kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mysql-data Pending nfs-csi 5d8h
pvc-demo-0001 Bound pv-nfs-demo 5Gi RWO,ROX,RWX 33m
删除PVC
[root@K8s-master01 chapter5]#kubectl delete pvc pvc-demo-0001
persistentvolumeclaim "pvc-demo-0001" deleted
查看PV
[root@K8s-master01 chapter5]#kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-nfs-demo 5Gi RWO,ROX,RWX Retain Released default/pvc-demo-0001
删除PVC,PV并不会被删除,但状态变为了Released,已经被PVC释放了,策略是Retain,显示被default/pvc-demo-0001 PVC绑定过,则这个PV不能再使用了,即使是绑定过的PVC再来绑定PV,也无法绑定。
只能人为将PV删除,数据用不着也删除,后端nfs保存的数据也删除,再重建PV
StorageClass
StorageClass资源
◼ Kubernetes支持的标准资源类型之一
◼ 为管理PV资源之便而按需创建的存储资源类别(逻辑组)
◼ 是PVC筛选PV时的过滤条件之一
◼ 为动态创建PV提供“模板”
◆需要存储服务提供管理API
◆StorageClass资源上配置接入API的各种参数
⚫ 定义在parameters字段中
⚫ 还需要使用provisioner字段指明存储服务类型
◼ 一般由集群管理员定义,隶属集群级别
StorageClass资源示例
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-csi
provisioner: nfs.csi.k8s.io #后端存储服务由谁提供的
parameters: #引用后端存储服务时,后端的参数定义
server: nfs-server.default.svc.cluster.local #nfs-server的名字或IP地址
share: / #nfs-server基于哪个路径向外导出各种子目录来作为独立的存储单元供PV使用
reclaimPolicy: Delete #回收策略
volumeBindingMode: Immediate #绑定模式 一旦创建好,就将PV与PVC绑定起来
mountOptions: #指明挂载选项
- hard
- nfsvers=4.1

通过StorageClass的加持,有了PV的动态制备功能,就可以在定义PVC的时候,直接指明向哪个存储类请求创建(前提要存在),要求存储空间10G,并定义多路读写:如下

PVC向StorageClass申请绑定PV
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nfs-dynamic
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
storageClassName: nfs-csi
并不是所有的IN-Tree的卷类型都支持基于PV和PVC的方式来定义
支持基于PV和PVC的方式来定义卷类型(支持动态PV制备)





AWSElasticBlockStore


iSCSI


AzureFile


Quobyte


AzureDisk


NFS


CephFS


RBD


Cinder


VsphereVolume


FC


PortworxVolume


FlexVolume


ScalelO


Flocker


StorageOS


GCEPersistentDisk


Local


Glusterfs




nfs可通过CSI接口施行动态制备
部署及使用NFS CSI,让NFS支持动态制备(测试使用)

部署参考文档:​​https://github.com/iKubernetes/learning-k8s/blob/master/csi-driver-nfs/README.md​

第一步:部署nfs-server
创建名称空间
[root@K8s-master01 ~]#kubectl create namespace nfs
namespace/nfs created
查看名称空间
[root@K8s-master01 ~]#kubectl get ns
NAME STATUS AGE
default Active 6d4h
nfs Active 40s

在nfs名称空间下部署nfs-server (需要访问到github)
[root@K8s-master01 ~]#kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/deploy/example/nfs-provisioner/nfs-server.yaml --namespace nfs
service/nfs-server created #创建了一个svc
deployment.apps/nfs-server created #创建了一个工作负载型控制器
验证
[root@K8s-master01 ~]#kubectl get pods -n nfs
NAME READY STATUS RESTARTS AGE
nfs-server-5847b99d99-9spwf 1/1 Running 0 96s

[root@K8s-master01 ~]#kubectl get svc -n nfs


第二步:安装nfs-csi-driver(Install NFS CSI driver v3.1.0 version on a kubernetes cluster)
[root@K8s-master01 ~]#curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/v3.1.0/deploy/install-driver.sh | bash -s v3.1.0 --
Installing NFS CSI driver, version: v3.1.0 ...
serviceaccount/csi-nfs-controller-sa created
clusterrole.rbac.authorization.k8s.io/nfs-external-provisioner-role created
clusterrolebinding.rbac.authorization.k8s.io/nfs-csi-provisioner-binding created
csidriver.storage.k8s.io/nfs.csi.k8s.io created
deployment.apps/csi-nfs-controller created
daemonset.apps/csi-nfs-node created
NFS CSI driver installed successfully.
验证pod状态
[root@K8s-master01 ~]#kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
csi-nfs-controller-65cf7d587-5sxvg 3/3 Running 0 7m32s
csi-nfs-controller-65cf7d587-z9nn5 3/3 Running 0 7m32s
csi-nfs-node-8xw66 3/3 Running 0 7m27s
csi-nfs-node-lrkd9 3/3 Running 0 7m27s
csi-nfs-node-nk8k2 3/3 Running 0 7m27s
csi-nfs-node-rnc4b 3/3 Running 2 (10s ago) 7m27s
csi-nfs-node-vr5xd 3/3 Running 0 7m27s
csi-nfs-node-wkxzh 3/3 Running 0 7m27s

第三步:创建storageclass,配置CSI Driver引用前面部署的nfs server为存储后端
[root@K8s-master01 manifeste]#cat storageclass-nfs.yaml
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-csi #存储类名称
provisioner: nfs.csi.k8s.io #插件名称
parameters:
#server: nfs-server.default.svc.cluster.local #通过这个名称来引用
server: nfs-server.nfs.svc.cluster.local
share: /
#reclaimPolicy: Delete
reclaimPolicy: Retain #回收策略
volumeBindingMode: Immediate #绑定策略
mountOptions:
- hard
- nfsvers=4.1

创建并查看
[root@K8s-master01 manifeste]#kubectl apply -f storageclass-nfs.yaml
storageclass.storage.k8s.io/nfs-csi created

storageclass是集群下的资源
[root@K8s-master01 manifeste]#kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-csi nfs.csi.k8s.io Retain Immediate false 41s

第四步:测试,创建storageclass内部,创建一个PVC,验证PVC的动态置备功能;
[root@K8s-master01 manifeste]#curl https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/release-3.1/deploy/example/pvc-nfs-csi-dynamic.yaml > dynamic-pvc.yaml
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 197 100 197 0 0 562 0 --:--:-- --:--:-- --:--:-- 562
[root@K8s-master01 manifeste]#vim dynamic-pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nfs-dynamic
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
storageClassName: nfs-csi
创建PVC
[root@K8s-master01 manifeste]#kubectl apply -f dynamic-pvc.yaml
persistentvolumeclaim/pvc-nfs-dynamic created
查看PVC
[root@K8s-master01 manifeste]#kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mysql-data Pending nfs-csi 6d1h
pvc-nfs-dynamic Pending nfs-csi 8s
根据PVC自动创建PV,查看PV
[root@K8s-master01 manifeste]#kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-nfs-demo 5Gi RWO,ROX,RWX Retain Released default/pvc-demo-0001 17h

测试是否具备数据储存功能
[root@K8s-master01 manifeste]#vim volumes-pvc-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: redis-dyn-pvc
namespace: default
spec:
containers:
- name: redis
image: redis:6
imagePullPolicy: IfNotPresent
ports:
- containerPort: 6379
name: redisport
volumeMounts:
- mountPath: /data
name: redis-pvc-vol
volumes:
- name: redis-pvc-vol
persistentVolumeClaim:
claimName: pvc-nfs-dynamic

[root@K8s-master01 manifeste]#kubectl apply -f volumes-pvc-demo.yaml
pod/redis-dyn-pvc created
[root@K8s-master01 manifeste]#kubectl get pods
NAME READY STATUS RESTARTS AGE
redis-dyn-pvc 1/1 Running 0 28s

进入交互式接口
[root@K8s-master01 manifeste]#kubectl exec -it redis-dyn-pvc -- /bin/sh
#redis-cli
127.0.0.1:6379> ste namekey mfc
OK
127.0.0.1:6379> bgsave
Background saving started

默认部署在kubernetes上的nfs-server能够持久化保存数据,删除重建pod,依然能够保持数据
[root@K8s-master01 manifeste]#kubectl delete -f volumes-pvc-demo.yaml
pod "redis-dyn-pvc" deleted
[root@K8s-master01 manifeste]#kubectl apply -f volumes-pvc-demo.yaml
pod/redis-dyn-pvc created

进入交互式接口
[root@K8s-master01 manifeste]#kubectl exec -it redis-dyn-pvc -- /bin/sh
#redis-cli
127.0.0.1:6379> keys *
1) "namekey"
127.0.0.1:6379> get namekey
"mfc"
有了动态制备功能的storageclass,就可以声明一个PVC,指明自己所期望的PVC空间大小,访问模式的期望,
就可以交给storageclass来自动完成

标签:11,PV,制备,demo,PVC,pvc,nfs,动态,root
From: https://blog.51cto.com/mfc001/6114682

相关文章

  • Keil MDK6要来了,将嵌入式软件开发水平带到新高度,支持跨平台(2023-03-11)
    注:这个是MDK6,不是MDK5AC6,属于下一代MDK视频版:https://www.bilibili.com/video/BV16s4y157WF一年一度的全球顶级嵌入式会展EmbeddedWorld2023上,MDK6将展示预览版效......
  • ES6-ES11 ES11 BigInt
    原视频<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title......
  • ES6-ES11目录
    ES6-ES11let变量声明以及声明特性ES6-ES11let实践案例ES6-ES11const声明常量以及特点ES6-ES11变量的解构赋值ES6-ES11模板字符串ES6-ES11对象的简化写法ES6-ES......
  • ES6-ES11 ES11绝对全局对象globalThis
    原视频忽略变量环境,引用全局变量html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width......
  • ES6-ES11 ES11String.prototype.matchAll
    原视频<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title......
  • ES6-ES11 ES11可选链操作符
    原视频<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title......
  • day11 打卡20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求
    day11打卡20.有效的括号1047.删除字符串中的所有相邻重复项150.逆波兰表达式求值20.有效的括号20题目链接1.本来使用的是Stack,时间2ms,内存39.6MB。而Deque时间......
  • leetcode-1122-easy
    RelativeSortArrayGiventwoarraysarr1andarr2,theelementsofarr2aredistinct,andallelementsinarr2arealsoinarr1.Sorttheelementsofarr1su......
  • HTML——day11
    css的元素的显示模式元素的显示模式:指的是将标签分成不同的种类,我们可以更好的选择使网页得到更好的布局分为块元素(div一行只要一个)和行内元素(span一行中好几个)块元素:h......
  • 连网技术与网络管理 2023-03-11
    交换机DHCP防护,防止一个局域网里面,有2个DHCP误接入第二个路由器,就会导致多个DHCP.DHCP是应用层的协议  Wireshark分析DHCP_琳小白的博客-CSDN博客 IP地址,网络地......