Kubernetes配置存储驱动程序csi-driver-nfs

概述

在 Kubernetes 中,存储管理是一个重要组成部分。本文中涉及的相关组件:

  • CSI Driver NFS: 容器存储接口(CSI)的NFS实现,作为Kubernetes与NFS存储系统之间的桥梁
  • StorageClass: Kubernetes中的存储类,定义了存储的”类别”,用于动态制备PersistentVolume(PV)
  • PVC (PersistentVolumeClaim): 持久卷声明,是用户对存储资源的请求
  • Deployment: Kubernetes中用于管理应用部署的控制器,可以包含使用PVC的Pod

它们之间的关系如下:

  1. CSI Driver NFS 提供了 Kubernetes 访问 NFS 存储的能力
  2. StorageClass 定义了如何使用 CSI Driver NFS 来动态创建存储卷
  3. PVC 通过指定 StorageClass 来请求特定类型的存储资源
  4. Deployment 中的 Pod 可以挂载 PVC 来使用持久化存储

通过这种方式,Kubernetes实现了存储的动态制备和管理,使得应用可以方便地使用NFS存储。

通过Helm3 安装CSI driver NFS

前提要求

  • 已经安装Helm
  • 已经创建NFS服务端

安装

1
2
3
4
5
# 添加 CSI driver NFS 的 Helm 仓库
helm repo add csi-driver-nfs https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/charts

# 安装 CSI driver NFS 到 kube-system 命名空间
helm install csi-driver-nfs csi-driver-nfs/csi-driver-nfs --namespace kube-system

验证安装

1
2
3
4
5
6
# 检查 CSI 驱动组件
kubectl get pods -n kube-system -l app=csi-nfs-controller
kubectl get pods -n kube-system -l app=csi-nfs-node

# 检查 CSI 驱动注册
kubectl get csidriver nfs.csi.k8s.io

创建StorageClass

创建 StorageClass YAML 文件

1
2
# 创建 StorageClass 配置文件
vim storageclass-nfs-csi.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-csi # 名字可自定义
annotations:
storageclass.kubernetes.io/is-default-class: "true" # 设置为默认SC
provisioner: nfs.csi.k8s.io
parameters:
server: 172.16.126.130 # 替换为你的NFS服务器IP地址
share: / # NFS共享路径,使用4.1版本挂载时直接填/即可
# subDir: k8s/${pvc.metadata.namespace}/${pvc.metadata.name} # 可选,指定子目录
onDelete: retain # NFS CSI驱动层面的存储清理策略
reclaimPolicy: Retain # Kubernetes层面的PV回收策略
volumeBindingMode: Immediate
allowVolumeExpansion: true # 可扩展
mountOptions:
- nfsvers=4.1 # 指定NFS版本
- proto=tcp
- hard
- retrans=5
- noac
- lookupcache=none

参数说明

reclaimPolicy

Kubernetes 层面的 PV 回收策略,这是 StorageClass 的标准 Kubernetes 参数。

可选值:

  • Retain: PVC 删除后,PV 保留,需要手动清理
  • Delete: PVC 删除后,PV 自动删除

onDelete

NFS CSI 驱动层面的存储清理策略。

可选值:

  • retain: 保留 NFS 服务器上的实际数据目录
  • delete: 删除 NFS 服务器上的实际数据目录
  • archive: 归档数据目录(重命名为带时间戳的目录)

部署StorageClass

1
2
3
4
5
6
7
8
# 应用StorageClass配置并验证
kubectl apply -f storageclass-nfs-csi.yaml

# 查看StorageClass列表
kubectl get sc

# 查看详细信息
kubectl describe sc nfs-csi

创建PVC

动态制备 PVC

1
2
# 创建 PVC 配置文件
vim pvc-nfs-csi-myapp.yaml
1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nfs-myapp # 每个应用一个PVC
namespace: default
spec:
accessModes:
- ReadWriteMany # NFS支持多种访问模式
resources:
requests:
storage: 10Gi # 请求存储大小
storageClassName: nfs-csi # 指定使用的StorageClass
1
2
3
# 应用PVC配置并验证
kubectl apply -f pvc-nfs-csi-myapp.yaml
kubectl get pvc

静态制备

略,请参考官方文档

在Deployment中使用PVC

下面是一个使用NFS PVC的Deployment示例:

1
2
# 创建Deployment配置文件
vim deployment-example.yaml
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
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-nfs-myapp # 引用之前创建的PVC
1
2
3
4
# 部署应用并验证
kubectl apply -f deployment-example.yaml
kubectl get deployment
kubectl get pv

参考文档

https://kubernetes.io/zh-cn/docs/concepts/storage/storage-classes/

https://github.com/kubernetes-csi/csi-driver-nfs

https://github.com/kubernetes-csi/csi-driver-nfs/blob/master/deploy/example/README.md