Pods应用NFS存储

博客介绍了在K8s中选择NFS服务器配置Volumes的步骤。包括在NFS服务器安装服务并配置规则,在k8s节点测试NFS可用性,在主节点创建volumes目录和Pod.yml文件,在NFS节点创建Nginx主页文件,最后通过访问Pod的IP地址查看结果。

Volumes选择NFS服务器:

 

条件:

    1. k8s集群,目前为(hadoop1,hadoop2,hadoop3)
    2. 另起一台服务器做专门的NFS服务器
    3. NFS需要在K8S的各个节点安装

部属:

  1.NFS-Node

说明:在NFS这台服务器上安装NFS服务并配置规则

        ~]# yum -y install nfs-utils
        ~]# mkdir /k8s/volumes/web
        ~]# vim /etc/exporter
            /k8s/volumes/web 192.168.23.0/24(rw,no_root_squash)
        ~]# systemctl start nfs

  2.k8s-slave2

 说明:在k8s的第二个节点上,手动测试nfs是否可用

        kubnet@hadoop3 ~]$ mount -t nfs 192.168.23.103:/k8s/volumes/web /mnt                 // 手动尝试是否能够挂载

  3.k8s-master

说明:在k8s的主节点上创建单独的volumes目录用来存储yml文件,且创建独立式Pod.yml文件

        kubnet@hadoop2 ~]$ mkdir volumes
        kubnet@hadoop2 volumes]$ vim pod-nfs-vol.yml
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod-nfs-vol
        namespace: default
      spec:
        containers:
        - name: myapp
         image: fangwenkai/kubernetes:v1.16
         imagePullPolicy: IfNotPresent
         volumeMounts:
         - name: web-storage
          mountPath: /usr/share/nginx/html/
          readOnly: false
        volumes:
        - name: web-storage
         nfs:
          path: /k8s/volumes/web
          server: 192.168.23.103          
          readOnly: false

kubnet@hadoop2 volumes]$ kubectl apply -f pod-nfs-vol.yml
kubnet@hadoop2 volumes]$ kubectl get pods -o wide

  4.NFS-Node

说明:在NFS-Node上创建Nginx的主页文件

kubnet@hadoop3 ~]$ echo $(hostname) > /k8s/volumes/web/index.html

  5.k8s-master

说明:直接访问Pod的IP地址查看结果是否与在NFS-Node上创建的主页内容一致

kubnet@hadoop2 volumes]$ curl 10.244.2.129       // 直接访问Pod的IP地址,查看结果是否为"NFS-Node"的主机名

 

转载于:https://www.cnblogs.com/k-free-bolg/p/11170352.html

<think>好的,我现在需要帮助用户解决在Kubernetes中设置NFS动态供给以及处理挂载失败的问题,特别是错误exit status 32。首先,我得回顾之前的对话,确保不重复信息,同时补充新内容。 用户之前已经询问过NFS挂载失败的排查步骤,我给出了安装客户端工具、检查PV配置、版本兼容性、SELinux/防火墙、kubelet日志和NFS服务器权限等方法。现在用户进一步想了解如何实现动态供给,同时再次提到exit status 32的错误,可能是在动态供给过程中遇到的。 首先,动态供给需要用到NFS Subdir External Provisioner,这个工具将NFS服务器作为StorageClass,自动创建PV和PVC。需要确保用户已经正确安装配置了Provisioner,包括Deployment、StorageClass等。可能需要详细说明部署步骤,比如Helm安装或者手动部署,并给出示例YAML文件。 然后,关于exit status 32的错误,用户可能是在动态供给过程中出现的问题,所以需要结合动态供给的环境来排查。可能的原因包括Provisioner的配置错误,比如NFS服务器地址、路径是否正确,或者权限问题。此外,StorageClass的参数设置,比如mountOptions是否正确指定了NFS版本,或者是否有不兼容的选项。 另外,用户之前的问题中提到了节点缺少nfs-utils/nfs-common包,这在动态供给中同样重要,因为Provisioner需要在节点上执行挂载操作。需要再次强调安装这些软件包的必要性,并检查所有节点是否都已安装。 还要考虑Provisioner的日志,查看是否有具体的错误信息,比如连接NFS服务器失败,或者路径不存在。用户可能需要通过kubectl logs命令来查看Provisioner Pod的日志,从而定位问题。 另外,动态供给中使用的StorageClass的mountOptions是否正确,比如vers=3或4.1,需要与NFS服务器支持的版本一致。用户可能需要检查NFS服务器的配置,确保允许客户端使用指定的版本进行连接。 最后,权限问题也很关键,NFS服务器上的导出路径是否允许Kubernetes节点的IP访问,是否有正确的读写权限。需要指导用户检查/etc/exports文件,并重新导出配置。 总结来说,回答需要分两部分:动态供给的设置步骤,以及针对exit status 32的排查方法,结合之前的建议,并补充动态供给特有的配置和问题点。同时,确保提供具体的命令和示例,方便用户操作。</think>### Kubernetes NFS动态供给实现与挂载失败排查(错误码32) --- #### 一、NFS动态供给实现步骤 1. **部署NFS Subdir External Provisioner** ```bash # 添加Helm仓库 helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner # 安装Provisioner(替换NFS服务器参数) helm install nfs-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \ --set nfs.server=121.43.181.2 \ --set nfs.path=/data/nfs_pro ``` **关键组件**: - Provisioner Pod:负责动态创建PV - StorageClass:定义存储类型 ```yaml # 生成的StorageClass示例 apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: nfs-client provisioner: k8s-sigs.io/nfs-subdir-external-provisioner parameters: archiveOnDelete: "false" # 删除PVC时是否保留数据 mountOptions: - vers=4.1 # 显式指定NFS版本[^1] ``` 2. **创建PVC测试** ```yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: test-pvc spec: storageClassName: nfs-client accessModes: - ReadWriteOnce resources: requests: storage: 1Gi ``` **验证命令**: ```bash kubectl get pvc # 应显示Bound状态 kubectl exec -it <pod-name> -- ls /mnt/nfs # 验证挂载点可访问 ``` --- #### 二、动态供给场景下的错误排查(exit status 32) 1. **检查Provisioner配置** **关键参数验证**: ```bash kubectl describe storageclass nfs-client | grep "Provisioner" # 应显示provisioner: k8s-sigs.io/nfs-subdir-external-provisioner ``` **常见问题**: - NFS服务器IP或路径错误 - StorageClass未正确关联Provisioner 2. **验证NFS客户端工具** **所有Kubernetes节点必须安装**: ```bash # 检查节点nfs-utils安装(动态供给仍依赖节点挂载能力) ssh node01 rpm -qa | grep nfs-utils ``` **修复方法**: ```bash # 批量安装工具(所有节点执行) ansible k8s-nodes -m yum -a "name=nfs-utils state=present" ``` 3. **分析Provisioner日志** ```bash # 获取Provisioner Pod名称 kubectl get pods -l app=nfs-provisioner # 查看实时日志 kubectl logs -f nfs-provisioner-xxxxx --tail=200 | grep -i "mount failed" ``` **典型错误**: ``` mount.nfs: access denied by server while mounting 121.43.181.2:/data/nfs_pro ``` 4. **检查NFS服务器权限** **服务器端配置示例**: ```bash # /etc/exports 配置(允许K8s节点网段访问) /data/nfs_pro 192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check) ``` **生效配置**: ```bash exportfs -rav # 重新加载配置 showmount -e # 验证导出列表 ``` 5. **调整mountOptions** **在StorageClass中明确指定协议版本**: ```yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: nfs-client provisioner: k8s-sigs.io/nfs-subdir-external-provisioner mountOptions: - vers=3 # 根据服务器支持版本调整 - tcp # 强制使用TCP协议 - timeo=600 # 超时时间(单位:0.1秒) ``` --- #### 三、高级调试技巧 1. **手动模拟Provisioner操作** ```bash # 在任意节点执行挂载测试 mount -t nfs -o vers=4.1 121.43.181.2:/data/nfs_pro /mnt/test # 观察返回错误代码(exit status 32通常表示参数错误或权限问题) ``` 2. **检查Kubelet挂载缓存** ```bash # 清理旧挂载记录 umount /var/lib/kubelet/pods/*/volumes/kubernetes.io~nfs/* systemctl restart kubelet ``` 3. **NFS协议抓包分析** ```bash # 在NFS服务器执行 tcpdump -i eth0 port 2049 -w nfs.pcap # 复现问题后分析数据包中的协议版本协商过程 ``` --- ### 总结流程图 ``` 动态供给失败排查流程 │ ├─ 1. Provisioner Pod是否正常运行? │ ├─ 是 → 下一步 │ └─ 否 → 检查RBAC/镜像拉取权限 │ ├─ 2. StorageClass的mountOptions是否匹配NFS服务器版本? │ ├─ 是 → 下一步 │ └─ 否 → 调整vers参数 │ ├─ 3. 节点手动挂载是否成功? │ ├─ 是 → 检查Provisioner日志 │ └─ 否 → 排查NFS服务器权限/网络 │ └─ 4. 查看Provisioner日志中的具体错误信息 ``` --相关问题--: 1. 如何为不同的应用分配独立的NFS子目录? 2. Kubernetes中如何实现NFS存储的访问模式控制(ReadWriteOnce/ReadWriteMany)? 3. 动态供给场景下如何实现存储配额管理? : 协议版本不匹配是NFS挂载失败的常见原因,需确保客户端与服务端使用兼容的版本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值