《持久化存储》系列,共包含以下文章:
😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!
持久卷声明(Persistent Volume Claim
,PVC
),是用户对 Kubernetes 存储资源的一种请求。
通过使用 持久卷声明(PVC
),用户可以将实际的存储需求告诉给 Kubernetes,然后由 Kubernetes 在已有的 持久卷(PV
)中进行查找。当寻找到合适的 持久卷(PV
)时,Kubernetes 会将它提供给 持久卷声明(PVC
)使用。
因此,持久卷声明(PVC
)可以被看成资源消费者,它消费的是 持久卷(PV
)这种资源。
1.持久卷和持久卷声明的区别
持久卷 和 持久卷声明 都是 Kubernetes 提供给用户使用的两种资源对象。通过使用 持久卷(PV
)和 持久卷声明(PVC
),可以封装集群数据持久化时的存储细节。
二者也有明显的区别,主要体现在以下两方面。
- 二者的使用者不同。
- Kubernetes 集群的管理员应当重点关注 持久卷(
PV
)如何被创建、应该通过 持久卷(PV
)提供什么样的存储功能,却不需要关注它如何被使用。 - Kubernetes 集群的用户,应重点关注 持久卷声明(
PVC
)。用户只需要将存储的需求通过 持久卷声明(PVC
)挂载到 Pod 中即可,不需要关注需求如何被具体实现。
- Kubernetes 集群的管理员应当重点关注 持久卷(
- 二者所承担的任务不同。
- 持久卷(
PV
)可以被看成资源的生产者,而 持久卷声明(PVC
)可以被看成资源的消费者。持久卷(PV
)负责生成存储的资源,并提供给 持久卷声明(PVC
)使用。 - 持久卷声明(
PVC
)在消费 持久卷(PV
)时,可以向 持久卷(PV
)申请存储资源的大小及访问模式等。
- 持久卷(
2.在 Pod 中使用持久卷声明
在《持久卷 PV》中已经创建了一个 持久卷 pv-demo-1
。
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-demo-1
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Recycle
storageClassName: slow
nfs:
server: 172.30.1.2
path: /nfs
下面在 Pod 中创建一个 持久卷声明 来使用它。
编辑 pvc-demo-1.yaml
文件,在其中输入以下内容。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-demo-1
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: slow
执行 kubectl apply -f
命令创建一个 PVC 资源。
kubectl apply -f pvc-demo-1.yaml
查看创建的 持久卷(PV)和 持久卷声明(PVC),如下图所示。
kubectl get pv,pvc
🚀可以看到,在创建了 持久卷声明
pvc-demo-1
后,持久卷pv-demo-1
的状态会自动地从Available
变成Bound
,并且自动匹配了pvc-demo-1
。这种自动匹配是通过存储类 storageClass 来实现的,因为在pv-demo-1
和pvc-demo-1
的描述文件中都指定了storageClassName: slow
字段。
编辑 pvc-pod-demo1.yaml
文件以创建 Pod 来使用持久卷声明对象,在文件中输入以下内容。
apiVersion: v1
kind: Pod
metadata:
name: pvc-pod-demo1
spec:
containers:
- name: pvc-pod-container
image: busybox
imagePullPolicy: IfNotPresent
args:
- /bin/sh
- -c
- sleep 30000
volumeMounts:
- mountPath: "/mydata"
name: mydata
volumes:
- name: mydata
persistentVolumeClaim:
claimName: pvc-demo-1
🚀 在
pvc-pod-demo1.yaml
描述文件中,通过volumes.persistentVolumeClaim
字段指定了 持久卷声明(PVC)的对象为pvc-demo-1
,并将其挂载到了容器内部的/mydata
目录下,而 持久卷声明 对象pvc-demo-1
又自动匹配了 持久卷(PV)对象pv-demo-1
。因此,最终的效果是:把网络数据卷 NFS 挂载到了容器的/mydata
目录下了。
执行 kubectl apply -f
命令。
kubectl apply -f pvc-pod-demo1.yaml
执行 kubectl exec -it
命令进入容器内。
kubectl exec -it pvc-pod-demo1 -c pvc-pod-container sh
查看容器内的 /mydata
目录。
ls /mydata/
more /mydata/index.html
🚀
/mydata
目录下的内容就是在《K8s 持久化存储方式》中创建在 NFS Server 上的 Nginx 的首页index.html
。
3.storageClass 详解
持久卷(PV)对象可以属于某一个存储类 storageClass。
- 如果属于特定存储类的 持久卷声明(PVC)对象请求存储资源,则它只能请求与其对应存储类所标识的 持久卷(PV)对象。
- 如果 持久卷(PV)对象没有设置存储类,则它只能被没有指定存储类的 持久卷声明(PVC)对象请求。
下面是 Kubernetes 官方提供的一个创建存储类 storageClass 的示例。该存储类使用 NFS(网络文件系统)的制备器来提供存储资源。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: example-nfs
provisioner: example.com/external-nfs
parameters:
server: "nfs-server.example.com"
path: "/share"
readOnly: "false"
从示例中可以看出,在存储类 storageClass 的定义中包含 provisioner
、parameters
和 reclaimPolicy
字段。这些字段会在存储类 storageClass 需要动态分配 持久卷(PV)时被使用。
在这 3 个字段中,只有 provisioner
(制备器)字段是必需的,它决定在创建 PV 资源时使用哪种类型的卷插件作为存储资源。例如,在该示例中使用 example.com/external-nfs
作为 PV 对象的制备器,该制备器通过 NFS 的方式提供存储资源。因此,在存储类 storageClass 的最后通过 parameters
参数指定了 NFS 的地址信息。
每一个被创建的 持久卷(PV)对象会有一个存储资源的回收策略(通过 reclaimPolicy
字段指定)。该字段的值可以是 Delete
或 Retain
,默认值是 Delete
。
下面是 Kubernetes 官方提供的另一个存储类示例,该存储类使用 Glusterfs 插件来提供相应的存储资源。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: slow
provisioner: kubernetes.io/glusterfs
parameters :
resturl: "http://127.0.0.1:8081"
clusterid: "630372ccdc720a92c681fb928f27b53f"
restauthenabled: "true"
restuser: "admin"
secretNamespace: "default"
secretName: "heketi-secret"
gidMin: "40000"
gidMax: "50000"
volumetype: "replicate:3"