如何在kubernetes 1.22.0上部署NFS 存储类

在 Kubernetes 1.22.0 上部署 NFS 存储类需要以下步骤。我将提供两种方法:手动部署和使用 Helm 部署。

前提条件

  1. 已安装 Kubernetes 集群(版本 1.22.0)

  2. 已配置好 NFS 服务器(共享目录已导出)

  3. 所有节点已安装 nfs-common 或 nfs-utils 包

    bash

    复制

    下载

    # Ubuntu/Debian
    sudo apt-get install -y nfs-common
    
    # CentOS/RHEL
    sudo yum install -y nfs-utils

方法一:手动部署 NFS StorageClass

1. 创建 Service Account 和 RBAC

yaml

复制

下载

# nfs-provisioner-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-provisioner
  namespace: kube-system
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-provisioner-runner
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-provisioner
    namespace: kube-system
roleRef:
  kind: ClusterRole
  name: nfs-provisioner-runner
  apiGroup: rbac.authorization.k8s.io

应用配置:

bash

复制

下载

kubectl apply -f nfs-provisioner-rbac.yaml
2. 部署 NFS Provisioner

yaml

复制

下载

# nfs-provisioner-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-client-provisioner
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-provisioner
      containers:
        - name: nfs-client-provisioner
          image: gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner:v4.0.2
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: k8s-sigs.io/nfs-subdir-external-provisioner
            - name: NFS_SERVER
              value: <NFS-SERVER-IP>  # 替换为你的NFS服务器IP
            - name: NFS_PATH
              value: <NFS-SHARE-PATH> # 替换为NFS共享路径
      volumes:
        - name: nfs-client-root
          nfs:
            server: <NFS-SERVER-IP>   # 替换为你的NFS服务器IP
            path: <NFS-SHARE-PATH>    # 替换为NFS共享路径

应用配置:

bash

复制

下载

kubectl apply -f nfs-provisioner-deployment.yaml
3. 创建 StorageClass

yaml

复制

下载

# nfs-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-client
  annotations:
    storageclass.kubernetes.io/is-default-class: "true" # 设为默认存储类
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
parameters:
  archiveOnDelete: "false" # 删除PV时不保留数据

应用配置:

bash

复制

下载

kubectl apply -f nfs-storageclass.yaml

方法二:使用 Helm 部署(推荐)

1. 添加 Helm 仓库

bash

复制

下载

helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
helm repo update
2. 安装 NFS Provisioner

bash

复制

下载

helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
  --namespace kube-system \
  --set nfs.server=<NFS-SERVER-IP> \
  --set nfs.path=<NFS-SHARE-PATH> \
  --set storageClass.name=nfs-client \
  --set storageClass.defaultClass=true \
  --set image.repository=registry.k8s.io/sig-storage/nfs-subdir-external-provisioner \
  --set image.tag=v4.0.2

参数说明

  • nfs.server: NFS 服务器 IP 地址

  • nfs.path: NFS 共享路径

  • storageClass.name: 存储类名称

  • storageClass.defaultClass: 设为默认存储类

  • image.repository: 使用官方镜像仓库

  • image.tag: 指定兼容 Kubernetes 1.22 的版本


验证部署

  1. 检查 Pod 状态:

    bash

    复制

    下载

    kubectl get pods -n kube-system | grep nfs
    # 应该看到类似:nfs-subdir-external-provisioner-xxx   1/1     Running   0          2m
  2. 检查 StorageClass:

    bash

    复制

    下载

    kubectl get storageclass
    # 输出示例:
    # NAME         PROVISIONER                                   RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
    # nfs-client   k8s-sigs.io/nfs-subdir-external-provisioner   Delete          Immediate           true                   5m
  3. 测试 PVC:

    yaml

    复制

    下载

    # test-pvc.yaml
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: test-pvc
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
      storageClassName: nfs-client

    应用并验证:

    bash

    复制

    下载

    kubectl apply -f test-pvc.yaml
    kubectl get pvc test-pvc
    # 应该看到状态为 Bound

故障排查

  1. Pod 无法启动

    • 检查 NFS 服务器是否可访问

    • 确认节点已安装 NFS 客户端工具

    • 检查防火墙设置(NFS 需要开放 2049 端口)

  2. PVC 处于 Pending 状态

    • 查看 Provisioner Pod 日志:

      bash

      复制

      下载

      kubectl logs -n kube-system -l app=nfs-subdir-external-provisioner
    • 确认 StorageClass 配置正确:

      bash

      复制

      下载

      kubectl describe storageclass nfs-client
  3. 挂载权限问题

    • 在 NFS 服务器上确保共享目录有适当权限:

      bash

      复制

      下载

      chmod 777 /your/nfs/share
    • 在 NFS 服务器 /etc/exports 中添加:

      复制

      下载

      /your/nfs/share *(rw,sync,no_root_squash,no_subtree_check)

      然后重启 NFS 服务:

      bash

      复制

      下载

      systemctl restart nfs-server

清理资源

bash

复制

下载

# Helm 方式
helm uninstall nfs-subdir-external-provisioner -n kube-system

# 手动方式
kubectl delete -f nfs-storageclass.yaml
kubectl delete -f nfs-provisioner-deployment.yaml
kubectl delete -f nfs-provisioner-rbac.yaml

通过以上步骤,您可以在 Kubernetes 1.22.0 上成功部署 NFS 存储类,为应用提供持久化存储能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值