一、StorageClass
StorageClass 是 Kubernetes 中用来定义存储的动态供应策略的资源对象。它提供了一种抽象机制,用于描述存储的类型、性能需求、供应方式等。通过 StorageClass,Kubernetes 可以动态地为 PVC 创建合适的 PV
作用:
1、动态创建 PV:
- 当 PVC 请求指定了 StorageClass,Kubernetes 会根据 StorageClass 的配置动态创建 PV,并绑定到 PVC。
2、抽象存储类型:
- 它可以定义不同的存储类型,如本地存储、NFS、云存储(如 AWS EBS、GCP Persistent Disk)等。
3、性能优化:
- 不同的 StorageClass 可以定义不同的性能参数,例如快速存储(SSD)、高可用存储等。
创建一个默认的StorageClass,让pvc自动绑定到StorageClass上
default-storage.yaml
apiVersion: storage.k8s.io/v1 # 指定资源版本
kind: StorageClass # 资源类型为StorageClass
metadata: # 定义资源的名称标签等
name: default-storage # 指定为k8s中默认的存储卷
annotations:
storageclass.kubernetes.io/is-default-class: "true" # 这个注解将 default-storage 标记为集群的默认 StorageClass,如果pvc没有指定StorageClass,那么就会自动使用这个StorageClass
provisioner: kubernetes.io/no-provisioner # 或根据你的存储类型更改此值
volumeBindingMode: WaitForFirstConsumer # 等待 Pod 调度后再绑定存储
集群级别的资源,只需要创建一次
# 查看
kubectl get storageclass
# 创建默认的
kubectl apply -f default-storage.yaml
# 删除
kubectl delete storageclass <storageclass-name>
二、 PV
PersistentVolume (PV) 是 Kubernetes 中的一种资源类型,用于抽象和管理底层存储设备。它是集群管理员提供的存储资源,可以与应用程序通过 PersistentVolumeClaim (PVC) 进行绑定,为应用提供持久化存储。PV 是存储的供应者,而 PVC 是存储的消费者。
特点:
1、存储抽象: PV 抽象了底层存储(如本地磁盘、网络存储、云存储等),使应用程序无需关注具体的存储实现细节。
2、独立于 Pod 生命周期: PV 的生命周期独立于 Pod。当 Pod 被删除或重建时,存储数据仍然保留在 PV 中。
3、支持多种存储类型: PV 可以代表不同类型的存储,例如:
- 本地存储
- NFS(网络文件系统)
- iSCSI
- 云存储(如 AWS EBS、GCE PD 等)
4、通过 PVC 绑定: PV 和 PVC 的绑定可以是静态或动态的。
- 静态供应:管理员手动创建 PV。
- 动态供应:通过 StorageClass 动态创建 PV。
创建pv
apiVersion: v1
kind: PersistentVolume
metadata:
name: default-pv # PV 的名称
spec: # 资源描述
capacity:
storage: 10Gi # 存储容量
volumeMode: Filesystem # 卷模式(Filesystem 或 Block)
accessModes:
- ReadWriteOnce # 访问模式
persistentVolumeReclaimPolicy: Retain # 回收策略
storageClassName: default-storage # 关联的 StorageClass
local: # 本地存储
path: /mnt/data # 本地磁盘路径
nodeAffinity: # 节点亲和性
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values: # 指定存储卷绑定的节点
- node1
- node2
配置解释
-
capacity:定义存储容量
-
volumeMode
Filesystem
:以文件系统的形式挂载Block
:以裸块存储设备挂载。
-
accessModes
ReadWriteOnce
(RWO):一个节点可以读写。ReadOnlyMany
(ROX):多个节点可以只读。ReadWriteMany
(RWX):多个节点可以读写。
-
persistentVolumeReclaimPolicy
Retain
:保留数据,手动回收。Delete
:PV 和数据会自动删除。Recycle
:数据被清除后,PV 会被重新利用。
-
storageClassName:与 PVC 中的
storageClassName
匹配,用于绑定。 -
local:本地存储路径。
-
nodeAffinity:限制 PV 绑定到特定的节点。
命令
# 查看当前pv列表
kubectl get pv
# 详情
kubectl describe pv <pv-name>
# 删除pv,如果回收策略为Retain,需要对存储卷目录进行手动清理,再删除pv
kubectl delete pv <pv-name>
三、PVC
Persistent Volume Claim (PVC) 是 Kubernetes 中的一种资源对象,用于请求存储资源。PVC 是应用程序和存储之间的连接桥梁。它通过声明存储需求(如大小、访问模式等)来请求存储资源,而 Kubernetes 会根据这些需求来选择合适的 Persistent Volume (PV) 来提供支持。
default-pvc.yaml
apiVersion: v1 # 资源版本
kind: PersistentVolumeClaim # 资源类型
metadata: # 资源名称和标签
name: default-pvc # 资源名称
spec: # 资源描述
accessModes: # 存储卷的访问模式
- ReadWriteOnce
resources:
requests:
storage: 5Gi # 存储大小
storageClassName: default-storage # 指定的storageClass名称
spec下的配置解释
- accessModes
ReadWriteOnce
(RWO):一个节点可以读写。ReadOnlyMany
(ROX):多个节点可以只读。ReadWriteMany
(RWX):多个节点可以读写。
- resources
- requests:定义了 PVC 请求的存储资源
- storage:指定请求的存储大小,PVC 会选择符合此要求的 Persistent Volume (PV) 来进行绑定
- requests:定义了 PVC 请求的存储资源
- storageClassName:指定的storageclass名称
命令
# 查看pvc列表
kubectl get pvc
# 详情日志
kubectl describe pvc <pvc-name>
# 删除pvc
kubectl delete pvc <pvc-name>
四、创建绑定
创建storageclass、pv、pvc并将其绑定起来,等待Pod调用
default-storage-pv-pvc.yaml
# 创建 storageclass
apiVersion: storage.k8s.io/v1 # 指定资源版本
kind: StorageClass # 资源类型为StorageClass
metadata: # 定义资源的名称标签等
name: default-storage # 指定为k8s中默认的存储卷
annotations:
storageclass.kubernetes.io/is-default-class: "true" # 这个注解将 default-storage 标记为集群的默认 StorageClass,如果pvc没有指定StorageClass,那么就会自动使用这个StorageClass
provisioner: kubernetes.io/no-provisioner # 或根据你的存储类型更改此值
volumeBindingMode: WaitForFirstConsumer # 等待 Pod 调度后再绑定存储
---
# 创建pv
apiVersion: v1
kind: PersistentVolume
metadata:
name: default-pv # PV 的名称
spec: # 资源描述
capacity:
storage: 10Gi # 存储容量
volumeMode: Filesystem # 卷模式(Filesystem 或 Block)
accessModes:
- ReadWriteOnce # 访问模式
persistentVolumeReclaimPolicy: Retain # 回收策略
storageClassName: default-storage # 关联的 StorageClass
local: # 本地存储
path: /mnt/data # 本地磁盘路径
nodeAffinity: # 节点亲和性
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values: # 指定存储卷绑定的节点
- k8snode1
- k8snode2
---
# 创建pvc
apiVersion: v1 # 资源版本
kind: PersistentVolumeClaim # 资源类型
metadata: # 资源名称和标签
name: default-pvc # 资源名称
spec: # 资源描述
accessModes: # 存储卷的访问模式
- ReadWriteOnce
resources:
requests:
storage: 10Gi # 存储大小
storageClassName: default-storage # 指定的storageClass名称
命令
# 创建
kubectl apply -f default-storage-pv-pvc.yaml
# 查看storageclass、pv、pvc
kubectl get storageclass,pv,pvc
# 分别查看详情
kubectl describe storageclass default-storage
kubectl describe pv default-pv
kubectl describe pvc default-pvc
# 删除,根据配置文件删除
kubectl delete -f default-storage-pv-pvc.yaml