记一次nfs storageclass引起的产线故障
背景介绍公司新上的一套系统,系统全部容器化,采用Spring Boot开发,部署在自建的K8S里面。使用nfs作为后端的storageclass,结合PVC动态创建PV,做数据持久化。早上上班就收到用户反应,页面打不开了。(项目才上线没有多久,主动监控还没有完善)。直接查看容器,发如下错误:Events:TypeReasonAgeFromMessage---------
背景介绍
公司新上的一套系统,系统全部容器化,采用Spring Boot开发,部署在自建的K8S里面。使用nfs作为后端的storageclass,结合PVC动态创建PV,做数据持久化。
早上上班就收到用户反应,页面打不开了。(项目才上线没有多久,主动监控还没有完善)。直接查看容器,发如下错误:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled <unknown> default-scheduler Successfully assigned yg-cmp-prd/cmp-ansible-5dbcf685b5-x2pjl to 10.128.148.196
Warning FailedMount 4m29s kubelet, 10.128.148.196 Unable to attach or mount volumes: unmounted volumes=[ssh-persistent-storage], unattached volumes=[files-script default-token-dmgpz ssh-persistent-storage files-node-exporter]: timed out waiting for the condition
Warning FailedMount 2m15s (x3 over 9m1s) kubelet, 10.128.148.196 Unable to attach or mount volumes: unmounted volumes=[ssh-persistent-storage], unattached volumes=[ssh-persistent-storage files-node-exporter files-script default-token-dmgpz]: timed out waiting for the condition
问题调研
报错很明显,容器挂不了pv。于是开始去调研问题。
1. 查看storageclass 后端的nfs是否可以挂载到本地并正常读写文件 - 结果: 正常
2. 使用storageclass 创建一个新的容器和新的PVC挂载使用,看是否可以挂载成功 - 结果: 失败,报错和上面的截图一致无法,挂载volume
3. 联想到之前阿里云的nfs挂载时,一直强调要配置的一个参数noresvport(参考文档: https://help.aliyun.com/document_detail/121264.html),在worker节点中去查看是否有这个参数。 - 结果: 没有配置
4. 尝试给storageclass添加noresvport参数,并重新创建新的pod和pvc - 结果: 可以正常创建和挂载,但是速度很慢(这个和使用nfs产品有问题,这个是已知问题,所以后面将nfs直接迁移走了)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs
mountOptions:
- noresvport
- vers=3
parameters:
archiveOnDelete: "false"
provisioner: nfs-client-provisioner
reclaimPolicy: Delete
volumeBindingMode: Immediate
5. 尝试修改在已经创建的PV中添加noresvport参数 - 结果: 失败,就是已经创建成功的PV好像是不能改的(如果有知道怎么改的,麻烦私信给我)
6. 考虑到现在使用的nfs产品有问题,以及无法修改已经建好的pv.决定迁移PV。方法如下:
a. 创建一个新的storageclass 并配置moutOptions中添加noresvport参数。
b. 将老的nfs挂载到本地,并备份所有的PV数据
c. 删除所有老的PVC和PV,重新使用新的storageclass创建PVC和PV
d.通过名称对应,将老的PV数据拷贝到新的PV目录中
e. 应用正常运行
写在后面:
搜索了一下noresvport这个参数的作用,官方的解释如下:
resvport / noresvport
Specifies whether the NFS client should use a privileged source port when communicating with an NFS server for this mount point. If this option is not specified, or the resvport option is specified, the NFS client uses a privileged source port. If the noresvport option is specified, the NFS client uses a non-privileged source port. This option is supported in kernels 2.6.28 and later.
我也不知道这个 privileged source port是什么意思(1024以下端口?),但是阿里云一直强调要配置noresvport 这个参数。
这个参数没有配置导致我的产线停机几个小时,当然和老的nfs产品有问题也有关系。其实我们上线之前知道这个nfs有问题,但是还是用了(_^_)。吸取教训,故成此文。
更多推荐
所有评论(0)