56

我创建了一个来自 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

然后我创建了一个 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

有什么见解吗?我觉得选择器可能有问题......

是否有可能预先配置一个带有数据的永久磁盘,并让跨多个节点的 pod 都能够从中读取?

4

11 回答 11

73

我很快意识到 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
于 2017-07-03T17:45:33.603 回答
16

使用动态配置,您不必分别创建 PV 和 PVC。在 Kubernetes 1.6+ 中,有 GKE 和其他一些云环境的默认配置器,它应该让您只需创建一个 PVC 并让它自动为您配置一个 PV 和一个底层持久磁盘。

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

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

于 2017-07-04T01:34:44.910 回答
12

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

做就是了:

microk8s.enable storage

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

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

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

kubectl get pvc --all-namespaces

然后删除每个名称:

kubectl delete pvc name1 name2 etc...

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

于 2020-02-13T17:55:31.360 回答
8

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

如果您已删除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 文档

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

于 2020-07-06T20:10:16.917 回答
5

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

  • 当一个 pvc 被创建时,它一直处于 PENDING 状态,并且没有相应的 pv 被创建。
  • pvc & pv(EBS 卷)仅在您创建使用 pvc 的部署后创建。

我正在使用带有 kubernetes 版本1.16的 EKS,并且行为由StorageClass Volume Binding Mode控制。

于 2020-07-07T07:00:38.510 回答
1

当您想手动将 PVC 绑定到具有现有磁盘的 PV 时,storageClassName不应指定...但是...云提供商默认设置了“标准”StorageClass,使其始终输入您在修补时尝试的任何内容PVC/PV。

您可以检查您的提供商在执行时将其设置为默认值kubectl get storageclass(它将被写为“(默认”))。

要解决此问题,最好的方法是获取现有的 StorageClass YAML 并添加此注释:

  annotations:
    storageclass.kubernetes.io/is-default-class: "false"

申请和好:)

于 2022-02-01T14:10:45.747 回答
1

我在 apache 气流(稳定)的 helmchart 上遇到了这个问题,将 storageClass 设置为 azurefile 有帮助。在这种情况下,您应该与云提供商一起做什么?只需搜索支持所需访问模式的存储类即可。ReadWriteMany 意味着同时有许多进程将读取和写入存储。在这种情况下(天蓝色)它是 azurefile。

path: /opt/airflow/logs

  ## configs for the logs PVC
  ##
  persistence:
    ## if a persistent volume is mounted at `logs.path`
    ##
    enabled: true

    ## the name of an existing PVC to use
    ##
    existingClaim: ""

    ## sub-path under `logs.persistence.existingClaim` to use
    ##
    subPath: ""

    ## the name of the StorageClass used by the PVC
    ##
    ## NOTE:
    ## - if set to "", then `PersistentVolumeClaim/spec.storageClassName` is omitted
    ## - if set to "-", then `PersistentVolumeClaim/spec.storageClassName` is set to ""
    ##
    storageClass: "azurefile"

    ## the access mode of the PVC
    ##
    ## WARNING:
    ## - must be: `ReadWriteMany`
    ##
    ## NOTE:
    ## - different StorageClass support different access modes:
    ##   https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes
    ##
    accessMode: ReadWriteMany

    ## the size of PVC to request
    ##
    size: 1Gi
于 2020-12-28T08:24:13.423 回答
1

我在microk8s1.14.1 中看到了这种行为,当两个PersistentVolumes 具有相同的值时spec/hostPath/path,例如

kind: PersistentVolume
apiVersion: v1
metadata:
  name: pv-name
  labels:
    type: local
    app: app
spec:
  storageClassName: standard
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/k8s-app-data"

似乎 microk8s 是基于事件的(这在单节点集群上不是必需的)并且会丢弃有关任何失败操作的信息,从而导致几乎所有失败的不必要的可怕反馈。

于 2019-05-04T11:26:38.900 回答
0

我正在使用 microk8s

通过运行以下命令修复了问题

systemctl start open-iscsi.service

(使用之前安装了 open-iscsiapt install open-iscsi但尚未启动它)

然后启用存储如下

microk8s.enable storage

然后,从 Lens 中删除 Stateful Sets 和未决的 Persistence Volume Claims,这样我就可以重新开始了。

之后工作得很好。

于 2021-09-05T19:11:38.080 回答
-1

我遇到了 PersistentVolumeClaim 无限期处于待处理阶段的相同问题,我尝试在 PersistentVolume 中将 storageClassName 提供为“默认”,就像我为 PersistentVolumeClaim 所做的那样,但它没有解决这个问题。

我在我的 persistentvolume.yml 中进行了一项更改,并将 PersistentVolumeClaim 配置移到文件顶部,然后将 PersistentVolume 作为 yml 文件中的第二个配置。它已经解决了这个问题。

我们需要确保首先创建 PersistentVolumeClaim,然后再创建 PersistentVolume 以解决此“待定”阶段问题。

我在测试了几次后发布了这个答案,希望它可以帮助那些挣扎的人。

于 2018-09-12T01:48:40.090 回答
-4

确保您的 VM 也有足够的磁盘空间。

于 2019-05-10T20:56:05.857 回答