[快速入门] NFS CSI StorageClass

是用来做什么的

自动给 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
使用 Hugo 构建
主题 StackJimmy 设计