You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已创建gp2 StorageClass但PVC仍提示未找到的问题求助

问题描述

我在Kubernetes集群中通过Helm安装Prometheus,执行命令如下:

helm install prometheus prometheus-community/prometheus \
    --namespace reddwarf-monitor \
    --set alertmanager.persistentVolume.storageClass="gp2" \
    --set server.persistentVolume.storageClass="gp2"

发现PVC无法绑定StorageClass后,我创建了gp2 StorageClass:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: gp2
  namespace: default
provisioner: fuseim.pri/ifs

同时部署了NFS客户端:

kind: Deployment
apiVersion: apps/v1
metadata:
  name: nfs-client-provisioner
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-client-provisioner
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          image: quay.io/external_storage/nfs-client-provisioner:latest
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: fuseim.pri/ifs
            - name: NFS_SERVER
              value: 3659b4xxx-pli55.cn-shanghai.nas.aliyuncs.com
            - name: NFS_PATH
              value: /k8s/storageclass
      volumes:
        - name: nfs-client-root
          nfs:
            server: 3659b4ab7c-pli55.cn-shanghai.nas.aliyuncs.com
            path: /data/k8s/storageclass

并创建了对应的ServiceAccount及RBAC配置:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
  namespace: default

---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-client-provisioner-runner
  namespace: default
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["list", "watch", "create", "update", "patch"]
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]

---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-client-provisioner
  namespace: default
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-runner
  apiGroup: rbac.authorization.k8s.io

但PVC仍报错:storageclass.storage.k8s.io "gp2" not found。我的Kubernetes版本信息如下:

> kubectl version
Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.0", GitCommit:"ab69524f795c42094a6630298ff53f3c3ebab7f4", GitTreeState:"clean", BuildDate:"2021-12-07T18:16:20Z", GoVersion:"go1.17.3", Compiler:"gc", Platform:"darwin/arm64"}
Server Version: version.Info{Major:"1", Minor:"26", GitVersion:"v1.26.7", GitCommit:"84e1fc493a47446df2e155e70fca768d2653a398", GitTreeState:"clean", BuildDate:"2023-07-19T12:16:45Z", GoVersion:"go1.20.6", Compiler:"gc", Platform:"linux/amd64"}
WARNING: version difference between client (1.23) and server (1.26) exceeds the supported minor version skew of +/-1

请问我是否遗漏了什么配置?需要如何操作才能让PVC找到该StorageClass?另外,PVC是否需要与StorageClass处于同一命名空间?

解决方案

核心问题分析

  • StorageClass是集群级资源,不能指定namespace:你在创建gp2 StorageClass时添加了namespace: default字段,这是错误操作。StorageClass属于集群范围资源,不存在命名空间属性,Kubernetes会忽略该字段,但可能引发资源识别异常,这是PVC找不到StorageClass的主要原因。
  • NFS客户端路径配置不一致:部署NFS客户端时,环境变量NFS_PATH设置为/k8s/storageclass,但volumes中的NFS路径是/data/k8s/storageclass,两者不匹配会导致NFS挂载失败,即便StorageClass正常,provisioner也无法创建PV。
  • Kubectl版本跨度过大:客户端v1.23与服务端v1.26的版本差超过Kubernetes支持的±1小版本偏移,可能引发命令执行或资源识别的兼容性问题。

修复步骤

  1. 修正StorageClass配置
    删除namespace: default字段,重新创建StorageClass:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: gp2
    provisioner: fuseim.pri/ifs
    

    执行更新命令:

    kubectl apply -f <你的StorageClass文件路径>
    
  2. 统一NFS路径配置
    修改NFS客户端Deployment的环境变量NFS_PATH,使其与volumes中的NFS路径一致,比如统一为/data/k8s/storageclass:

    env:
      - name: PROVISIONER_NAME
        value: fuseim.pri/ifs
      - name: NFS_SERVER
        value: 3659b4xxx-pli55.cn-shanghai.nas.aliyuncs.com
      - name: NFS_PATH
        value: /data/k8s/storageclass
    

    重新部署:

    kubectl apply -f <你的NFS Deployment文件路径>
    
  3. 验证StorageClass状态
    执行以下命令确认gp2 StorageClass已正常存在:

    kubectl get storageclasses.storage.k8s.io gp2
    

    若输出包含gp2的信息,说明资源已被集群正确识别。

  4. 解决Kubectl版本兼容性问题
    建议将kubectl客户端版本升级到v1.25或v1.26,与服务端版本保持在±1的偏移范围内,避免兼容性异常。

关于命名空间的疑问

PVC不需要和StorageClass处于同一命名空间。StorageClass是集群级资源,所有命名空间的PVC都可以直接引用它,只要名称匹配即可。

内容的提问来源于stack exchange,提问作者Dolphin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 19:32:05