明明存在local-storage存储类,Kubernetes为何无法找到?
关于Kubernetes local-storage存储类的矛盾问题
问题现象
我有一批与local-storage存储类绑定的PV,从PV列表可看到STORAGECLASS字段均标记为local-storage:
$ kubectl get pv -n example-com NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE db-worker-1 10Gi RWO Retain Bound example-com/cluster-pg-3 local-storage 2d20h db-worker-1-loki 10Gi RWO Retain Bound example-com/data-loki-backend-0 local-storage 14m db-worker-2 10Gi RWO Retain Bound example-com/cluster-pg-1 local-storage 2d20h db-worker-2-loki 10Gi RWO Retain Bound example-com/data-loki-backend-2 local-storage 14m db-worker-3 10Gi RWO Retain Bound example-com/cluster-pg-2 local-storage 2d20h db-worker-3-loki 10Gi RWO Retain Bound example-com/data-loki-backend-1 local-storage 14m
同时,我有一批使用local-storage存储类的PVC,其中部分处于Bound状态,其余处于Pending状态:
$ kubectl get pvc -n example-com NAMESPACE NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE example-com cluster-pg-1 Bound db-worker-2 10Gi RWO local-storage 2d20h example-com cluster-pg-2 Bound db-worker-3 10Gi RWO local-storage 2d20h example-com cluster-pg-3 Bound db-worker-1 10Gi RWO local-storage 2d20h example-com data-loki-backend-0 Bound db-worker-1-loki 10Gi RWO local-storage 9m42s example-com data-loki-backend-1 Bound db-worker-3-loki 10Gi RWO local-storage 9m41s example-com data-loki-backend-2 Bound db-worker-2-loki 10Gi RWO local-storage 9m41s example-com data-loki-write-0 Pending local-storage 8m30s example-com data-loki-write-1 Pending local-storage 8m26s example-com data-loki-write-2 Pending local-storage 8m17s example-com export-0-grafana-loki-minio-0 Pending 8m26s example-com export-1-grafana-loki-minio-0 Pending 8m17s
处于Pending状态的PVC报错信息为:
storageclass.storage.k8s.io "local-storage" not found
但尝试列出所有存储类时,却显示无资源:
$ kubectl get sc --all-namespaces No resources found
原因解析
这一矛盾现象的核心逻辑如下:
- PV的STORAGECLASS字段仅为标记,不依赖存储类存在:PV创建时若关联了存储类,该字段会被记录为字符串,但即使后续存储类被删除,这个标记依然保留,且不影响已绑定的PV/PVC关系。
- 已Bound的PVC不受存储类删除影响:那些处于Bound状态的PVC,是在
local-storage存储类存在时创建并完成与PV绑定的,绑定完成后,Kubernetes不再依赖存储类维持该关系。 - 新PVC创建必须验证存储类存在:Pending状态的PVC是在存储类被删除后创建的,Kubernetes处理这类PVC时,会先验证指定的存储类是否存在,若不存在则无法完成PV匹配或动态分配,导致PVC一直处于Pending状态。
简言之:之前的local-storage存储类已被删除,但此前创建的PV/PVC绑定关系已固化,不受影响;新创建的PVC因找不到存储类,无法完成绑定。
解决方案
- 重建local-storage存储类:根据之前的配置重新创建该存储类,需保持关键参数一致(比如本地存储类常用的
volumeBindingMode: WaitForFirstConsumer)。示例YAML如下:
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: local-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer reclaimPolicy: Retain
执行命令创建:
kubectl apply -f storageclass-local.yaml
- 调整PVC的存储类配置(可选):若无需依赖存储类,可将Pending PVC的
storageClassName字段修改为空字符串,这样PVC会尝试匹配未指定存储类的静态PV(但本场景下的PV均标记了local-storage,因此优先推荐重建存储类)。
内容的提问来源于stack exchange,提问作者Michel Jung
相关产品推荐
相关产品推荐

