- 已编辑
创建部署问题时,请参考下面模板,你提供的信息越多,越容易及时获得解答。如果未按模板创建问题,管理员有权关闭问题。
确保帖子格式清晰易读,用 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
Deployment
yaml 可复用
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