返回

云服务挂载存储卷失败探究与解决

后端

背景

今天在调整一个挂载了字体文件存储卷(对象存储)的 Deployment 的 Pod 数量时,报了如下错误导致服务无法启动。这里挂载的是腾讯云的对象存储( COS ),本身是支持多个节点( Node )同时挂载的。

mountpath: Operation not permitted

问题调查

首先,确认了存储卷( COS )没有问题。然后,检查了 Pod 的配置,发现挂载存储卷的方式是通过 volumeMountsvolumes 这两个字段。

volumeMounts:
  - name: font-volume
    mountPath: /var/fonts
volumes:
  - name: font-volume
    persistentVolumeClaim:
      claimName: font-pvc

进一步检查发现,font-pvc 是一个动态创建的 PVC ,它由一个 StorageClass 和一个卷绑定( VolumeBinding )组成。而这个卷绑定是通过一个 Finalizer 创建的,这个 Finalizer 会在 Pod 删除时自动删除卷绑定。

问题根源

通过分析发现,在调整 Pod 数量时,旧的 Pod 先被删除了,然后新的 Pod 被创建。在旧的 Pod 删除时,它的 Finalizer 会自动删除卷绑定。而新的 Pod 创建时,它会重新创建一个卷绑定。但是,由于新的 Pod 和旧的 Pod 并不相同,所以它们创建的卷绑定也不相同。这就导致了新的 Pod 无法挂载存储卷。

解决方法

为了解决这个问题,有两种方法:

  1. 在 Pod 的配置中,使用 terminationGracePeriodSeconds 来指定 Pod 删除时的宽限期。在这个宽限期内,旧的 Pod 不会被立即删除,这样新的 Pod 就有足够的时间来重新创建卷绑定。
  2. 在 Pod 的配置中,使用 finalizers 字段来指定一个自定义的 Finalizer 。这个 Finalizer 会在 Pod 删除时自动删除卷绑定。但是,当 Pod 重新创建时,这个 Finalizer 也会被自动删除。这样,新的 Pod 就能够重新创建一个卷绑定。

我们选择了第一种方法,在 Pod 的配置中添加了 terminationGracePeriodSeconds: 300 。这样,旧的 Pod 在删除时会延迟 300 秒,新的 Pod 就有足够的时间来重新创建卷绑定。

总结

通过分析问题根源并实施解决方案,我们成功地解决了 Pod 挂载存储卷失败的问题。在调整 Pod 数量时,需要注意 Pod 删除时的宽限期,以确保新的 Pod 有足够的时间来重新创建卷绑定。