no persistent volumes available for this claim and no storage class is set

问题1

问题描述

User:

Normal  FailedBinding  7s (x5 over 52s)  persistentvolume-controller  no persistent volumes available for this claim and no storage class is set

Kimi:
根据您提供的错误信息和搜索结果,PVC data-vector-aggregator-0 无法绑定的原因是 “没有可用的 PersistentVolume (PV) 与该 PVC 匹配,且未设置存储类”。以下是解决此问题的详细步骤:

问题原因

  1. 未设置存储类:PVC 的 StorageClass 未设置,导致 Kubernetes 无法找到匹配的 PV[58][60]。
  2. 没有可用的 PV:集群中没有与 PVC 匹配的 PV,或者 PV 的配置不符合 PVC 的要求[57][61]。

解决步骤

1. 检查 PVC 的配置

运行以下命令查看 PVC 的详细信息:

kubectl describe pvc data-vector-aggregator-0 -n kubesphere-logging-system

重点检查以下内容:

  • StorageClass 是否为空或未设置。
  • AccessModesRequested Size 是否与 PV 匹配[57][59]。
2. 设置 StorageClass

如果 PVC 的 StorageClass 未设置,您需要手动设置一个默认的 StorageClass 或为 PVC 指定一个 StorageClass。

创建默认 StorageClass

如果集群中没有默认的 StorageClass,您可以创建一个:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: default-storage-class
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

运行以下命令创建 StorageClass:

kubectl apply -f storageclass.yaml

然后将其设置为默认存储类:

kubectl patch storageclass default-storage-class -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
修改 PVC 的 StorageClass

如果 PVC 需要特定的 StorageClass,您可以编辑 PVC 的 YAML 文件,添加或修改 storageClassName

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data-vector-aggregator-0
  namespace: kubesphere-logging-system
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: default-storage-class

然后重新应用 PVC:

kubectl apply -f pvc.yaml
3. 创建匹配的 PV

如果集群中没有可用的 PV,您需要手动创建一个 PV,以满足 PVC 的要求。以下是一个示例 PV 配置:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: default-storage-class
  local:
    path: /data/local-pv
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
            - -name>

运行以下命令创建 PV:

kubectl apply -f pv.yaml
4. 验证 PVC 是否绑定成功

运行以下命令查看 PVC 的状态:

kubectl get pvc -n kubesphere-logging-system

如果 PVC 的状态变为 Bound,则表示绑定成功[57]。

最佳实践

  1. 使用动态存储供应:通过正确配置 StorageClass,动态创建 PV,减少手动操作失误[57]。
  2. 统一管理 StorageClass:确保 PVC 和 PV 使用相同的 StorageClass[57]。
  3. 提前规划存储资源:为常用大小预留 PV,避免因资源不足导致的绑定失败[57]。

通过以上步骤,您可以解决 PVC data-vector-aggregator-0 无法绑定的问题。如果问题仍未解决,请提供更多详细信息以便进一步排查。

问题2

问题描述

User:

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
# persistentvolumeclaims "data-vector-aggregator-0" was not valid:
# * spec: Forbidden: spec is immutable after creation except resources.requests for bound claims
#   core.PersistentVolumeClaimSpec{
#       ... // 2 identical fields
#       Resources:        {Requests: {s"storage": {i: {...}, s: "10Gi", Format: "BinarySI"}}},
#       VolumeName:       "",
# -     StorageClassName: nil,
# +     StorageClassName: &"csi-localpv",
#       VolumeMode:       &"Filesystem",
#       DataSource:       nil,
#       DataSourceRef:    nil,
#   }

#

Kimi: 根据您提供的信息,您尝试通过 kubectl edit 修改 PVC 的 StorageClassName,但遇到了错误。这是因为 PVC 的 spec 字段在创建后是不可变的,除了绑定的 PVC 的 resources.requests。具体来说,您不能直接修改 PVC 的 StorageClassName

no persistent volumes available for this claim and no storage class is set_第1张图片

问题原因

  • Kubernetes 不允许直接修改 PVC 的 StorageClassName,因为这可能会导致存储资源的不一致。
  • 如果 PVC 已经绑定到一个 PV,您也不能直接修改它的 spec 字段。

解决方案

要为 PVC 设置或修改 StorageClassName,您需要删除现有的 PVC 并重新创建一个新的 PVC。以下是具体步骤:

1. 删除现有的 PVC

运行以下命令删除现有的 PVC:

kubectl delete pvc data-vector-aggregator-0 -n kubesphere-logging-system
2. 创建新的 PVC

创建一个新的 PVC,并在其中指定正确的 StorageClassName。以下是一个示例 YAML 文件(pvc.yaml):

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data-vector-aggregator-0
  namespace: kubesphere-logging-system
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: csi-localpv

运行以下命令创建新的 PVC:

kubectl apply -f pvc.yaml
3. 验证 PVC 的状态

运行以下命令查看 PVC 的状态:

kubectl get pvc -n kubesphere-logging-system
kubectl describe pvc data-vector-aggregator-0 -n kubesphere-logging-system

确保 PVC 的状态为 Bound,并且 StorageClassName 正确设置为 csi-localpv

注意事项

  1. 确保 PV 存在

    • 在创建 PVC 之前,确保集群中有一个与 csi-localpv 存储类匹配的 PV。
    • 如果您使用的是动态存储供应,确保 csi-localpv 存储类配置正确,并且集群支持动态创建 PV。
  2. 数据丢失风险

    • 如果 PVC 已绑定到一个 PV 并且有数据存储在其中,删除 PVC 会导致数据丢失。在这种情况下,您需要考虑数据备份或迁移。
  3. 动态存储供应

    • 如果您使用的是动态存储供应,StorageClassprovisioner 必须正确配置,以便 Kubernetes 能够动态创建 PV。

总结

由于 Kubernetes 不允许直接修改 PVC 的 StorageClassName,您需要删除现有的 PVC 并重新创建一个新的 PVC,以设置正确的存储类。在操作之前,请确保备份任何重要数据,并验证集群中存在匹配的 PV 或动态存储供应配置正确。

你可能感兴趣的:(K8s,运维)