故障排除-------K8s挂载集群外NFS异常
故障排除-------K8s挂载集群外NFS异常
- 1. 故障现象
- 2. 原因梳理
- 2.1 排查思路
- 2.2 确认yaml内容
- 2.3 创建k8s内的nfs测试
- 2.3.1 创建nfs和svc
- 2.3.2 测试创建pvc
- 2.3.3 测试结果
- 2.4 NFS服务端故障排除
- 2.4.1 网络阻断排除
- 2.4.2 排除服务状态问题
- 2.4.3 排查NFS权限问题
- 3. 故障排除
1. 故障现象
- nfs可以在任意节点挂载.
- nfs csi正确安装
- sc也能被正确创建,但pv未被创建,pvc无法被绑定
2. 原因梳理
2.1 排查思路
问题可能发生的点无法以下2个
一. NFS的客户端(即k8s端)
k8s端可能出现的问题无非2部分
- csi配置问题
- yaml写的有问题
排查方法: - 由于csi我们重新部署过了,所以暂时忽略这个
- 确认storageclass和pvc的yaml内容是否正确.
- 在k8s集群中创建nfs看是否正常挂载pvc
二. NFS服务提供端的问题 - 排查NFS服务端网络防火墙,selinux
- 排查NFS服务端的服务状态
- 排查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