1. 故障现象

  1. nfs可以在任意节点挂载.
    在这里插入图片描述
  2. nfs csi正确安装
    在这里插入图片描述
  3. sc也能被正确创建,但pv未被创建,pvc无法被绑定
    在这里插入图片描述

2. 原因梳理

2.1 排查思路

问题可能发生的点无法以下2个
一. NFS的客户端(即k8s端)
k8s端可能出现的问题无非2部分

  1. csi配置问题
  2. yaml写的有问题
    排查方法:
  3. 由于csi我们重新部署过了,所以暂时忽略这个
  4. 确认storageclass和pvc的yaml内容是否正确.
  5. 在k8s集群中创建nfs看是否正常挂载pvc
    二. NFS服务提供端的问题
  6. 排查NFS服务端网络防火墙,selinux
  7. 排查NFS服务端的服务状态
  8. 排查NFS服务端权限

2.2 确认yaml内容

storageclass

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-csi
provisioner: nfs.csi.k8s.io
parameters:
  server: 192.168.31.6
  share: /nfs
  # csi.storage.k8s.io/provisioner-secret is only needed for providing mountOptions in DeleteVolume
  # csi.storage.k8s.io/provisioner-secret-name: "mount-options"
  # csi.storage.k8s.io/provisioner-secret-namespace: "default"
reclaimPolicy: Retain
volumeBindingMode: Immediate
mountOptions:
  - nfsvers=4.1

pvc

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc-default
  namespace: default
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 100Mi
  storageClassName: nfs-csi

看上去yaml内容没什么问题

2.3 创建k8s内的nfs测试

2.3.1 创建nfs和svc

---
kind: Service
apiVersion: v1
metadata:
  name: nfs-server
  namespace: default
  labels:
    app: nfs-server
spec:
  type: ClusterIP  # use "LoadBalancer" to get a public ip
  selector:
    app: nfs-server
  ports:
    - name: tcp-2049
      port: 2049
      protocol: TCP
    - name: udp-111
      port: 111
      protocol: UDP
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: nfs-server
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-server
  template:
    metadata:
      name: nfs-server
      labels:
        app: nfs-server
    spec:
      nodeSelector:
        "kubernetes.io/os": linux
      containers:
        - name: nfs-server
          image: registry.cn-hangzhou.aliyuncs.com/qiuqin/nfs-server-alpine:latest
          env:
            - name: SHARED_DIRECTORY
              value: "/exports"
          volumeMounts:
            - mountPath: /exports
              name: nfs-vol
          securityContext:
            privileged: true
          ports:
            - name: tcp-2049
              containerPort: 2049
              protocol: TCP
            - name: udp-111
              containerPort: 111
              protocol: UDP
      volumes:
        - name: nfs-vol
          hostPath:
            path: /nfs-vol  # modify this to specify another path to store nfs share data
            type: DirectoryOrCreate

2.3.2 测试创建pvc

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-csi2
provisioner: nfs.csi.k8s.io
parameters:
  server: nfs-server.default.svc.cluster.local.
  share: /
  # csi.storage.k8s.io/provisioner-secret is only needed for providing mountOptions in DeleteVolume
  # csi.storage.k8s.io/provisioner-secret-name: "mount-options"
  # csi.storage.k8s.io/provisioner-secret-namespace: "default"
reclaimPolicy: Retain
volumeBindingMode: Immediate
mountOptions:
  - nfsvers=4.1
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc2-default
  namespace: default
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 110Mi
  storageClassName: nfs-csi2

2.3.3 测试结果

测试下来可以看到sc,pv,pvc都正常被创建.
证明我们的yaml是没有问题的,那么问题可能出在NFS服务端
在这里插入图片描述

2.4 NFS服务端故障排除

2.4.1 网络阻断排除

排除了防火墙和selinux的可能性
在这里插入图片描述
在node节点上可以获取到nfs并挂载读取到nfs的内容
在这里插入图片描述

2.4.2 排除服务状态问题

刚才已经挂载上了,说明服务也是没有问题的
在这里插入图片描述

2.4.3 排查NFS权限问题

这里我们看到 nfs的权限是:

/nfs *(rw)

在这里插入图片描述
乍一看没什么问题,但我们来到node节点对nfs进行写操作时发现没有权限.
可我们明明(rw)了为啥没权限写入,可能问题就在这里了.
在这里插入图片描述
修改/etc/export,并重启nfs-utils服务

/nfs 192.168.31.0/24(rw,no_root_squash)

在这里插入图片描述
重新挂载并尝试写入数据到nfs
在这里插入图片描述
可以看到这里写入操作不再报错

3. 故障排除

尝试重建sc和pvc,可以看到pvc被正常绑定到了pv
在这里插入图片描述
回到nfs服务器也可以看到/nfs下对应的pvc目录被创建
在这里插入图片描述
我们再建个pod看下

---
apiVersion: v1
kind: Pod
metadata:
  name: nginx-nfs-example
  namespace: default
spec:
  containers:
    - image: harbor.panasonic.cn/test-nginx/nginx-web:v2.0.0
      name: nginx
      ports:
        - containerPort: 80
          protocol: TCP
      volumeMounts:
        - mountPath: /var/www
          name: pvc-nginx
          readOnly: false
  volumes:
    - name: pvc-nginx
      persistentVolumeClaim:
        claimName: nfs-pvc-default

可以看到目录被正常挂载到了pod的/var/www
在这里插入图片描述
在容器中创建一个文件,并在nfs服务器上可以正常读取到
在这里插入图片描述
至此K8s集群可以正常挂载集群外的NFS了
常见的NFS CSI除了本文中的csi-nfs之外还有nfs-subdir-external-provisioner
csi-nfs它的官网在:
https://github.com/kubernetes-csi/csi-driver-nfs
nfs-subdir-external-provisioner它的官网在:
https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部