安装 OpenEBS 创建 LocalPV 存储类型

由于 在已有 Kubernetes 集群之上安装 KubeSphere 需要依赖集群已有的存储类型(StorageClass),若集群还没有准备存储类型(StorageClass),可参考本文档,在 K8s 集群中安装 OpenEBS 并创建 LocalPV 的存储类型,从而可以在集群快速安装测试 KubeSphere。

注意:基于 OpenEBS 创建 LocalPV 的存储类型仅适用于开发测试环境,不建议在生产环境使用。生产环境建议准备 KubeSphere 推荐的持久化存储(如 GlusterFS、Ceph、NFS 或 Neonsan 等分布式存储),然后再创建对应的 StorageClass。

前提条件

  • 已有 Kubernetes 集群,并安装了 kubectl 或 Helm
  • Pod 可以被调度到集群的 master 节点(可临时取消 master 节点的 Taint)

关于第二个前提条件,是由于安装 OpenEBS 时它有一个初始化的 Pod 需要在 master 节点启动并创建 PV 给 KubeSphere 的有状态应用挂载。因此,若您的 master 节点存在 Taint,建议在安装 OpenEBS 之前手动取消 Taint,待 OpenEBS 安装完成后再对 master 打上 Taint,以下步骤供参考:

  • 例如本示例有一个 master 节点,节点名称即 master,可通过以下命令查看节点名称:
  1. $ kubectl get node -o wide
  2. NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
  3. master Ready master 6d18h v1.15.5 192.168.0.6 <none> CentOS Linux 7 (Core) 3.10.0-693.el7.x86_64 docker://18.9.7
  4. node1 Ready worker 6d18h v1.15.5 192.168.0.7 <none> CentOS Linux 7 (Core) 3.10.0-693.el7.x86_64 docker://18.9.7
  5. node2 Ready worker 6d18h v1.15.5 192.168.0.10 <none> CentOS Linux 7 (Core) 3.10.0-693.el7.x86_64 docker://18.9.7
  • 确认 master 节点是否有 Taint,如下看到 master 节点有 Taint。
  1. $ kubectl describe node master | grep Taint
  2. Taints: node-role.kubernetes.io/master:NoSchedule
  • 去掉 master 节点的 Taint:
  1. $ kubectl taint nodes master node-role.kubernetes.io/master:NoSchedule-

此时可参考安装 OpenEBS 的步骤继续操作。

安装 OpenEBS

  • 创建 OpenEBS 的 namespace,OpenEBS 相关资源将创建在这个 namespace 下:
  1. $ kubectl create ns openebs
  • 安装 OpenEBS,以下列出两种方法,可参考其中任意一种进行创建:A. 若集群已安装了 Helm,可通过 Helm 命令来安装 OpenEBS:
  1. helm init
  2. helm install --namespace openebs --name openebs stable/openebs --version 1.5.0

B. 除此之外 还可以通过 kubectl 命令安装:

  1. $ kubectl apply -f https://openebs.github.io/charts/openebs-operator-1.5.0.yaml
  • 安装 OpenEBS 后将自动创建 4 个 StorageClass,查看创建的 StorageClass:
  1. $ kubectl get sc
  2. NAME PROVISIONER AGE
  3. openebs-device openebs.io/local 10h
  4. openebs-hostpath openebs.io/local 10h
  5. openebs-jiva-default openebs.io/provisioner-iscsi 10h
  6. openebs-snapshot-promoter volumesnapshot.external-storage.k8s.io/snapshot-promoter 10h
  • 如下将 openebs-hostpath 设置为 默认的 StorageClass
  1. $ kubectl patch storageclass openebs-hostpath -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
  2. storageclass.storage.k8s.io/openebs-hostpath patched
  • 至此,OpenEBS 的 LocalPV 已作为默认的存储类型创建成功。由于在文档开头手动去掉了 master 节点的 Taint,我们可以在安装完 OpenEBS 后将 master 节点 Taint 加上,避免业务相关的工作负载调度到 master 节点抢占 master 资源:
  1. $ kubectl taint nodes master node-role.kubernetes.io/master=:NoSchedule

创建工作负载测试 StorageClass

  • 如下创建一个 demo-openebs-hostpath.yaml,其中定义的 Deployment 与 PVC 用作测试,检验 openebs-hostpath 的 StorageClass 是否创建成功:
  1. ---
  2. apiVersion: apps/v1beta1
  3. kind: Deployment
  4. metadata:
  5. name: percona
  6. labels:
  7. name: percona
  8. spec:
  9. replicas: 1
  10. selector:
  11. matchLabels:
  12. name: percona
  13. template:
  14. metadata:
  15. labels:
  16. name: percona
  17. spec:
  18. securityContext:
  19. fsGroup: 999
  20. tolerations:
  21. - key: "ak"
  22. value: "av"
  23. operator: "Equal"
  24. effect: "NoSchedule"
  25. containers:
  26. - resources:
  27. limits:
  28. cpu: 0.5
  29. name: percona
  30. image: percona
  31. args:
  32. - "--ignore-db-dir"
  33. - "lost+found"
  34. env:
  35. - name: MYSQL_ROOT_PASSWORD
  36. value: k8sDem0
  37. ports:
  38. - containerPort: 3306
  39. name: percona
  40. volumeMounts:
  41. - mountPath: /var/lib/mysql
  42. name: demo-vol1
  43. volumes:
  44. - name: demo-vol1
  45. persistentVolumeClaim:
  46. claimName: demo-vol1-claim
  47. ---
  48. kind: PersistentVolumeClaim
  49. apiVersion: v1
  50. metadata:
  51. name: demo-vol1-claim
  52. spec:
  53. storageClassName: openebs-hostpath
  54. accessModes:
  55. - ReadWriteOnce
  56. resources:
  57. requests:
  58. storage: 5G
  59. ---
  60. apiVersion: v1
  61. kind: Service
  62. metadata:
  63. name: percona-mysql
  64. labels:
  65. name: percona-mysql
  66. spec:
  67. ports:
  68. - port: 3306
  69. targetPort: 3306
  70. selector:
  71. name: percona
  • 使用 kubectl 命令创建相关资源:
  1. $ kubectl apply -f demo-openebs-hostpath.yaml -n openebs
  • 如果 PVC 的状态为 Bound 并且 Pod 状态为 running,则说明已经成功挂载,证明了默认的 StorageClass(openebs-hostpath)是正常工作的。接下来可以回到 在已有 Kubernetes 集群之上安装 KubeSphere 继续安装 KubeSphere。
  1. $ kubectl get pvc -n openebs
  2. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  3. demo-vol1-claim Bound pvc-a50fbb85-760b-488e-aad4-8aef1ff6b57a 5G RWO openebs-hostpath 68m