Kubernetes持续量申请无限期待定

时间:2017-07-03 17:38:48

标签: 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

然后我创建了一个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都可以从中读取?

9 个答案:

答案 0 :(得分:38)

我很快意识到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

答案 1 :(得分:12)

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

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

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

答案 2 :(得分:5)

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

只需:

microk8s.enable storage

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

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

您可以先查找姓名列表来完成此操作:

kubectl get pvc --all-namespaces

然后使用以下命令删除每个名称:

kubectl delete pvc name1 name2 etc...

启用存储后,重新应用部署将使事情进展顺利。

答案 3 :(得分:3)

遇到了同样的问题,但这是为什么我在这里分享它以帮助社区的另一个原因。

如果您删除了PersistentVolumeClaim,然后再次使用相同的定义重新创建,它将永远待定,为什么?

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

  1. 删除PersistentVolume(相关的基础存储资产/资源,例如EBS,GCE PD,Azure Disk等...将不会被删除,仍然存在)

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

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

如果您仍然需要相同的数据,则可以跳过清理和删除关联的存储资产的操作(上述步骤2和3),因此只需简单地使用相同的存储资产定义重新创建新的PersistentVolume即可,再次创建PersistentVolumeClaim很好。

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

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

删除:已删除关联的存储资产,例如AWS EBS, GCE PD, Azure Disk, or OpenStack Cinder...etc

有关更多信息,请检查kubernetes documentation

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

答案 4 :(得分:1)

我遇到了同样的问题,并且意识到k8s实际上是在提供即时的服务,即

  • 创建pvc时,它将保持PENDING状态,并且不会创建相应的pv。
  • 只有在创建使用pvc的部署后,才能创建pvc和pv(EBS卷)。

我正在将EKS与kubernetes版本@media screen and (-webkit-min-device-pixel-ratio: 0) { /* Safari and Chrome */ .mbox{ height: -webkit-calc(100vh - 60px); } /* Safari only override */ ::i-block-chrome, .mbox{ height: -webkit-calc(100vh - 85px); } /* or Safari only override */ _::-webkit-full-page-media, _:future, :root , .mbox{ height: -webkit-calc(100vh - 85px); } } 一起使用,并且其行为由StorageClass Volume Binding Mode控制。

答案 5 :(得分:1)

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

答案 6 :(得分:0)

microk8s 1.14.1中,当两个PersistentVolume的{​​{1}}值相同时,例如

spec/hostPath/path

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

答案 7 :(得分:0)

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

答案 8 :(得分:-1)

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

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

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

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