GKE集群节点减少导致持久卷无法挂载的问题及解决方案

37次阅读
没有评论

问题描述

在使用Google Kubernetes Engine(GKE)中遇到一个问题:他的集群中有一个简单的存储设置,包括NFS服务器、持久卷(PV)、持久卷声明(PVC)以及部署。集群版本为1.19.12-gke.2101。当集群从4个节点缩减为3个节点后,部署无法将NFS卷挂载到第二个Pod上,尽管对第一个Pod来说一切正常。具体表现是第二个Pod一直处于挂起状态,出现以下信息:

namespace   pods-name-768dd46757-t5l2d              1/1     Running                 0          19m
namespace   pods-name-768dd46757-zqr9l              0/1     ContainerCreating       0          18m

并且出现以下错误信息:

Unable to attach or mount volumes: unmounted volumes=[my-nfs-volume]: timed out waiting for the condition

用户提供了PV和PVC的配置,没有特殊设置,accessModes设置为ReadWriteMany,这里是PV和PVC的配置示例。

PV配置:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-nfs-volume
spec:
  accessModes:
    - ReadWriteMany
  capacity:
    storage: 100Mi
  nfs:
    path: /
    server: my-nfs-server.my-namespace.svc.cluster.local
  persistentVolumeReclaimPolicy: Retain
  volumeMode: Filesystem

PVC配置:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-nfs-volume
  namespace: my-namespace
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 100Mi
  storageClassName: ""
  volumeMode: Filesystem
  volumeName: my-nfs-volume

此外,用户在尝试了一个评论中提到的解决方案后,问题仍然存在。

解决方案

以下解决方案中提到的操作步骤可能因版本变化而有所不同,请在实施前确保备份相关数据。

最佳解决方案

问题可能与PV的persistentVolumeReclaimPolicy设置有关。当集群的节点数减少并且Pod被重新调度时,可能会发生PV无法挂载的情况。最好的解决方案是将persistentVolumeReclaimPolicy设置为Delete,以确保当节点数减少时,PVC会被删除。

以下是如何修改PV配置的步骤:
1. 编辑PV配置文件,将persistentVolumeReclaimPolicyRetain改为Delete
2. 使用kubectl应用修改后的配置文件:kubectl apply -f pv-config.yaml

修改后的PV配置如下:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-nfs-volume
spec:
  accessModes:
    - ReadWriteMany
  capacity:
    storage: 100Mi
  nfs:
    path: /
    server: my-nfs-server.my-namespace.svc.cluster.local
  persistentVolumeReclaimPolicy: Delete
  volumeMode: Filesystem

备选解决方案

如果最佳解决方案无法解决问题,您可以尝试使用一个脚本来手动管理Pod的启动顺序。以下是一个示例脚本,用于在启动Pod之前等待PV挂载就绪:

#!/bin/bash
# 启动Pod之前等待PV挂载就绪
kubectl scale deployment my-deployment --replicas=0
kubectl scale deployment my-deployment --replicas=1

在这个示例中,脚本首先将部署的副本数缩减为0,然后再增加为1,以此来重新启动Pod。这将导致Pod在重新启动时重新挂载PV。

请注意,这只是一个临时解决方案,可能会增加复杂性,并且需要额外的手动操作。

结论

当GKE集群的节点数减少时,可能会导致PV无法挂载到Pod上的问题。为了解决这个问题,您可以尝试修改PV的persistentVolumeReclaimPolicy设置为Delete,或者使用一个脚本来手动管理Pod的启动顺序,以确保PV挂载就绪。

希望以上解决方案能帮助您解决问题。如果问题仍然存在,请考虑查阅GKE官方文档或社区寻求更多帮助。

正文完