介绍
在本文中,您将使用Rook在Kubernetes集群中部署Ceph存储。然后,您将使用Ceph的块存储来持久存储MongoDB数据库的数据。
完成后,您将了解:
- 什么是Rook以及如何使用它来部署Ceph。
- 如何使用Rook在Kubernetes中部署其他一些存储后端。
前置要求
- 一个具有4个节点的Kubernetes集群:1个主节点和3个工作节点。每个节点都是具有至少4GB RAM的Ubuntu 18.04服务器。在本教程中,我们在DigitalOcean上使用官方kubeadm工具创建的集群。主节点命名为master,工作节点命名为node-01,node-02和node-03。
步骤一:创建块卷存储
在此步骤中,我们将创建3个块卷并将每个块卷附加到一个工作程序节点。这些卷将在以后用于持久存储Ceph集群的数据。
首先,我们进入DigitalOcean控制面板的“卷”菜单,然后单击“添加卷”按钮。
- 首先卷大小30G
- 命名:vol-01、vol-02、vol-03
最后,我们单击创建卷按钮创建每个卷。
一旦三个卷创建好后并且挂载到相应的节点上。我们会看到如下的类似映射。
现在我们配置好了存储基础设施。
步骤二:部署Rook Operator
Rook是[Cloud Native Computing Foundation(CNCF)](https://cncf.io)的一个孵化项目。它专门用于存储编排,并允许在Kubernetes集群中直接部署多个存储解决方案。在本文中,我们将重点介绍Ceph存储,但是还可以使用其他存储解决方案。
注意:Ceph和EdgeFS当前是Rook处于“稳定”状态所支持的2个存储服务商。其他存储(如Cassandra,Minio,NFS,CockroachDB,YugabyteDB)处于Alpha状态
下面我们Git克隆并使用1.2 版本。
$ git clone https://github.com/rook/rook.git$ cd rook$ git checkout release-1.2
对于Rook支持的每个存储解决方案,都有一个Kubernetes Operator。简而言之,Operator是一个在Pod中运行的过程,其中包含管理复杂应用程序的所有逻辑。Operator通常用于管理有状态的应用程序。
下面我们进入克隆下来的目录中,并部署Rook operator 所需的resources。
$ cd cluster/examples/kubernetes/ceph$ kubectl create -f common.yaml
这些资源主要是CustomRessourceDefinitions,也称为CRD。它们用于定义将由Operator使用的新资源(Kubernetes中默认不存在的资源)。创建的其他资源主要为了访问权限,这样Operator可以与集群的API服务器进行通信:
ServiceAccountRoleRoleBindingClusterRoleClusterRoleBinding
接下来,我们部署Ceph Operator,该Operator将负责Ceph集群的配置和编排。
等待几秒钟后,Operator就会启动并运行了。可以通过下面的命令查看状态:
$ kubectl get pod -n rook-ceph
一旦Operator 准备好后。它就会触发创建DaemonSet用于在每个节点上部署rook-discover agent。
所有都安装好后。可以看到所有资源的部署状态如下:
NAME READY STATUS RESTARTS AGErook-ceph-operator-75d95cb868-s7m5z 1/1 Running 0 78srook-discover-44dq9 1/1 Running 0 43srook-discover-7gxn7 1/1 Running 0 43srook-discover-xfqmk 1/1 Running 0 43s
这些都完成后,就万事俱备只欠东风了。
步骤三:创建Ceph 集群
下面我们可以在K8S中正式创建Ceph集群了。
- mgr是Manager守护程序,负责跟踪运行时指标和Ceph集群的当前状态。对于高可用性群集,至少需要2个Ceph管理器
- mon是一个Monitor,负责维护Ceph守护程序相互协调所需的集群状态映射。对于高可用性群集,至少需要三个监视器
- osd是一个对象存储守护程序,负责存储数据,处理数据复制,恢复,重新平衡。对于HA Ceph集群,至少需要3个Ceph OSD
首先,我们先定义一个CephCluster的资源:
apiVersion: ceph.rook.io/v1kind: CephClustermetadata: name: rook-ceph namespace: rook-cephspec: cephVersion: image: ceph/ceph:v14.2 allowUnsupported: false dataDirHostPath: /var/lib/rook skipUpgradeChecks: false mon: count: 3 allowMultiplePerNode: false dashboard: enabled: true ssl: true monitoring: enabled: false rulesNamespace: rook-ceph network: hostNetwork: false rbdMirroring: workers: 0 storage: useAllNodes: true useAllDevices: true
它基本上定义了集群的配置方式。属性useAllNodes和useAllDevices设置为true,以便Kubernetes集群的每个工作节点将用于部署Ceph的进程,并且附加到这些节点的所有设备将用于持久存储Ceph集群的数据。
下面我们来创建:
$ kubectl apply -f cluster.yaml
CephCluster资源的创建将通知Ceph Operator,并将向API服务器发送请求,以创建所有与Ceph相关的Pod。
接下来,我们确保负责Ceph集群的所有Pod都已启动并正在运行。
$ kubectl get pod -n rook-ceph
创建集群通常需要几分钟。完成此操作后,我们将获得类似于以下输出的列表。
NAME READY STATUS RESTARTS AGEcsi-cephfsplugin-fnpm9 3/3 Running 0 10mcsi-cephfsplugin-hxml9 3/3 Running 0 10mcsi-cephfsplugin-provisioner-7c44c4ff49-k8z9t 4/4 Running 0 10mcsi-cephfsplugin-provisioner-7c44c4ff49-kmdp9 4/4 Running 1 10mcsi-cephfsplugin-qwm6m 3/3 Running 0 10mcsi-rbdplugin-dgmv8 3/3 Running 0 10mcsi-rbdplugin-provisioner-7458d98547-xg7x8 5/5 Running 1 10mcsi-rbdplugin-provisioner-7458d98547-xz2kg 5/5 Running 1 10mcsi-rbdplugin-qxx26 3/3 Running 0 10mcsi-rbdplugin-s2mxj 3/3 Running 0 10mrook-ceph-mgr-a-5d8bf85bb7-nnnxc 1/1 Running 0 7m5srook-ceph-mon-a-7678858484–5txtz 1/1 Running 0 8mrook-ceph-mon-b-6b6f697f94–577z8 1/1 Running 0 7m44srook-ceph-mon-c-89c78d866–4w5sb 1/1 Running 0 7m25srook-ceph-operator-75d95cb868-s7m5z 1/1 Running 0 13mrook-ceph-osd-prepare-node-01-dj9tm 0/1 Completed 0 6m33srook-ceph-osd-prepare-node-02–49d5c 0/1 Completed 0 6m33srook-ceph-osd-prepare-node-03-md22x 0/1 Completed 0 6m33srook-discover-44dq9 1/1 Running 0 12mrook-discover-7gxn7 1/1 Running 0 12mrook-discover-xfqmk 1/1 Running 0 12m
Ceph 可以提供多种存储类型:
filesystemobjectblock