我正在尝试通过kuberctl create -f pv-definition.json
创建pv和pvc资源,但k8s没有取得任何进展,它只是为它们报告了Pending
个状态。
查看了kubectl get events
并从api
和controller
开始记录,但我没有看到任何与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服务无济于事。
答案 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
,因为先前的原告的数据仍保留在该卷上。解决方案:
PersistentVolume
(相关的基础存储资产/资源,例如EBS,GCE PD,Azure Disk等...将不会被删除,仍然存在)请注意,如果您仍然需要相同的数据,只需使用相同的存储资产定义创建一个新的PersistentVolume
,那么再次创建PersistentVolumeClaim
应该很好。
最后要提到的是,Retain
不是persistentVolumeReclaimPolicy
的唯一选择,这是您可能需要根据用例场景使用或尝试的一些其他选项:
回收:对卷执行基本清理(例如rm -rf // *)-使其可用于新的索赔。只有NFS
和HostPath
支持回收。
删除:已删除关联的存储资产,例如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使其起作用