OpenEBS 将可用于 Kubernetes 工作节点的任何存储转换为本地或分布式 Kubernetes 持久化卷(Persistent Volume)。
OpenEBS 帮助应用程序和平台团队轻松地部署 Kubernetes 有状态工作负载,这些工作负载需要快速、高度持久、可靠和可扩展的容器附加存储(Container Attached Storage)。
OpenEBS 也是基于 NVMe 的存储部署的首选。
OpenEBS 最初由 MayaData 构建,后来被捐赠给云原生计算基金会,现在是 CNCF 沙盒项目。
基于 OpenEBS 创建 LocalPV 存储类型仅适用于开发测试环境,不建议在生产环境使用。生产环境建议准备符合 Kubernetes 要求的持久化存储(如 GlusterFS、Ceph、NFS、Neonsan 等分布式存储,或云上的块存储),然后再创建对应的 StorageClass。
可以参考以下步骤:
确认 master 节点是否有 Taint,如下看到 master 节点有 Taint:
xxxxxxxxxx$ kubectl describe node master | grep TaintTaints: node-role.kubernetes.io/master:NoSchedule暂时去掉 master 节点的 Taint(待 OpenEBS 安装完成后,再为 master 打上 Taint)
xxxxxxxxxx$ kubectl taint nodes master node-role.kubernetes.io/master:NoSchedule-xxxxxxxxxxhelm repo add openebs https://openebs.github.io/chartshelm repo updatehelm install openebs --namespace openebs openebs/openebs --create-namespace$ kubectl get scNAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGEopenebs-device openebs.io/local Delete WaitForFirstConsumer false 4m9sopenebs-hostpath openebs.io/local Delete WaitForFirstConsumer false 4m9sopenebs-hostpath 设置为默认的 StorageClassx
$ kubectl patch storageclass openebs-hostpath -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'storageclass.storage.k8s.io/openebs-hostpath patchedOpenEBS 的 LocalPV 已作为默认的存储类型。可以通过命令 kubectl get pod -n openebs 来查看 OpenEBS 相关 Pod 的状态,若 Pod 的状态都是 running,则说明存储安装成功。
创建 demo-openebs-hostpath.yaml,其中定义的 Deployment 与 PVC 用作测试,检验 openebs-hostpath StorageClass 是否创建成功:
x
apiVersionapps/v1kindDeploymentmetadata namepercona labels nameperconaspec replicas1 selector matchLabels namepercona template metadata labels namepercona spec securityContext fsGroup999 tolerationskey"ak" value"av" operator"Equal" effect"NoSchedule" containersresources limits cpu0.5 namepercona imagepercona args"--ignore-db-dir""lost+found" envnameMYSQL_ROOT_PASSWORD valuek8sDemo portscontainerPort3306 namepercona volumeMountsmountPath/var/lib/mysql namedemo-vol1 volumesnamedemo-vol1 persistentVolumeClaim claimNamedemo-vol1-claim---kindPersistentVolumeClaimapiVersionv1metadata namedemo-vol1-claimspec storageClassNameopenebs-hostpath accessModesReadWriteOnce resources requests storage5G---apiVersionv1kindServicemetadata namepercona-mysql labels namepercona-mysqlspec portsport3306 targetPort3306 selector namepercona使用 kubectl 创建相关资源:
xxxxxxxxxx$ kubectl apply -f demo-openebs-hostpath.yaml -n openebs如果 PVC 的状态为 Bound 并且 Pod 状态为 running,那么说明已经成功挂载,证明默认 StorageClass(openebs-hostpath)正常工作:
xxxxxxxxxx$ kubectl get pvc -n openebsNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEdemo-vol1-claim Bound pvc-defa7f5b-bafe-4272-9658-567754dffeb1 5G RWO openebs-hostpath 49s为 master 节点添加 Taint,避免业务相关的工作负载调度到 master 节点抢占 master 资源:
xxxxxxxxxxkubectl taint nodes master node-role.kubernetes.io/master=:NoSchedule