通过kubectl的持久卷创建停留在Pending状态

时间:2016-03-15 01:41:44

标签: kubernetes

我正在尝试通过kuberctl create -f pv-definition.json创建pv和pvc资源,但k8s没有取得任何进展,它只是为它们报告了Pending个状态。

查看了kubectl get events并从apicontroller开始记录,但我没有看到任何与pv或pvc创建相关的消息。我预先在gcloud上创建了磁盘,并且我已经验证了名称和磁盘大小匹配。

pv定义非常基础:

{
  "apiVersion": "v1",
  "kind": "PersistentVolume",
  "metadata": {
    "name": "test-0b-pv"
  },
  "spec": {
    "accessModes": [
      "ReadWriteOnce"
    ],
    "capacity": {
      "storage": "50Gi"
    },
    "gcePersistentDisk": {
      "fsType": "ext4",
      "pdName": "test-0b"
    },
    "persistentVolumeReclaimPolicy": "Retain"
  }
}

有没有人有任何调试建议?我重新启动了k8s-master服务无济于事。

4 个答案:

答案 0 :(得分:5)

我有同样的问题并通过向PV和PVC明确添加storageClassName: value来解决它。对于该值,我使用了standard

在这种情况下,问题可能是由DefaultStorageClass配置引起的。 有关详细信息,请参阅:https://kubernetes.io/docs/concepts/storage/persistent-volumes/#class-1

答案 1 :(得分:2)

以上大多数答案从inconsistent or incorrect存储类的角度写了一个解决方案,特别是在PersistentVolumeClaims中没有提供存储类的情况下,但是我们在这里可能有不同的原因(如下所述)

问题陈述:

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

说明:

  • 我们在"persistentVolumeReclaimPolicy": "Retain"中有PersistentVolume(默认为保留政策)
  • 如果我们删除了PersistentVolumeClaim,则PersistentVolume仍然存在,并且该卷被视为released。但是,该数据尚不能用于其他claim,因为先前的原告的数据仍保留在该卷上。
  • 因此您需要通过以下步骤手动回收该卷:

解决方案:

  1. 删除PersistentVolume(相关的基础存储资产/资源,例如EBS,GCE PD,Azure Disk等...将不会被删除,仍然存在)
  2. 可选)相应地手动清除关联存储资产上的数据
  3. 可选)手动删除关联的存储资产(EBS,GCE PD,Azure Disk等)

注意,如果您仍然需要相同的数据,只需使用相同的存储资产定义创建一个新的PersistentVolume,那么再次创建PersistentVolumeClaim应该很好。

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

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

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

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

答案 2 :(得分:0)

我也感到困惑……我正在使用头盔部署Redis服务器。我创建了一个PV,但是redis PVC无法使用它。我就像...哇啊?

然后我在文档中找到了。

  

PVC不一定必须要求上课。 PVC及其   设置为等于“”的storageClassName始终被解释为   请求没有类别的PV,因此只能绑定到没有类别的PV   类(无注释或一组等于“”)。

Ahh ...因此,不表达偏好,而是表达不偏好的偏好。 (是的,这一点一点都没有引起混淆)。

因此,我使用名为pv-volume.yaml的文件创建了PV

kind: PersistentVolume
apiVersion: v1
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
  storageClassName:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

然后

kubectl apply -f pv-volume.yaml

中提琴! Redis Pod接过它。

答案 3 :(得分:0)

您应该检查是否为集群设置了存储类:

kubectl get sc

由于您没有在此处指定任何storageClassName,它将尝试获取默认值。如果默认值不存在或不是gce而是其他值,则它将保持待处理状态。

您将需要先为gce注册一个存储类,然后它应该可以工作。您可以像这样为gce创建存储类:

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: gce
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard
  replication-type: none

然后您需要在PVC中添加storageClassName使其起作用