k8s nfs mount参数配置研究

近期遇到一个问题:某网元yaml中配置了nfs地址及挂载目录,当nfs异常时,网元进程读nfs挂载目录超时卡住,导致线程占满,无法响应k8s心跳检测,一段时间后,k8s重启该网元pod,在终止pod时,由于nfs异常,umount卡住,导致pod一直处于Terminating状态。

为解决上述问题,需要实现如下两点:

  1. nfs异常,读目录不挂住
  2. nfs异常,pod删除不挂住

针对上述第一个疑难,研究nfs参数配置文件:/etc/nfsmount.conf,其中如下几个参数引起我的注意:

# The number of times a request will be retired before
# generating a timeout
# Retrans=2
#
# The number of minutes that will retry mount
# Retry=2
#
# How to handle times out from servers (Hard is STRONGLY suggested)
# Hard=True
# Soft=False
# The amount of time, in tenths of a seconds, the client
# will wait for a response from the server before retransmitting
# the request.
# Timeo=600

网上对上述几个参数的含义及配置值说明五花八门,因此我对这几个参数进行了测试验证,测试环境:一台环境用于启停NFS服务(命令:systemctl start/stop nfs-server.service),另外一台设备做目录挂载用:

(1)Retry=2,表示mount的超时时间,单位是分钟,超过这个时间mount报失败

关闭nfs,分别设置1分钟和2分钟进行测试mount;测试结果证明Retry含义确为mount超时时间,单位分钟。

k8s nfs mount参数配置研究_第1张图片

(2)Soft=True,Soft方式挂载系统,若NFS请求超时,则客户端向调用程序返回错误;如果使用Hard方式则客户端一直重新请求直至成功。默认为Hard。

默认Hard模式,是读和umount挂住的主要原因,为解决上述问题,需要改为Soft模式。

(3)Timeo=10,客户端请求超时时间(以十分之一秒为单位

这个配置,很多文章都说是客户端请求重传前等待时间,含义不好理解,其实就是一次请求的超时时间;单位有的说是秒,有的说是0.1秒,有的说是0.7秒,测试发现单位是0.1秒。

timeo分别设置10和20进行测试,重试次数retrans都是2(加上本身的1次,总次数为3次),测试结果如下,总超时时间分别是3秒和6秒,符合预期,单位是0.1秒:

k8s nfs mount参数配置研究_第2张图片

(4)Retrans=2,请求重试次数

经测试单位是测试,非时间,测试结果如下:

k8s nfs mount参数配置研究_第3张图片

经过上述研究,进行如下配置修改后,读取不再超时,pod也能正常删除,不再挂住了。

ps.

1、若pod一直处于Terminating,也可以强制删除:kubectl delete pod foo --grace-period=0 --force

2、可使用umount -l -f 执行强制umount操作

3、也可以先建立本地目录,让本地目录mount nfs设备,再将本地目录通过hostpath挂载到容器中,这样不管参数是否设置,pod均能删除,但是如果不设置参数,读取还会挂住

 

你可能感兴趣的:(k8s,nfs)