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 Taint
Taints: node-role.kubernetes.io/master:NoSchedule
暂时去掉 master 节点的 Taint(待 OpenEBS 安装完成后,再为 master 打上 Taint)
xxxxxxxxxx
$ kubectl taint nodes master node-role.kubernetes.io/master:NoSchedule-
xxxxxxxxxx
helm repo add openebs https://openebs.github.io/charts
helm repo update
helm install openebs --namespace openebs openebs/openebs --create-namespace
$ kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
openebs-device openebs.io/local Delete WaitForFirstConsumer false 4m9s
openebs-hostpath openebs.io/local Delete WaitForFirstConsumer false 4m9s
openebs-hostpath
设置为默认的 StorageClassx
$ kubectl patch storageclass openebs-hostpath -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
storageclass.storage.k8s.io/openebs-hostpath patched
OpenEBS 的 LocalPV 已作为默认的存储类型。可以通过命令 kubectl get pod -n openebs
来查看 OpenEBS 相关 Pod 的状态,若 Pod 的状态都是 running,则说明存储安装成功。
创建 demo-openebs-hostpath.yaml,其中定义的 Deployment 与 PVC 用作测试,检验 openebs-hostpath StorageClass 是否创建成功:
x
apiVersion apps/v1
kind Deployment
metadata
name percona
labels
name percona
spec
replicas1
selector
matchLabels
name percona
template
metadata
labels
name percona
spec
securityContext
fsGroup999
tolerations
key"ak"
value"av"
operator"Equal"
effect"NoSchedule"
containers
resources
limits
cpu0.5
name percona
image percona
args
"--ignore-db-dir"
"lost+found"
env
name MYSQL_ROOT_PASSWORD
value k8sDemo
ports
containerPort3306
name percona
volumeMounts
mountPath /var/lib/mysql
name demo-vol1
volumes
name demo-vol1
persistentVolumeClaim
claimName demo-vol1-claim
---
kind PersistentVolumeClaim
apiVersion v1
metadata
name demo-vol1-claim
spec
storageClassName openebs-hostpath
accessModes
ReadWriteOnce
resources
requests
storage 5G
---
apiVersion v1
kind Service
metadata
name percona-mysql
labels
name percona-mysql
spec
ports
port3306
targetPort3306
selector
name percona
使用 kubectl 创建相关资源:
xxxxxxxxxx
$ kubectl apply -f demo-openebs-hostpath.yaml -n openebs
如果 PVC 的状态为 Bound
并且 Pod 状态为 running
,那么说明已经成功挂载,证明默认 StorageClass(openebs-hostpath)正常工作:
xxxxxxxxxx
$ kubectl get pvc -n openebs
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
demo-vol1-claim Bound pvc-defa7f5b-bafe-4272-9658-567754dffeb1 5G RWO openebs-hostpath 49s
为 master 节点添加 Taint,避免业务相关的工作负载调度到 master 节点抢占 master 资源:
xxxxxxxxxx
kubectl taint nodes master node-role.kubernetes.io/master=:NoSchedule