背景介绍

公司新上的一套系统,系统全部容器化,采用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有问题,但是还是用了(_^_)。吸取教训,故成此文。

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐