J.V.'s Blog

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

本文详细介绍了如何在Kubernetes中配置和使用NFS存储驱动程序csi-driver-nfs,包括通过Helm3安装CSI驱动、创建StorageClass、动态制备PVC以及在Deployment中使用PVC等完整步骤。

概述

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

它们之间的关系如下:

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

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

通过Helm3 安装CSI driver 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-controller
kubectl 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.yaml
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 参数。

可选值:

onDelete

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

可选值:

部署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.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-nfs-myapp  # 每个应用一个PVC
  namespace: default
spec:
  accessModes:
    - ReadWriteMany  # NFS支持多种访问模式
  resources:
    requests:
      storage: 10Gi  # 请求存储大小
  storageClassName: nfs-csi  # 指定使用的StorageClass
# 应用PVC配置并验证
kubectl apply -f pvc-nfs-csi-myapp.yaml
kubectl get pvc

静态制备

略,请参考官方文档

在Deployment中使用PVC

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

# 创建Deployment配置文件
vim deployment-example.yaml
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
# 部署应用并验证
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

#k8s #开发