PV-PVC
PV & PVC
https://blog.csdn.net/bdkl9998/article/details/106304255
PersistentVolume(PV)
是由管理员设置的存储,是集群的一部分,它不属于任何命名空间
PV的生命周期独立于使用它的pod的生命周期
PV更像是一种储备资源,先创建,有PVC需要它时才会被使用
PV可以是多种类型的(GCE,NFS等)
分为静态和动态
PersistentVolumeClaim(PVC)
用户创建pvc以使用pv
PVC与PV的绑定是一对一的映射,小的pvc可能会使用大的pv,没有其他pvc可以利用剩余空间
如果没有可用的PV,那么PVC会一直处于unbound未绑定状态,直到有新的pv产生,如果pvc与pv匹配,会自动绑定
创建持久卷
apiVersion: v1
kind: PersistentVolume
metadata:
name: mongodb-pv
spec:
accessModes:
- ReadWriteOnce
- ReadOnlyMany
capacity:
storage: 1Gi
hostPath: # 使用节点本地目录存储(生产环境不会这样配置,仅演示)
path: /tmp/data
persistentVolumeReclaimPolicy: Recycle
awsElasticBlockStore: # 亚马逊弹性存储
volumeID: <volume-id>
fsType: ext4
PV访问模式(只能同时指定一个)
ReadWriteOnce (RWO) 该卷只能被单个节点以读/写模式挂载
ReadOnlyMany (ROX) 该卷可以被多个节点以只读模式挂载
ReadWriteMany (RWX) 该卷可以被多个节点以读/写模式挂载
回收策略(不同的卷可能不持支所有策略)
Retain (保留) 删除绑定的PVC后,PV不会被删除,需要手动删除
Recycle (回收) 删除绑定的PVC后,PV不会被删除,其中的数据会被删除
Delete (删除) 删除绑定的PVC后,PV会被自动删除
创建持久卷声名
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mongodb-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
stotageClassName: ""
在Pod中使用PVC
...
volumes:
- name: mongodb-data
persistentVolumeClaim:
claimName: mongodb-pvc
持久卷回收
当不再需要PV时,可以删除PVC来回收PV。PV的常有状态Released(不可用,需要根据回收策略来判断) Available(可以被PVC使用)
当启用PVC的保护功能时,如果删除正在使用的pvc,pvc的删除将会被推迟,直到pvc不再被任何pod使用
手动回收
Retain
PV的默认回收策略,PVC释放PV后,该PV和其中数据依然保留,需要手动删除PV后再创建才能使用
使用kubectl delete pv my_pv命令删除PV,不会删除其存储空间中的数据
自动回收
Recycle
PVC释放PV后,PV中数据会被清除,重新变为Available状态,此时PVC可以使用PV
Delete
会将PV的存储空间删除
PV的状态
Available: 可用状态,目前还没有绑定给PVC
Bound: 绑定给了某个PVC
Released: PVC已经解除与PV的绑定,但是PV还没有被集群回收
Failed: PV在自动回收中失败了
pvc的状态
Pending:PVC 正在等待可用的 PV。
Bound:PVC 已经与一个可用的 PV 绑定。
Lost:PVC 与绑定的 PV 断开连接,无法恢复
Storage Classes
动态PV
在创建PV前,需要先创建PV中指定的存储,PV才能使用该存储。如果能在应用程序需要时自动配置卷就好了,这就需要Storage Class。由SC创建的PV称为动态PV。之所以称为动态,是因为PV的创建是自动的,不需要手动创建
Stotage CLass的使用
先创建SC
sc-definition.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: google-storage
provisioner: kubernetes.io/gce-pd # 存储提供者,也可以叫后端存储驱动
创建PVC引用SC
pvc-definition.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
sepc:
accessModes:
- ReadWriteOnce
storageClassName: google-storage
resources:
requests:
storage: 500Mi
pod中指定卷为PVC
pod-definition.yaml
...
volumes:
- name: data-volume
persistenVolumeClaim:
claimName: myclaim
持久化卷类型
pv类型以插件形式实现。k8s目前支持一下插件类型
AWSElasticBlockStore: AWS公有云提供的ElasticBlockStore。
AzureFile: Azure公有云提供的File。
AzureDisk: Azure公有云提供的Disk。
CephFS: 一种开源共享存储系统。
FC(Fibre Channel) : 光纤存储设备。
FlexVolume: 一种插件式的存储机制。
Flocker: 一种开源共享存储系统。
GCEPersistentDisk: GCE公有云提供的PersistentDisk。
Glusterfs: 一种开源共享存储系统。
HostPath: 宿主机目录, 仅用于单机测试。
iSCSI: iSCSI存储设备。
Local: 本地存储设备, 从Kubernetes 1.7版本引入, 到1.14版本时更新为稳定版, 目前可以通过指定块(Block) 设备提供Local PV, 或通过社区开发的sig-storage-local-static-provisioner插件(https://github.com/kubernetes-sigs/sigstorage-local-static-provisioner) 来管理Local PV的生命周期。
NFS: 网络文件系统。
Portworx Volumes: Portworx提供的存储服务。
Quobyte Volumes: Quobyte提供的存储服务。
RBD(Ceph Block Device) : Ceph块存储。
ScaleIO Volumes: DellEMC的存储设备。
StorageOS: StorageOS提供的存储服务。
VsphereVolume: VMWare提供的存储系统。每种存储类型都有各自的特点, 在使用时需要根据它们各自的参数进行设置
下表描述了不同的存储提供者支持的访问模式
Volume Plugin | ReadWriteOnce | ReadOnlyMany0 | ReadWriteMany |
---|---|---|---|
AWSElasticBlockStore | 是 | 否 | 否 |
AzureFile | 是 | 是 | 是 |
AzureDisk | 是 | 否 | 否 |
CephFS | 是 | 是 | 是 |
Cinder | 是 | 否 | 否 |
FC | 是 | 是 | 否 |
FlexVolume | 是 | 是 | 视驱动而定 |
Flocker | 是 | 否 | 否 |
GCEPersistentDisk | 是 | 是 | 否 |
GlusterFS | 是 | 是 | 是 |
HostPath | 是 | 否 | 否 |
iSCSI | 是 | 是 | 否 |
Quobyte | 是 | 是 | 是 |
NFS | 是 | 是 | 是 |
RBD | 是 | 是 | 否 |
VsphereVolume | 是 | 否 | 否 |
PortworxVolume | 是 | 否 | 是 |
ScaleIO | 是 | 是 | 否 |
StorageOS | 是 | 否 | 否 |
持久化演示说明-NFS
一、安装NFS服务器
yum install -y nfs-common nfs-utils rpcbind
mkdir /nfsdata
chmod 666 /nfsdata
chown nfsnobody /nfsdata
vim /etc/exports
输入/nfsdata *(rw,no_root_squash,no_all_squash,sync)
systemctl start rpcbind
systemctl start nfs
二、部署pv
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfspv1
spec:
capacity:
srotage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
nfs:
path: /data/nfs
server: 10.66.66.10
三、创建服务并使用pvc
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx
serviceName: “nginx”
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: k8s.gcr.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [“ReadWriteOnce”]
storageClassName: “nfs”
resources:
requests:
storage: 1Gi
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)