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。
  2. 没有可用的 PV:集群中没有与 PVC 匹配的 PV,或者 PV 的配置不符合 PVC 的要求。

解决步骤

1. 检查 PVC 的配置

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

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

重点检查以下内容:

  • StorageClass 是否为空或未设置。
  • AccessModesRequested Size 是否与 PV 匹配。
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:
            - <node-name>

运行以下命令创建 PV:

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

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

kubectl get pvc -n kubesphere-logging-system

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

最佳实践

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

通过以上步骤,您可以解决 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

在这里插入图片描述

问题原因

  • 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 或动态存储供应配置正确。

重建PVC脚本

cat recreate_pvc.sh
#!/bin/bash

# 检查参数数量
if [ "$#" -ne 2 ]; then
    echo "Usage: $0 <pvc-name> <namespace>"
    exit 1
fi

PVC_NAME=$1
NAMESPACE=$2
BACKUP_FILE="pvc_backup_$(date +%Y%m%d%H%M%S).yaml"

# 检查 PVC 是否存在
if ! kubectl get pvc "$PVC_NAME" -n "$NAMESPACE" > /dev/null 2>&1; then
    echo "PVC $PVC_NAME not found in namespace $NAMESPACE."
    exit 1
fi

# 备份当前 PVC
echo "Backing up current PVC..."
kubectl get pvc "$PVC_NAME" -n "$NAMESPACE" -o yaml > "$BACKUP_FILE"
if [ $? -ne 0 ]; then
    echo "Failed to backup PVC."
    exit 1
fi
echo "Backup saved to $BACKUP_FILE"

# 删除现有的 PVC
echo "Deleting existing PVC..."
kubectl delete pvc "$PVC_NAME" -n "$NAMESPACE"
if [ $? -ne 0 ]; then
    echo "Failed to delete PVC."
    exit 1
fi

# 修改备份文件,添加 storageClassName
echo "Modifying PVC to add storageClassName..."
sed -i '/^spec:/a \ \ storageClassName: csi-localpv' "$BACKUP_FILE"

# 应用修改后的 PVC
echo "Creating new PVC with storageClassName..."
kubectl apply -f "$BACKUP_FILE" -n "$NAMESPACE"
if [ $? -ne 0 ]; then
    echo "Failed to create new PVC."
    exit 1
fi

echo "PVC $PVC_NAME has been successfully recreated with storageClassName: csi-localpv."

重建sts脚本

cat recreate_sts.sh
#!/bin/bash

# 检查参数数量
if [ "$#" -ne 2 ]; then
    echo "Usage: $0 <statefulset-name> <namespace>"
    exit 1
fi

STS_NAME=$1
NAMESPACE=$2
BACKUP_FILE="statefulset_backup_$(date +%Y%m%d%H%M%S).yaml"
TEMP_FILE="statefulset_temp_$(date +%Y%m%d%H%M%S).yaml"

# 检查 StatefulSet 是否存在
if ! kubectl get statefulset "$STS_NAME" -n "$NAMESPACE" > /dev/null 2>&1; then
    echo "StatefulSet $STS_NAME not found in namespace $NAMESPACE."
    exit 1
fi

# 备份当前 StatefulSet
echo "Backing up current StatefulSet..."
kubectl get statefulset "$STS_NAME" -n "$NAMESPACE" -o yaml > "$BACKUP_FILE"
if [ $? -ne 0 ]; then
    echo "Failed to backup StatefulSet."
    exit 1
fi
echo "Backup saved to $BACKUP_FILE"

# 删除现有的 StatefulSet
echo "Deleting existing StatefulSet..."
kubectl delete statefulset "$STS_NAME" -n "$NAMESPACE"
if [ $? -ne 0 ]; then
    echo "Failed to delete StatefulSet."
    exit 1
fi

# 修改备份文件,添加 storageClassName
echo "Modifying StatefulSet to add storageClassName..."
cp "$BACKUP_FILE" "$TEMP_FILE"  # 创建临时文件
sed -i '/volumeMode: Filesystem/a \ \ \ \ \ \ storageClassName: nfs-client' "$TEMP_FILE"

# 应用修改后的 StatefulSet
echo "Creating new StatefulSet with storageClassName: nfs-client..."
kubectl apply -f "$TEMP_FILE" -n "$NAMESPACE"
if [ $? -ne 0 ]; then
    echo "Failed to create new StatefulState."
    exit 1
fi

# 删除临时文件
rm "$TEMP_FILE"

echo "StatefulSet $STS_NAME has been successfully recreated with storageClassName: nfs-client."

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值