是用来做什么的
自动给 pvc 创建并绑定 pv 的
解决了什么问题
人工管理 pvc 和 pv 之间绑定关系的复杂性
典型应用场景
应用根据自身需求创建 pvc,StorageClass 自动创建符合条件的 pv,并进行绑定
基础概念
Volume
Kubernetes 卷为 Pod 中的容器提供了一种通过文件系统访问和共享数据的方式。
引用自 官方文档
PersistentVolume
持久卷(PersistentVolume,PV) 是集群中的一块存储,可以由管理员事先制备,或者使用 存储类(Storage Class) 来动态制备。持久卷是集群资源,就像节点也是集群资源一样。
引用自 官方文档
PersistentVolumeClaim
持久卷申领(PersistentVolumeClaim,PVC) 表达的是用户对存储的请求,概念上与 Pod 类似。Pod 会耗用节点资源,而 PVC 申领会耗用 PV 资源。Pod 可以请求特定数量的资源(CPU 和内存)。同样 PVC 申领也可以请求特定的大小和访问模式。
引用自 官方文档
StorageClass
StorageClass 为管理员提供了描述存储类的方法。
不同的类型可能会映射到不同的服务质量等级或备份策略,或是由集群管理员制定的任意策略。
引用自 官方文档
我自己的理解,pv 是一种存储资源,pod 可以通过挂载 pv 来获得一个持久化的文件系统,这样子可以保证应用本身的无状态。
pvc 就是一个接口,把 pv 的声明和具体的实现隔离开,这样应用就无需关心自己使用的文件系统是怎么实现的,降低了应用的复杂性。
安装
这里使用 helm 安装,参考 官方文档
1
2
|
helm repo add csi-driver-nfs https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/charts
helm install csi-driver-nfs csi-driver-nfs/csi-driver-nfs --namespace kube-system
|
配置
上一步安装的是 provisioner,接下来要定义 storageClass 来使用安装的 provisioner。
参考 官方示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-csi
annotations:
storageclass.beta.kubernetes.io/is-default-class: 'true'
storageclass.kubernetes.io/is-default-class: 'true'
provisioner: nfs.csi.k8s.io
parameters:
server: nfs-server.default.svc.cluster.local # 这个地方填写 nfs 服务器的地址
share: / # 这个地方添加你在 nfs 服务器上面要挂载的目录
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
mountOptions:
- nfsvers=4.
|
验证
还是参考 官方示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-deployment-nfs
namespace: default
spec:
accessModes:
- ReadWriteMany # In this example, multiple Pods consume the same PVC.
resources:
requests:
storage: 10Gi
storageClassName: nfs-csi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-nfs
namespace: default
spec:
replicas: 1
selector:
matchLabels:
name: deployment-nfs
template:
metadata:
name: deployment-nfs
labels:
name: deployment-nfs
spec:
nodeSelector:
"kubernetes.io/os": linux
containers:
- name: deployment-nfs
image: mcr.microsoft.com/oss/nginx/nginx:1.19.5
command:
- "/bin/bash"
- "-c"
- set -euo pipefail; while true; do echo $(hostname) $(date) >> /mnt/nfs/outfile; sleep 1; done
volumeMounts:
- name: nfs
mountPath: "/mnt/nfs"
readOnly: false
volumes:
- name: nfs
persistentVolumeClaim:
claimName: pvc-deployment-nfs
|
可以看到,pv 被自动创建了出来
1
2
3
|
➜ ~ k get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE
pvc-7783558d-471b-45f8-9827-e2ecbb272830 10Gi RWX Delete Bound default/pvc-deployment-nfs nfs-csi <unset> 73s
|