likes
comments
collection
share

基于docker的单服务器伪分布式ceph存储集群搭建

作者站长头像
站长
· 阅读数 21

在处理大规模数据存储和管理时,Ceph是一个备受推崇的解决方案。它是一个高度可扩展的分布式存储系统,具备高性能和高可用性的特性。同时ceph支持多种存储类型,包括文件存储、镜像存储和通过对象网关的对象存储等,所以我们可以通过部署一套完整的ceph集群来完成我们绝大部分的存储需求。 在本文中,我们将分享如何在linux上使用Docker来部署Ceph集群。 简单介绍一下本次部署的系统环境:

操作系统:ubuntu22.04
系统磁盘:暂无多的磁盘资源用于ceph,所以这里采用挂载目录而非设备的方式进入ceph容器用于内容存储

Docker的安装配置

首先,我们需要安装Docker,一个开源的容器化平台,用于简化部署和管理。在终端中执行以下命令,安装Docker(注意,以下内容来自docker官方文档):

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
# install latest version
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

安装完成后,通过检查Docker版本验证安装是否成功:

docker version

准备要使用的ceph镜像

由于ceph的最新镜像已经不在docker官方源上进行维护了,我们在ceph的官方镜像说明中也可以看到相关说明。 所以这里我们去最新的ceph的镜像仓库查找我们需要使用的镜像。 这里我们可以在tag标签中检索出所有的带有stable tag的镜像,对照官方文档中的版本release我们可以确定我们需要使用的镜像版本。 博主这里使用的是 quincy 这个大版本中最新的stable镜像,确定后我们使用下面的命令拉下来镜像。

# 拉取镜像
docker pull quay.io/ceph/daemon:v7.0.3-stable-7.0-quincy-centos-stream8
# 拉取后重命名一下,方便后面使用
docker tag quay.io/ceph/daemon:v7.0.3-stable-7.0-quincy-centos-stream8 ceph/daemon:quincy

开始部署集群

为ceph配置一个docker网络

大部分ceph安装的教程,都使用了host模式通过与宿主机共享端口来简化ceph的部署,但是这样可能会遇到端口占用冲突等问题,所以我们这里采用另一种模式,为他们单独创建一个docker network来支撑他们之间的相互访问。

sudo docker network create --driver bridge --subnet 172.20.0.0/16 ceph-network

启动Ceph-Mon监视器

Ceph-Mon监视器是一个节点,负责监视Ceph集群的状态和访问权限。我们可以使用以下命令运行Ceph-Mon容器:

sudo docker run -d \
--name ceph-mon \
--network ceph-network \ # 这里手动指定network为我们前面创建的network
--ip 172.20.0.10 \ # 指定监视器的ip
--hostname ceph-mon \
-e CLUSTER=ceph \ # 指定集群名称
-e WEIGHT=1.0 \
-e MON_IP=172.20.0.10 \
-e MON_NAME=ceph-mon \
-e CEPH_PUBLIC_NETWORK=172.20.0.0/16 \ 
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph/ \
-v /var/log/ceph/:/var/log/ceph/ \
ceph/daemon:quincy mon # 指定我们运行的是mon实例,部署一个监视器对象

注意我们启动时需要将ceph相关的目录映射到宿主机,需要将ceph相关的配置文件和生成的数据映射到宿主机,后面还需要提供给osd等容器使用

启动Ceph-Mgr

Ceph-Mgr是Ceph的管理器,用于提供API和监控信息(备注:在Luminous版本以后,ceph-mgr是必需的,可以参考官方说明)。执行以下命令启动Ceph-Mgr容器:

sudo docker run -d \
--privileged=true \
--name ceph-mgr \
--hostname ceph-mgr \
--network ceph-network \
--pid=container:ceph-mon \ # 这里我们指定他的pid空间与监视器共享,否则我们后续在一个容器中运行多个osd时会出现问题
--ip 172.20.0.14 \
-e CLUSTER=ceph \
-p 27000:7000 \
-p 28080:8080 \ # 预留的http的dashboard的端口,后续启动dashboard后可以使用
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph/ \
ceph/daemon:quincy mgr

启动OSD

Ceph-OSD是存储数据的核心组件,我们可以在集群中启动多个OSD,以实现高可用性和数据冗余。以下是一个启动OSD容器的示例:

为osd创建认证凭证并且初始化osd目录

这里由于我们是使用directory模式启动的osd,所以在启动前我们需要通过ceph-mon来初始化节点目录

# 创建认证凭据
ceph auth get-or-create osd.1 mon 'allow profile osd' osd 'allow *' mgr 'allow profile osd' -o /var/lib/ceph/osd/ceph-1/keyring
# 初始化节点1的目录,这里可能会有一些警告信息输出,可以忽略
ceph-osd --conf /etc/ceph/ceph.conf --osd-data /var/lib/ceph/osd/ceph-1/ --mkfs -i "1"

节点目录初始化后,我们可以启动我们的osd了

sudo docker run -d \
--name ceph-osd-1 \
--hostname ceph-osd-1 \
--network ceph-network \
--ip 172.20.0.11 \
--pid=container:ceph-mon \
-e CLUSTER=ceph \
-e WEIGHT=1.0 \
-e MON_NAME=ceph-mon \
-e MON_IP=172.20.0.10 \
-e OSD_TYPE=directory \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph/ \
-v /etc/localtime:/etc/localtime:ro \
ceph/daemon:quincy osd_directory_single

注意我们上面启动的实例是 osd_directory_single,根据官方文档,还有一种 osd_directory 类型的实例,但是博主实测启动这种实例会报错(似乎是官方已经移除了但是说明文件没有更新?) 启动其他的节点类似,这里我们就不详细说明了,可以根据节点一自行修改后启动。

部署RDS对象存储网关

RDS对象存储网关(Radosgw)是Ceph的一个重要组件,用于提供S3和Swift兼容的接口。通过以下命令启动Radosgw容器:

# 创建认证key
sudo docker exec ceph-mon ceph auth get client.bootstrap-rgw -o /var/lib/ceph/bootstrap-rgw/ceph.keyring
# 启动对象存储网关
sudo docker run -d \
--privileged=true \
--name ceph-rgw \
--hostname ceph-rgw \
--network ceph-network \
--ip 172.20.0.15 \
-e CLUSTER=ceph \
-e RGW_NAME=ceph-rgw \
-p 27480:7480 \ # 映射对象网关的端口到宿主机,提供给外部访问
-v /var/lib/ceph/:/var/lib/ceph/ \
-v /etc/ceph:/etc/ceph \
-v /etc/localtime:/etc/localtime:ro \
ceph/daemon:quincy rgw```

检查ceph集群状态

到这一步,我们的集群部署就完成了,下面我们通过命令来检查一下集群的状态:

docker exec -it ceph-mon ceph -s

如果前面的部署都成功了,我们这里可以看到类似的输出:

基于docker的单服务器伪分布式ceph存储集群搭建 注意这里的osd数量要和你们实际启动的osd数量对应

开启ceph-dashboard

ceph官方现在在mgr中提供了一个dashboard用于监控管理集群的整体状态,我们可以将它开启后通过可视化界面查看集群的状态,运行下面的命令开启dashboard:

# 开启dashboard
ceph mgr module enable dashboard
# 关闭ssl加密,通过http进行访问,默认是8080端口,即我们前面预留的为ceph-mgr容器映射的8080端口
ceph config set mgr mgr/dashboard/ssl false

启动完成后我们还需要创建一个管理员用户,用于访问dashboard

# 生成password文件
docker exec -it ceph-mgr echo "password" > /var/lib/ceph/tmp/passwd
ceph dashboard ac-user-create admin -i /var/lib/ceph/tmp/passwd administrator

现在我们就可以通过我们宿主机的 http://ip:28080 来访问我们的dashboard了

结论

通过以上步骤,我们成功地在Ubuntu上使用Docker部署了Ceph集群,并且启动了对象存储的网关和dashboard,后续可以通过aws的sdk来进行集群的访问