848 字
4 分钟
Kubernetes配置存储驱动程序csi-driver-nfs
概述
在 Kubernetes 中,存储管理是一个重要组成部分。本文中涉及的相关组件:
- CSI Driver NFS: 容器存储接口(CSI)的NFS实现,作为Kubernetes与NFS存储系统之间的桥梁
- StorageClass: Kubernetes中的存储类,定义了存储的”类别”,用于动态制备PersistentVolume(PV)
- PVC (PersistentVolumeClaim): 持久卷声明,是用户对存储资源的请求
- Deployment: Kubernetes中用于管理应用部署的控制器,可以包含使用PVC的Pod
它们之间的关系如下:
- CSI Driver NFS 提供了 Kubernetes 访问 NFS 存储的能力
- StorageClass 定义了如何使用 CSI Driver NFS 来动态创建存储卷
- PVC 通过指定 StorageClass 来请求特定类型的存储资源
- Deployment 中的 Pod 可以挂载 PVC 来使用持久化存储
通过这种方式,Kubernetes实现了存储的动态制备和管理,使得应用可以方便地使用NFS存储。
通过Helm3 安装CSI driver NFS
前提要求
- 已经安装Helm
- 已经创建NFS服务端
安装
# 添加 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验证安装
# 检查 CSI 驱动组件kubectl get pods -n kube-system -l app=csi-nfs-controllerkubectl get pods -n kube-system -l app=csi-nfs-node
# 检查 CSI 驱动注册kubectl get csidriver nfs.csi.k8s.io创建StorageClass
创建 StorageClass YAML 文件
# 创建 StorageClass 配置文件vim storageclass-nfs-csi.yamlapiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: nfs-csi # 名字可自定义 annotations: storageclass.kubernetes.io/is-default-class: "true" # 设置为默认SCprovisioner: nfs.csi.k8s.ioparameters: 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: ImmediateallowVolumeExpansion: 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
# 应用StorageClass配置并验证kubectl apply -f storageclass-nfs-csi.yaml
# 查看StorageClass列表kubectl get sc
# 查看详细信息kubectl describe sc nfs-csi创建PVC
动态制备 PVC
# 创建 PVC 配置文件vim pvc-nfs-csi-myapp.yamlapiVersion: v1kind: PersistentVolumeClaimmetadata: name: pvc-nfs-myapp # 每个应用一个PVC namespace: defaultspec: accessModes: - ReadWriteMany # NFS支持多种访问模式 resources: requests: storage: 10Gi # 请求存储大小 storageClassName: nfs-csi # 指定使用的StorageClass# 应用PVC配置并验证kubectl apply -f pvc-nfs-csi-myapp.yamlkubectl get pvc静态制备
略,请参考官方文档
在Deployment中使用PVC
下面是一个使用NFS PVC的Deployment示例:
# 创建Deployment配置文件vim deployment-example.yamlapiVersion: apps/v1kind: Deploymentmetadata: name: deployment-nfs namespace: defaultspec: 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# 部署应用并验证kubectl apply -f deployment-example.yamlkubectl get deploymentkubectl 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
Kubernetes配置存储驱动程序csi-driver-nfs
https://blog.dongge.de/posts/kubernetes配置存储驱动程序csi-driver-nfs/ 
