乐趣区

使用Rook+Ceph在Kubernetes上作持久存储

作者:Earl C. Ruby III

我想在新的 Kubernetes 集群上安装 Prometheus 和 Grafana,但为了使这些软件包能够工作,他们需要一些地方来存储持久数据。当我在 Seagate 担任云架构师时,我已经对 Ceph 进行了性能和规模测试,并且在过去的一年里玩过 Rook,所以我决定安装 Rook+Ceph,并将其用于 Kubernetes 集群的数据存储。
Ceph 是一个分布式存储系统,提供对象、文件和块存储。在每个存储节点上,您将找到 Ceph 存储对象的文件系统和 Ceph OSD(对象存储守护程序)进程。在 Ceph 集群上,您还可以找到 Ceph MON(监控)守护程序,它们确保 Ceph 集群保持高可用性。
Rook 充当 Ceph 在 Kubernetes 的业务流程层,将 OSD 和 MON 流程部署为 POD 副本集。来自 Rook 的 README 文件:
Rook 将存储软件转变为自我管理、自我扩展和自我修复的存储服务。它通过自动化部署,引导,准备,配置,扩展,升级,迁移,灾难恢复,监控和资源管理来实现此目的。Rook 使用底层云原生容器管理,调度和编排平台提供的工具来执行其职责。https://github.com/rook/rook/…

当我创建集群时,我构建了具有 40GB 硬盘的 VM,所以使用 5 个 Kubernetes 节点,在我的集群上提供了大约 200GB 的存储空间,其中大部分都将用于 Ceph。
安装 Rook+Ceph
安装 Rook+Ceph 非常简单。在我的个人群集上,我按照以下步骤安装了 Rook+Ceph v0.9.0:
git clone git@github.com:rook/rook.git
cd rook
git checkout v0.9.0
cd cluster/examples/kubernetes/ceph
kubectl create -f operator.yaml
kubectl create -f cluster.yaml
Rook 将 POD 部署在两个命名空间中,即 rook-ceph-system 和 rook-ceph。在我的群集上,POD 花了大约 2 分钟来部署,初始化并进入运行状态。当我等待一切都完成时,我检查了 POD 状态:
$ kubectl -n rook-ceph-system get pod
NAME READY STATUS RESTARTS AGE
rook-ceph-agent-8tsq7 1/1 Running 0 2d20h
rook-ceph-agent-b6mgs 1/1 Running 0 2d20h
rook-ceph-agent-nff8n 1/1 Running 0 2d20h
rook-ceph-agent-vl4zf 1/1 Running 0 2d20h
rook-ceph-agent-vtpbj 1/1 Running 0 2d20h
rook-ceph-agent-xq5dv 1/1 Running 0 2d20h
rook-ceph-operator-85d64cfb99-hrnbs 1/1 Running 0 2d20h
rook-discover-9nqrp 1/1 Running 0 2d20h
rook-discover-b62ds 1/1 Running 0 2d20h
rook-discover-k77gw 1/1 Running 0 2d20h
rook-discover-kqknr 1/1 Running 0 2d20h
rook-discover-v2hhb 1/1 Running 0 2d20h
rook-discover-wbkkq 1/1 Running 0 2d20h
$ kubectl -n rook-ceph get pod
NAME READY STATUS RESTARTS AGE
rook-ceph-mgr-a-7d884ddc8b-kfxt9 1/1 Running 0 2d20h
rook-ceph-mon-a-77cbd865b8-ncg67 1/1 Running 0 2d20h
rook-ceph-mon-b-7cd4b9774f-js8n9 1/1 Running 0 2d20h
rook-ceph-mon-c-86778859c7-x2qg9 1/1 Running 0 2d20h
rook-ceph-osd-0-67fff79666-fcrss 1/1 Running 0 35h
rook-ceph-osd-1-58bd4ccbbf-lsxj9 1/1 Running 1 2d20h
rook-ceph-osd-2-bf99864b5-n4q7v 1/1 Running 0 2d20h
rook-ceph-osd-3-577466c968-j8gjr 1/1 Running 0 2d20h
rook-ceph-osd-4-6856c5c6c9-92tb6 1/1 Running 0 2d20h
rook-ceph-osd-5-8669577f6b-zqrq9 1/1 Running 0 2d20h
rook-ceph-osd-prepare-node1-xfbs7 0/2 Completed 0 2d20h
rook-ceph-osd-prepare-node2-c9f55 0/2 Completed 0 2d20h
rook-ceph-osd-prepare-node3-5g4nc 0/2 Completed 0 2d20h
rook-ceph-osd-prepare-node4-wj475 0/2 Completed 0 2d20h
rook-ceph-osd-prepare-node5-tf5bt 0/2 Completed 0 2d20h
最后工作
现在我需要再做两件事,才能安装 Prometheus 和 Grafana:

我需要让 Rook 成为我的集群的默认存储提供程序。
由于 Prometheus Helm chart 请求使用 XFS 文件系统格式化的卷,因此我需要在所有 Ubuntu Kubernetes 节点上安装 XFS 工具。(默认情况下,Kubespray 尚未安装 XFS,尽管目前有一个 PR 解决这个问题。)

要使 Rook 成为默认存储提供程序,我只需运行 kubectl 命令:
kubectl patch storageclass rook-ceph-block -p ‘{“metadata”: {“annotations”:{“storageclass.kubernetes.io/is-default-class”:”true”}}}’
这会更新 rook-ceph-block 存储类,并使其成为群集上存储的默认值。如果没有指定特定的存储类,我安装的任何应用程序都将使用 Rook+Ceph 进行数据存储。
由于我使用 Kubespray 构建集群,而 Kubespray 使用 Ansible,因此在所有主机上安装 XFS 工具的最简单方法之一,是使用 Ansible“在所有主机上运行单个命令”功能:
cd kubespray
export ANSIBLE_REMOTE_USER=ansible
ansible kube-node -i inventory/mycluster/hosts.ini \
–become –become-user root \
-a ‘apt-get install -y xfsprogs’
现在已经安装了 XFS,我可以使用 Helm 成功部署 Prometheus 和 Grafana:
helm install –name prometheus stable/prometheus
helm install –name grafana stable/grafana
Helm chart 安装 Prometheus 和 Grafana,并在 Rook+Ceph 上为 Prometheus Server 和 Prometheus Alert Manager(使用 XFS 格式化)创建持久存储卷。
Prometheus 仪表板

Grafana 仪表板

Rook 给 Prometheus 服务器的持久存储

希望您觉得这个有帮助。

退出移动版