Netapp 存储卷无法挂载pod

文章目录

    • [1. 现象](#1. 现象)
    • [2. 修复宿主机服务状态 (必须执行)](#2. 修复宿主机服务状态 (必须执行))
    • [3. 修正 SELinux 策略 (OCP 特有)](#3. 修正 SELinux 策略 (OCP 特有))
    • [4. 手动模拟挂载测试 (定位真因)](#4. 手动模拟挂载测试 (定位真因))
    • [5. 优化 StorageClass 参数 (针对 Trident)](#5. 优化 StorageClass 参数 (针对 Trident))
    • [6. 总结](#6. 总结)

1. 现象

bash 复制代码
Warning  FailedScheduling        6m10s (x5 over 6m15s)  default-scheduler        0/6 nodes are available: pod has unbound immediate PersistentVolumeClaims. preemption: 0/6 nodes are available: 6 Preemption is not helpful for scheduling.
Normal   Scheduled               6m10s                  default-scheduler        Successfully assigned prometheus/alertmanager-prometheus-kube-prometheus-alertmanager-0 to worker02.ocp.bsgchina.com
Normal   SuccessfulAttachVolume  6m5s                   attachdetach-controller  AttachVolume.Attach succeeded for volume "pvc-fa6e5c19-b8ec-4b83-ad76-6a860667aded"
Warning  FailedMount             115s (x10 over 6m5s)   kubelet                  MountVolume.SetUp failed for volume "pvc-fa6e5c19-b8ec-4b83-ad76-6a860667aded" : rpc error: code = Internal desc = error mounting NFS volume 192.168.22.196:/trident_pvc_fa6e5c19_b8ec_4b83_ad76_6a860667aded on mountpoint /var/lib/kubelet/pods/fa4afba4-ab1b-49c4-8119-b75c1b64df2a/volumes/kubernetes.io~csi/pvc-fa6e5c19-b8ec-4b83-ad76-6a860667aded/mount: exit status 32

在 OpenShift (OCP) 环境下,rpcinfo 测试通过说明网络连通性(111, 2049 端口)没问题,但 exit status 32 依然存在,且 mountOptions 已经包含了 nfsvers=3

这通常意味着 Worker 节点宿主机上的 NFS 客户端服务未完全就绪 ,或者是 SELinux 策略拦截

请按照以下步骤在 worker02(或报错节点)上执行深度修复:

2. 修复宿主机服务状态 (必须执行)

虽然 mount.nfs 二进制文件存在,但 RHCOS 上的 NFS 相关服务(如 rpcbindnfs-client.target)可能没有激活,导致内核无法处理挂载请求。

请再次进入调试模式:

Bash 复制代码
oc debug node/worker02.ocp.bsgchina.com

进入后执行以下命令:

Bash 复制代码
# 进入宿主机根目录
chroot /host

# 启动并启用 rpcbind
systemctl enable rpcbind --now

# 启动 NFS 客户端目标 (这是 RHCOS 处理挂载的关键)
systemctl enable nfs-client.target --now

# 检查服务状态
systemctl status rpcbind nfs-client.target

3. 修正 SELinux 策略 (OCP 特有)

OpenShift 默认的 SELinux 策略有时会阻止容器进程通过内核挂载 NFS 卷。

在上述 chroot /host 环境下执行:

Bash 复制代码
# 允许虚拟化/容器使用 NFS
setsebool -P virt_use_nfs 1

4. 手动模拟挂载测试 (定位真因)

chroot /host 环境下,手动尝试挂载报错信息中的路径,观察最原始的错误输出(这比 K8s 的 Event 更准确):

Bash 复制代码
sh-5.1# chroot /host
sh-5.1# mkdir -p /tmp/manual_test
sh-5.1#  mount -t nfs -o nfsvers=3,nolock 192.168.22.196:/test_root /tmp/manual_test
mount.nfs: access denied by server while mounting 192.168.22.196:/test_root
sh-5.1# which mount.nfs
/usr/sbin/mount.nfs
sh-5.1#
  • 如果提示 Permission denied :说明 NetApp 端的 Export Policy (导出策略) 没有允许 Worker 节点的 IP。你需要联系存储管理员,在 NetApp 上把所有 Worker 节点的 IP 加到对应 Volume 的只读/读写权限中。
  • 如果提示 Protocol not supported :尝试改用 nfsvers=4.1

真相大白了!报错 mount.nfs: access denied by server 是最直接的证据。

结论:这就是 NetApp 存储端的权限问题

你的 OCP 节点工具是全的,网络也是通的,但 NetApp 存储拒绝了这台机器的挂载请求

这是因为在 NetApp 存储上,每个 NFS 卷(Volume)都关联了一个 Export Policy(导出策略) 。如果发起挂载的机器 IP(192.168.22.51/52/53 等)不在该策略的白名单内,存储就会报 access denied

你需要如何修复?(联系存储管理员或自查)

如果你或你的同事负责管理 NetApp,请确保执行以下操作:

  1. 找到对应的 Export Policy : 在 NetApp 管理界面或命令行中,找到分配给 ontap-nas-test 这个后端使用的 Export Policy。
  2. 添加规则(Rule) : 为该策略添加一条新规则,包含以下内容:
    1. Client Specification(客户端匹配) : 192.168.22.0/24 (或者列出所有 Worker 节点的具体 IP)。
    2. Access Protocols : nfs3 (或者 nfs)。
    3. Read-Only Access : anysys
    4. Read-Write Access : anysys
    5. Superuser Security : 必须设为 any sys(这非常重要!因为 K8s 挂载是以 root 身份执行的,如果 Superuser 不允许,就会报 Access Denied)。
  3. Trident 自动化的处理(长久之计) : 如果你希望 Trident 以后自动创建的卷都能正常挂载,你需要检查 Trident 的后端配置文件(backend.json)。
    1. 确保 exportPolicy 字段指向了一个已经配置好上述权限的策略。
    2. 或者在 backend.json 中配置 defaults: { "exportPolicy": "your_policy_name" }

登陆 ONTAP System Manager 添加读写权限。

5. 优化 StorageClass 参数 (针对 Trident)

Trident 在 ONTAP NAS 模式下,有时需要显式指定协议为 TCP。请尝试更新 SC:

Bash 复制代码
oc patch sc ontap-nas-test -p '{"mountOptions": ["nfsvers=3", "proto=tcp", "nolock"]}'

6. 总结

你现在的现象是 "工具在,服务没开" 或者 "权限被 SELinux 拦了"

  1. 先去执行 systemctl enable nfs-client.target --now
  2. 再执行 setsebool -P virt_use_nfs 1
  3. 如果还是 32 报错,那 100% 是 NetApp 存储端的 Export Policy 拦截了这几台新机器的 IP。
相关推荐
人间打气筒(Ada)3 小时前
k8s:CNI网络插件flannel与calico
linux·云原生·容器·kubernetes·云计算·k8s
江畔何人初5 小时前
pod的内部结构
linux·运维·云原生·容器·kubernetes
苦逼IT运维8 小时前
从 0 到 1 理解 Kubernetes:一次“破坏式”学习实践(一)
linux·学习·docker·容器·kubernetes
腾讯云开发者8 小时前
言出法随 -- Chaterm如何通过ASR精准操作K8S
云原生·容器·kubernetes
伟大的大威10 小时前
NVIDIA DGX Spark (ARM64/Blackwell) Kubernetes 集群 + GPU Operator 完整部署指南
大数据·spark·kubernetes
only_Klein11 小时前
kubernetes Pod 通信过程演示
网络·kubernetes·tcpdump
为什么不问问神奇的海螺呢丶11 小时前
n9e categraf k8s监控配置 -cadvisor
云原生·容器·kubernetes
炸裂狸花猫11 小时前
开源域名代理与流量限制方案 - Cloudflare + Ingress + 自签名证书
运维·云原生·容器·kubernetes·cloudflare·waf·免费域名证书
only_Klein12 小时前
jenkins流水线报错:Connection reset by peer
ci/cd·kubernetes·gitlab·jenkins·ssl
南宫乘风12 小时前
Kubernetes 网络问题排查:在宿主机对 Pod 抓包(nsenter + tcpdump 实战)
网络·kubernetes·tcpdump