Kubernetes持续交易量无可置疑地处于待定状态

Aka*_*nan 31 kubernetes persistent-volumes persistent-volume-claims

我创建了一个源自Google Compute Engine永久磁盘的PersistentVolume,我已经格式化并提供了数据.Kubernetes说PersistentVolume可用.

kind: PersistentVolume
apiVersion: v1
metadata:
  name: models-1-0-0
  labels:
    name: models-1-0-0
spec:
  capacity:
    storage: 200Gi
  accessModes:
    - ReadOnlyMany
  gcePersistentDisk:
    pdName: models-1-0-0
    fsType: ext4
    readOnly: true
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个PersistentVolumeClaim,以便我可以将此卷附加到多个节点上的多个pod.然而,kubernetes无限期地说它处于待决状态.

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: models-1-0-0-claim
spec:
  accessModes:
    - ReadOnlyMany
  resources:
    requests:
      storage: 200Gi
  selector:
    matchLabels:
      name: models-1-0-0
Run Code Online (Sandbox Code Playgroud)

任何见解?我觉得选择器可能有问题......

甚至可以预先配置一个包含数据的永久磁盘,并且多个节点上的pod都可以从中读取吗?

Aka*_*nan 43

我很快意识到PersistentVolumeClaim 在未指定时将storageClassName字段默认为standard.但是,在创建PersistentVolume时,storageClassName没有默认值,因此选择器找不到匹配项.

以下对我有用:

kind: PersistentVolume
apiVersion: v1
metadata:
  name: models-1-0-0
  labels:
    name: models-1-0-0
spec:
  capacity:
    storage: 200Gi
  storageClassName: standard
  accessModes:
    - ReadOnlyMany
  gcePersistentDisk:
    pdName: models-1-0-0
    fsType: ext4
    readOnly: true
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: models-1-0-0-claim
spec:
  accessModes:
    - ReadOnlyMany
  resources:
    requests:
      storage: 200Gi
  selector:
    matchLabels:
      name: models-1-0-0
Run Code Online (Sandbox Code Playgroud)

  • 运行`kubectl describe pvc`确认这是否是错误,你会得到""无法绑定到请求的卷"YOUR_PV_NAME":storageClasseName不匹配"` (4认同)
  • +1 在使用 kops 的 AWS EC2 集群设置中也存在此问题。为了正确连接 PV/PVC,我必须在两者中添加 `storageClassName: gp2`。有一些关于 [设置存储类](https://docs.aws.amazon.com/eks/latest/userguide/storage-classes.html) 的相关文档适用于您的 AWS 集群和 [可用的 EBS 卷类型]( https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumeTypes.html)出于某种原因,我没有收到@s12chung 指出的错误消息 (2认同)

Ani*_*han 12

通过动态配置,您不必单独创建PV和PVC.在Kubernetes 1.6+中,有GKE和其他一些云环境的默认配置程序,它们可以让您创建一个PVC并让它自动为您提供PV和底层永久磁盘.

有关动态配置的更多信息,请参阅:

https://kubernetes.io/blog/2017/03/dynamic-provisioning-and-storage-classes-kubernetes/


Lon*_*Rob 9

如果您使用的是 Microk8s,则必须先启用存储,然后才能成功启动 PersistentVolumeClaim。

做就是了:

microk8s.enable storage
Run Code Online (Sandbox Code Playgroud)

您需要删除部署并重新开始。

您可能还需要手动删除“待处理”的 PersistentVolumeClaims,因为我发现卸载创建它们的 Helm 图表并没有清除 PVC。

您可以通过首先查找名称列表来执行此操作:

kubectl get pvc --all-namespaces
Run Code Online (Sandbox Code Playgroud)

然后删除每个名称:

kubectl delete pvc name1 name2 etc...
Run Code Online (Sandbox Code Playgroud)

启用存储后,重新应用您的部署应该会让事情顺利进行。


Eri*_*ang 8

我面临着同样的问题,并意识到 k8s 实际上做了一个即时供应,即

  • 当pvc创建时,它处于PENDING状态,并且没有创建相应的pv。
  • 仅在创建使用 pvc 的部署后才会创建 pvc 和 pv(EBS 卷)。

我正在使用带有 kubernetes 版本的 EKS ,其行为由StorageClass Volume Binding Mode1.16控制。


Muh*_*man 6

有同样的问题,但这是另一个原因,这就是我在这里分享它以帮助社区的原因。

如果你已经删除PersistentVolumeClaim然后用相同的定义重新创建它,它将永远挂起,为什么?

persistentVolumeReclaimPolicyRetain默认情况下PersistentVolume。如果我们删除了PersistentVolumeClaim,则PersistentVolume仍然存在并且该卷被视为已释放。但它尚不可用于其他索赔,因为前一个索赔人的数据仍保留在卷上。因此您需要通过以下步骤手动回收卷:

  1. 删除 PersistentVolume(相关的底层存储资产/资源,如 EBS、GCE PD、Azure 磁盘等将不会被删除,仍然存在)

  2. (可选)相应地手动清理关联存储资产上的数据

  3. (可选)手动删除关联的存储资产(EBS、GCE PD、Azure 磁盘等)

如果您仍然需要相同的数据,您可以跳过清理和删除关联的存储资产(上面的第 2 步和第 3 步),因此只需简单地重新创建一个PersistentVolume具有相同存储资产定义的新数据,然后您应该可以PersistentVolumeClaim再次创建。

最后要提及Retain的不是 的唯一选项persistentVolumeReclaimPolicy,以下是您可能需要根据用例场景使用或尝试的其他一些选项:

Recycle:对卷(例如rm -rf //*)执行基本清理- 使其再次可用于新的声明。只有NFSHostPath支持回收。

删除AWS EBS, GCE PD, Azure Disk, or OpenStack Cinder...etc删除卷等关联的存储资产

有关更多信息,请查看kubernetes 文档

仍然需要更多说明或有任何疑问,请随时发表评论,我将非常乐意澄清和提供帮助。