介绍
在Kubernetes(K8S)中,PersistentVolume(PV)和PersistentVolumeClaim(PVC)是用于管理持久化存储的重要概念。PV用于抽象存储资源,而PVC用于请求这些资源。本教程将深入介绍PV和PVC的概念、用法以及如何在K8S集群中使用它们。
什么是PersistentVolume(PV)?
PersistentVolume(PV)
是K8S集群中的持久化存储资源,它是集群中独立于Pod的一种抽象。PV可以是任何类型的持久化存储,例如NFS、iSCSI、AWS EBS等。PV具有自己的生命周期,它独立于Pod的创建和删除。
- PV是对K8S存储资源的抽象,PV一般由运维人员创建和配置,供容器申请使用。
- 注意:PV没有命名空间限制!!!
什么是PersistentVolumeClaim(PVC)?
PersistentVolumeClaim(PVC)
是Pod对PV的请求。当Pod需要持久化存储时,它会创建一个PVC来请求适合其需求的PV。PVC定义了所需的存储容量和访问模式(例如Read-WriteOnce、ReadOnlyMany等)。
- Pod 在使用 PVC 时必须与PVC在同一个Namespace下。
- 注意:PVC有命名空间限制!!!
如何使用PV和PVC?
以下是使用PV和PVC的基本步骤:
1. 创建PersistentVolume(PV)
您可以手动创建PV,也可以使用存储类(StorageClass)动态创建。以下是手动创建PV的示例:
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
hostPath:
path: /data
2. 创建PersistentVolumeClaim(PVC)
使用PVC请求PV。以下是创建PVC的示例:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
3. 将PVC绑定到Pod
在Pod的配置中引用PVC。例如:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx
volumeMounts:
- name: my-volume
mountPath: /data
volumes:
- name: my-volume
persistentVolumeClaim:
claimName: my-pvc
PV的访问模式
模式 | 解析 |
ReadWriteOnce(RWO) | 可读可写,但只支持被单个节点挂载 |
ReadOnlyMany(ROX) | 只读,可被多个节点挂载 |
ReadWriteMany(RWX) | 多路可读可写,这种存储可以以读写的方式被多个节点共享、不是每一种存储都支持者三种方式,像共享方式,目前支持的还比较少,比较常用的是NFS,在pvc绑定pv时通常根据两个条件来判定,是存储的大小,另一个就是模式 |
PV的回收策略
PV有不同的回收策略,包括Retain、Delete和Recycle。根据您的需求选择合适的策略。
策略 | 解析 |
Retain | 不清除、保留volume(需要手动清除) |
Recycle | 删除数据,即rm -rf /thevolume/* (只有nfs和hostPath支持) |
Delete | 删除储存资源,比如删除aws ebs卷(只有aws EBS,GCE PD,Azure Disk和cinder支持) |
PV的状态
状态 | 解析 |
Available | 可用,没有被PVC绑定的空闲资源。 |
Bound | 已绑定,已经被PVC绑定 |
Released | 已释放,PVC被删除,但是资源还未被重新使用。 |
Failed | 失败,自动回收失败 |
结论
通过本教程,您现在应该对Kubernetes中的PV和PVC有了更深入的了解。PV和PVC提供了一种强大的方式来管理持久化存储,并为容器化应用程序提供了可靠的存储解决方案。继续探索PV和PVC的高级用法,并根据您的需求合理地配置和管理持久化存储资源。
CKA真题
持久卷PersistentVolume
真题截图
中文解析
切换 k8s 集群环境:kubectl config use-context hk8s
Task
创建一个 pv,名字为app-config
,大小为 2Gi, 访问权限为ReadWriteMany
。Volume
的类型为 hostPath,路径为 /srv/app-config
。
官方参考文档
配置 Pod 以使用 PersistentVolume 作为存储
做题解答
- 切换K8s集群环境
kubectl config use-context hk8s
- 按照题目的要求,编写PV的资源清单
apiVersion: v1
kind: PersistentVolume
metadata:
name: app-config
labels:
type: local
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
hostPath:
path: "/srv/app-config"
- 提交PV资源清单
kubectl apply -f pv.yaml
- 通过下面的命令检查PV的状态。
持久卷申领(PVC)
真题截图
中文解析
切换 k8s 集群环境:kubectl config use-context ok8s
Task
创建一个名字为 pv-volume 的 pvc,指定 storageClass 为csi-hostpath-sc
,大小为 10Mi。然后创建一个 Pod,名字为web-server
,镜像为 nginx,并且挂载该 PVC 至 /usr/share/nginx/html
,挂载的权限为 RedWriteOnce
。之后通过 kubectl edit 或者 kubectl path 将 pvc 改成 70Mi,并且记录修改记录。
官方参考文档
配置 Pod 以使用 PersistentVolume 作为存储
做题解答
- 切换K8s集群环境
kubectl config use-context hk8s
- 按照题目的要求,编写PVC的资源清单
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-volume
spec:
storageClassName: csi-hostpath-sc
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Mi
---
apiVersion: v1
kind: Pod
metadata:
name: web-server
spec:
volumes:
- name: html-volume
persistentVolumeClaim:
claimName: pv-volume
containers:
- name: web-server
image: nginx
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: html-volume
- 提交资源清单
kubectl apply -f pod.yaml
- 修改PVC的容量从原来的10Mi改成70Mi
kubectl edit pvc pv-volume
--------
resources:
requests:
storage: 70Mi
storageClassName: csi-hostpath-sc
---------