Ceph实战(三):用docker搭建Ceph集群

3,389 阅读9分钟

您好,我是码农飞哥,本篇文章是Ceph实战专栏的第三篇文章,承接上文,默认我们已经在虚拟机上装好了docker,本文主要讲如何启动ceph文件系统的各个组件,将集群搭建起来。

环境

创建三台虚拟机,本教程采用的Linux是CentOS7.6版本,Docker的版本是19.03.13,Ceph的版本是nautilus。三台虚拟机的情况如下:

主机名称主机IP说明
ceph1192.168.161.137容器主节点(Dashbaord、mon、rgw、mgr、osd)
ceph2192.168.161.135容器子节点(mon、rgw、mgr、osd)
ceph3192.168.161.136容器子节点(mon、rgw、mgr、osd)

预检

部署Ceph之前我们需要对自身机器的环境做一个预检查。主要涉及到防火墙,主机名等设置。

  1. 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
  1. 关闭selinux(linux的安全子系统)
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0

PS: 正式环境实际部署时,最好通过加入IP白名单的方式来操作,而不是直接关闭防火墙。 3. 设置主机名,分别把三台虚拟机的主机名设置成ceph1,ceph2,ceph3。

hostnamectl set-hostname ceph1
hostnamectl set-hostname ceph2
hostnamectl set-hostname ceph3
  1. 在主节点ceph1配置免密登录到ceph2和ceph3,下面命令在主节点ceph1上执行。
#在192.168.161.133(ceph1)上执行:
ssh-keygen
#把密钥发给ceph2、ceph3
ssh-copy-id ceph2 
ssh-copy-id ceph3
  1. 在三个节点上分别执行下列命令配置host。
cat >> /etc/hosts <<EOF
192.168.161.137 ceph1
192.168.161.135 ceph2
192.168.161.136 ceph3
EOF
  1. 打开ntp服务 ntp服务的作用是用于同步不同机器的时间。如果不打开ntp服务的话,则有可能会出现 clock skew detected on mon.ceph1, mon.ceph2这种问题。
#查看ntp,如果状态是inactive,则表示没启动
systemctl status ntpd
#启动ntp服务
systemctl start ntpd
#设置开启自启动ntp服务
systemctl enable ntpd
  1. 其他配置 把容器内的 ceph 命令 alias 到本地,方便使用,其他 ceph 相关命令也可以参考添加:
echo 'alias ceph="docker exec mon ceph"' >> /etc/profile
source /etc/profile

上面的预检做完之后,下面我们就开始具体的部署。

部署

1. 创建Ceph目录

在宿主机上创建Ceph目录与容器建立映射,便于直接操纵管理Ceph配置文件,以root身份在主要节点ceph1上创建这四个文件夹,命令如下:

mkdir -p /usr/local/ceph/{admin,etc,lib,logs}

该命令会一次创建4个指定的目录,注意逗号分隔,不能有空格。 其中: admin文件夹下用于存储启动脚本, etc文件夹下存放了ceph.conf等配置文件 lib文件夹下存放了各组件的密钥文件 logs文件夹下存放了ceph的日志文件。 2. 对docker内用户进行授权

chown -R 167:167 /usr/local/ceph/  #docker内用户id是167,这里进行授权

2. 安装docker(省略,见上文,三台机器)

3. 创建OSD磁盘

  1. 创建OSD磁盘 OSD服务是对象存储守护进程,负责把对象存储到本地文件系统,必须要有一块独立的磁盘作为存储。

  2. 如果没有独立磁盘,我们可以在Linux下面创建一个虚拟磁盘进行挂载,步骤如下: 2.1. 初始化10G的镜像文件:

    mkdir -p /usr/local/ceph-disk
    dd if=/dev/zero of=/usr/local/ceph-disk/ceph-disk-01 bs=1G count=10
    

    2.2. 将镜像文件虚拟成块设备: losetup -f /usr/local/ceph-disk/ceph-disk-01 2.3. 格式化(名称根据fdisk -l进行查询): mkfs.xfs -f /dev/loop0 2.4. 挂载文件系统,就是将loop0磁盘挂载到/dev/osd目录下,

     ```
        mkdir -p /dev/osd
        mount /dev/loop0  /dev/osd
     ```
    
  3. 如果有独立磁盘的话(如果是虚拟机的话,则只需要在VM的设置上添加一个硬盘,如图所示) 在这里插入图片描述

    3.1 直接格式化( 名称根据fdisk -l进行查询) mkfs.xfs -f /dev/sdb 3.2 挂载文件系统:

    	   mkdir -p /dev/osd
    	  mount /dev/sdb  /dev/osd
    	```
    
  4. 可以通过df -h命令查看挂载结果

4. 拉取ceph

这里用到了 dockerhub 上最流行的 ceph/daemon 镜像(这里需要拉取nautilus版本的ceph,latest-nautilus)

docker pull ceph/daemon:latest-nautilus

5. 编写脚本(脚本都放在admin文件夹下)

1. start_mon.sh

!/bin/bash
docker run -d --net=host \
    --name=mon \
    -v /etc/localtime:/etc/localtime \
    -v /usr/local/ceph/etc:/etc/ceph \
    -v /usr/local/ceph/lib:/var/lib/ceph \
    -v /usr/local/ceph/logs:/var/log/ceph \
    -e MON_IP=192.168.161.137,192.168.161.135,192.168.161.136 \
    -e CEPH_PUBLIC_NETWORK=192.168.161.0/24 \
    ceph/daemon:latest-nautilus  mon

这个脚本是为了启动监视器,监视器的作用是维护整个Ceph集群的全局状态。一个集群至少要有一个监视器,最好要有奇数个监视器。方便当一个监视器挂了之后可以选举出其他可用的监视器。启动脚本说明:

  1. name参数,指定节点名称,这里设为mon
  2. -v xxx:xxx 是建立宿主机与容器的目录映射关系,包含 etc、lib、logs目录。
  3. MON_IP是Docker运行的IP地址(通过ifconfig来查询,取ens33里的inet那个IP),这里我们有3台服务器,那么MAN_IP需要写上3个IP,如果IP是跨网段的CEPH_PUBLIC_NETWORK必须写上所有网段。
  4. CEPH_PUBLIC_NETWORK配置了运行Docker主机所有网段 这里必须指定nautilus版本,不然会默认操作最新版本ceph,mon必须与前面定义的name保持一致。 2. start_osd.sh
#!/bin/bash
docker run -d \
    --name=osd \
    --net=host \
    --restart=always \
    --privileged=true \
    --pid=host \
    -v /etc/localtime:/etc/localtime \
    -v /usr/local/ceph/etc:/etc/ceph \
    -v /usr/local/ceph/lib:/var/lib/ceph \
    -v /usr/local/ceph/logs:/var/log/ceph \
    -v /dev/osd:/var/lib/ceph/osd \
    ceph/daemon:latest-nautilus  osd_directory  

这个脚本是用于启动OSD组件的,OSD(Object Storage Device)是RADOS组件,其作用是用于存储资源。 脚本说明: 1. name 是用于指定OSD容器的名称
2. net 是用于指定host,就是前面我们配置host 3. restart指定为always,使osd组件可以在down时重启。 4.privileged是用于指定该osd是专用的。 这里我们采用的是osd_directory 镜像模式 3. start_mgr.sh

#!/bin/bash
docker run -d --net=host  \
  --name=mgr \
  -v /etc/localtime:/etc/localtime \
  -v /usr/local/ceph/etc:/etc/ceph \
  -v /usr/local/ceph/lib:/var/lib/ceph \
  -v /usr/local/ceph/logs:/var/log/ceph \
  ceph/daemon:latest-nautilus mgr

这个脚本是用于启动mgr组件,它的主要作用是分担和扩展monitor的部分功能,提供图形化的管理界面以便我们更好的管理ceph存储系统。其启动脚本比较简单,在此不再赘述。 4. start_rgw.sh

#!/bin/bash
docker run \
    -d --net=host \
    --name=rgw \
    -v /etc/localtime:/etc/localtime \
    -v /usr/local/ceph/etc:/etc/ceph \
    -v /usr/local/ceph/lib:/var/lib/ceph \
    -v /usr/local/ceph/logs:/var/log/ceph \
    ceph/daemon:latest-nautilus rgw

该脚本主要是用于启动rgw组件,rgw(Rados GateWay)作为对象存储网关系统,一方面扮演RADOS集群客户端角色,为对象存储应用提供数据存储,另一方面扮演HTTP服务端角色,接受并解析互联网传送的数据。

6. 执行脚本

启动mon

  1. 首先在主节点ceph1上执行start_mon.sh脚本,启动后通过docker ps -a|grep mon查看启动结果,启动成功之后生成配置数据,在ceph主配置文件中,追加如下内容:
cat >>/usr/local/ceph/etc/ceph.conf <<EOF
# 容忍更多的时钟误差
mon clock drift allowed = 2
mon clock drift warn backoff = 30
# 允许删除pool
mon_allow_pool_delete = true
 
[mgr]
# 开启WEB仪表盘
mgr modules = dashboard
[client.rgw.ceph1]
# 设置rgw网关的web访问端口
rgw_frontends = "civetweb port=20003"
EOF
  1. 拷贝所有数据(已包含脚本)到另外2台服务器
scp -r /usr/local/ceph ceph2:/usr/local/
scp -r /usr/local/ceph ceph3:/usr/local/
  1. 通过远程ssh,在ceph2和ceph3上依次启动mon(启动前不要修改ceph.conf文件)
ssh ceph2 bash /usr/local/ceph/admin/start_mon.sh
ssh ceph3 bash /usr/local/ceph/admin/start_mon.sh

启动后通过 ceph -s查看集群状态,如果能够看到ceph2和ceph3,则表示集群创建成功,此时的状态应该是HEALTH_OK状态。

启动OSD

在执行start_osd.sh脚本之前,首先需要在mon节点生成osd的密钥信息,不然直接启动会报错。命令如下:

docker exec -it mon ceph auth get client.bootstrap-osd -o /var/lib/ceph/bootstrap-osd/ceph.keyring

接着在主节点下执行如下命令:

bash /usr/local/ceph/admin/start_osd.sh
ssh ceph2 bash /usr/local/ceph/admin/start_osd.sh
ssh ceph3 bash /usr/local/ceph/admin/start_osd.sh

全部osd都启动之后,稍等片刻后,执行ceph -s查看状态,应该可以看到多了如下信息(总共3个osd)

  osd: 3 osds: 3 up, 3 in 

PS: osd的个数最好维持在奇数个。

启动mgr

直接在主节点ceph1上执行如下三个命令:

bash /usr/local/ceph/admin/start_mgr.sh
ssh ceph2 bash /usr/local/ceph/admin/start_mgr.sh
ssh ceph3 bash /usr/local/ceph/admin/start_mgr.sh

启动rgw

同样的我们首先还是需要先在mon节点生成rgw的密钥信息,命令如下:

docker exec mon ceph auth get client.bootstrap-rgw -o /var/lib/ceph/bootstrap-rgw/ceph.keyring

接着在主节点ceph1上执行如下三个命令:

bash /usr/local/ceph/admin/start_rgw.sh
ssh ceph2 bash /usr/local/ceph/admin/start_rgw.sh
ssh ceph3 bash /usr/local/ceph/admin/start_rgw.sh

启动完成之后再通过ceph-s查看集群的状态 在这里插入图片描述

安装Dashboard管理后台

首先确定主节点,通过ceph -s命令查看集群状态,找到mgr为active的那个节点,如下:

  mgr: ceph1(active), standbys: ceph2, ceph3

这里的主节点就是ceph1节点。

  1. 开启dashboard功能
docker exec mgr ceph mgr module enable dashboard
  1. 创建登录用户与密码
docker exec mgr ceph dashboard set-login-credentials admin test

这里设置用户名为admin,密码为test。 3. 配置外部访问端口个,这里指定端口号是18080,可以自定义修改

docker exec mgr ceph config set mgr mgr/dashboard/server_port 18080
  1. 配置外部访问地址,这里我的主节点IP是192.168.161.137,你需要换成自己的IP地址。
docker exec mgr ceph config set mgr mgr/dashboard/server_addr 192.168.161.137
  1. 关闭https(如果没有证书或内网访问, 可以关闭)
docker exec mgr ceph config set mgr mgr/dashboard/ssl false
  1. 重启Mgr DashBoard服务
docker restart mgr
  1. 查看Mgr DashBoard服务
docker exec mgr ceph mgr services

最后通过 http://192.168.161.137:18080/#/dashboard 访问。 在这里插入图片描述

查看整个集群信息

至此,整个集群就已经搭建完毕,通过ceph -s命令,可以查看整个集群信息,我们规划的所有节点都已创建成功并加入集群 在这里插入图片描述

总结

本文介绍了通过docker部署ceph集群的详细步骤,本文只是启动了核心的必要的组件,一共有 mon,osd,mgr,rgw四个组件,其中mon,osd,mgr组件是必须要启动的,rgw组件是作为对象存储的网关系统,如果不用对象存储的话则不需要启动该组件,其他的组件入mds也只是cephFS才需要用到。后面文章会详细介绍这些组件的作用,本文主要是将集群搭建起来。

参考

Centos7系统Docker Ceph 集群的安装配置(中篇) [基于Docker部署ceph分布式文件系统MImic13.2