创建部署问题时,请参考下面模板,你提供的信息越多,越容易及时获得解答。如果未按模板创建问题,管理员有权关闭问题。
确保帖子格式清晰易读,用 markdown code block 语法格式化代码块。
你只花一分钟创建的问题,不能指望别人花上半个小时给你解答。

操作系统信息
例如:虚拟机,Centos7.5

Kubernetes版本信息
v1.29.14

容器:
containerd v1.7.1

KubeSphere版本信息
v4.1.3/在线安装。在已有K8s上安装还是使用kk安装。

问题:

默认安装下,没有做存储NFS等分布式规划时,没有默认的存储提供器,无法创建存储类

一直挂起

解决方法:

手动部署openebs-localpv-provisioner

📌 Step 1: 创建服务账户

项目必须选kube-system

📌 Step 2: 配置账户权限

进到主集群服务器

  • 创建授权yaml

openebs-clusterrole.yaml

apiVersion: rbac.authorization.k8s.io/v1

kind: ClusterRole

metadata:

name: openebs-maya-operator-role

rules:

- apiGroups: [""]

resources: ["persistentvolumes", "persistentvolumeclaims", "services", "pods", "nodes"]

verbs: ["get", "list", "watch", "create", "delete", "update", "patch"]

- apiGroups: ["storage.k8s.io"]

resources: ["storageclasses"]

verbs: ["get", "list", "watch"]

- apiGroups: ["openebs.io"]

resources: ["*"]

verbs: ["*"]

  • 执行

kubectl apply -f openebs-clusterrole.yaml

📌 Step 3: 绑定权限到账户

进到主集群服务器

  • 创建绑定yaml

openebs-clusterrolebinding.yaml

apiVersion: rbac.authorization.k8s.io/v1

kind: ClusterRoleBinding

metadata:

name: openebs-maya-operator-binding

subjects:

- kind: ServiceAccount

name: openebs-maya-operator

namespace: kube-system

roleRef:

kind: ClusterRole

name: openebs-maya-operator-role

apiGroup: rbac.authorization.k8s.io

  • 执行

    kubectl apply -f openebs-clusterrolebinding.yaml

Step 4: 部署openebs-localpv-provisioner

注意:需要在项目kube-system下

地址:registry.cn-beijing.aliyuncs.com/kubesphereio/provisioner-localpv:3.3.0

  • Deploymentyaml 可复用

kind: Deployment

apiVersion: apps/v1

metadata:

  name: openebs-localpv-provisioner

  namespace: kube-system

  labels:

    name: openebs-localpv-provisioner

    openebs.io/component-name: openebs-localpv-provisioner

    openebs.io/version: 3.3.0

  annotations:

    deployment.kubernetes.io/revision: '1'

    kubectl.kubernetes.io/last-applied-configuration: >

      {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"name":"openebs-localpv-provisioner","openebs.io/component-name":"openebs-localpv-provisioner","openebs.io/version":"3.3.0"},"name":"openebs-localpv-provisioner","namespace":"kube-system"},"spec":{"replicas":1,"selector":{"matchLabels":{"name":"openebs-localpv-provisioner","openebs.io/component-name":"openebs-localpv-provisioner"}},"strategy":{"type":"Recreate"},"template":{"metadata":{"labels":{"name":"openebs-localpv-provisioner","openebs.io/component-name":"openebs-localpv-provisioner","openebs.io/version":"3.3.0"}},"spec":{"containers":[{"env":[{"name":"NODE_NAME","valueFrom":{"fieldRef":{"fieldPath":"spec.nodeName"}}},{"name":"OPENEBS_NAMESPACE","valueFrom":{"fieldRef":{"fieldPath":"metadata.namespace"}}},{"name":"OPENEBS_SERVICE_ACCOUNT","valueFrom":{"fieldRef":{"fieldPath":"spec.serviceAccountName"}}},{"name":"OPENEBS_IO_ENABLE_ANALYTICS","value":"true"},{"name":"OPENEBS_IO_INSTALLER_TYPE","value":"openebs-operator-lite"},{"name":"OPENEBS_IO_HELPER_IMAGE","value":"registry.cn-beijing.aliyuncs.com/kubesphereio/linux-utils:3.3.0"}],"image":"registry.cn-beijing.aliyuncs.com/kubesphereio/provisioner-localpv:3.3.0","imagePullPolicy":"IfNotPresent","livenessProbe":{"exec":{"command":["sh","-c","test

      $(pgrep -c \"^provisioner-loc.*\") =

      1"]},"initialDelaySeconds":30,"periodSeconds":60},"name":"openebs-provisioner-hostpath"}],"serviceAccountName":"openebs-maya-operator"}}}}

    kubesphere.io/creator: admin

spec:

  replicas: 1

  selector:

    matchLabels:

      name: openebs-localpv-provisioner

      openebs.io/component-name: openebs-localpv-provisioner

  template:

    metadata:

      creationTimestamp: null

      labels:

        name: openebs-localpv-provisioner

        openebs.io/component-name: openebs-localpv-provisioner

        openebs.io/version: 3.3.0

      annotations:

        kubesphere.io/creator: admin

        kubesphere.io/imagepullsecrets: '{}'

    spec:

      containers:

        - name: openebs-provisioner-hostpath

          image: >-

            registry.cn-beijing.aliyuncs.com/kubesphereio/provisioner-localpv:3.3.0

          env:

            - name: NODE_NAME

              valueFrom:

                fieldRef:

                  apiVersion: v1

                  fieldPath: spec.nodeName

            - name: OPENEBS_NAMESPACE

              valueFrom:

                fieldRef:

                  apiVersion: v1

                  fieldPath: metadata.namespace

            - name: OPENEBS_SERVICE_ACCOUNT

              valueFrom:

                fieldRef:

                  apiVersion: v1

                  fieldPath: spec.serviceAccountName

            - name: OPENEBS_IO_ENABLE_ANALYTICS

              value: 'true'

            - name: OPENEBS_IO_INSTALLER_TYPE

              value: openebs-operator-lite

            - name: OPENEBS_IO_HELPER_IMAGE

              value: 'registry.cn-beijing.aliyuncs.com/kubesphereio/linux-utils:3.3.0'

          resources: {}

          livenessProbe:

            exec:

              command:

                - sh

                - '-c'

                - test $(pgrep -c "^provisioner-loc.*") = 1

            initialDelaySeconds: 30

            timeoutSeconds: 1

            periodSeconds: 60

            successThreshold: 1

            failureThreshold: 3

          terminationMessagePath: /dev/termination-log

          terminationMessagePolicy: File

          imagePullPolicy: IfNotPresent

      restartPolicy: Always

      terminationGracePeriodSeconds: 30

      dnsPolicy: ClusterFirst

      serviceAccountName: openebs-maya-operator

      serviceAccount: openebs-maya-operator

      securityContext: {}

      schedulerName: default-scheduler

  strategy:

    type: Recreate

  revisionHistoryLimit: 10

  progressDeadlineSeconds: 600

Step 5: 配置存储类

  • yaml可复用

kind: StorageClass

apiVersion: storage.k8s.io/v1

metadata:

  name: local

  creationTimestamp: '2025-05-28T17:43:17Z'

  labels:

    storage.kubesphere.io/storagetype: Undefined

  annotations:

    kubesphere.io/creator: admin

    kubesphere.io/provisioner: ''

    kubesphere.io/pvc-count: '0'

    storageclass.beta.kubernetes.io/is-default-class: 'true'

    storageclass.kubernetes.io/is-default-class: 'true'

    storageclass.kubesphere.io/supported-access-modes: '["ReadWriteOnce","ReadOnlyMany","ReadWriteMany"]'

provisioner: openebs.io/local

reclaimPolicy: Delete

allowVolumeExpansion: false

volumeBindingMode: WaitForFirstConsumer