目标
Docker越来越广泛的流行使用, 生产环境逐步采用容器化编排管理,对于Docker的可移植性、隔离性等优势就不必多说了,本篇教程主要讲解如何通过Docker镜像来完成Ceph的集群部署。(其中也有不少大坑, 找了较多的网上教程并未提及,本篇带大家一起来领略下)
脉络
- 集群部署规划
- 安装Docker服务
- 启动MON服务
- 启动OSD服务
- 启动MGR服务
- 启动RGW服务
- 启动MDS服务
- 安装Dashboard管理后台
- 创建FS文件系统
- 查看整个集群信息
知行
1. 集群部署规划
按照上篇所讲的集群规划, 仍采用三台节点部署, 不同的是IP地址不一样。
创建三台虚拟机, 本教程采用的是CENTOS7.6版本。
主机名称 | 主机IP | 说明 |
---|---|---|
CENTOS7-1 | 172.16.0.126 | 容器主节点(Dashbaord、mon、mds、rgw、mgr、osd) |
CENTOS7-2 | 172.16.0.125 | 容器子节点(mon、mds、rgw、mgr、osd) |
CENTOS7-3 | 172.16.0.124 | 容器子节点(mon、mds、rgw、mgr、osd) |
2. 创建Ceph目录
在宿主机上创建Ceph目录与容器建立映射, 便于直接操纵管理Ceph配置文件。
以root身份依次在三台节点上创建/usr/local/ceph/{admin,data, etc,lib, logs}目录:
[root@CENTOS7-1 ~]# mkdir -p /usr/local/ceph/{admin,data,etc,lib,logs}
该命令会一次创建5个指定的目录, 注意逗号分隔, 不能有空格。
授予ceph用户权限
[root@CENTOS7-1 ~]# chown -R ceph:ceph /usr/local/ceph
将目录权限赋予ceph用户, 如果仍碰到目录权限问题,可将目录权限全部放开:
[root@CENTOS7-1 ~]# chmod 777 -R /usr/local/ceph
坑提示: 如果要进行重装, 最好要将所有目录内容文件清空, 避免残留配置影响。
3. 安装Docker服务
在三台节点上安装Docker服务, 如已安装, 可以忽略此步骤。
- 卸载旧版本
yum -y remove docker docker-common docker-selinux docker-engine
- 安装依赖包
yum -y install yum-utils device-mapper-persistent-data lvm2
- 配置YUM源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 安装Docker服务
安装最新版Docker, 为避免版本兼容性问题,这里就指定当时所安装的版本18.03.1-ce:yum -y install docker-ce-18.03.1.ce
- 启动服务
并设置开机启动systemctl start docker
systemctl enable docker
- 查看安装的Docker版本
出现以上提示, 代表安装成功。[root@CENTOS7-1 admin]# docker version Client: Version: 18.03.1-ce API version: 1.37 Go version: go1.9.5 Git commit: 9ee9f40 Built: Thu Apr 26 07:20:16 2018 OS/Arch: linux/amd64 Experimental: false Orchestrator: swarm Server: Engine: Version: 18.03.1-ce API version: 1.37 (minimum version 1.12) Go version: go1.9.5 Git commit: 9ee9f40 Built: Thu Apr 26 07:23:58 2018 OS/Arch: linux/amd64 Experimental: false
- 修改Docker仓库镜像, 加速下载
vi /etc/docker/daemon.json
需要重启Docker服务{ "registry-mirrors": [ "https://registry.docker-cn.com", "http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn" ] }
systemctl daemon-reload systemctl restart docker
- 下载Ceph镜像
这里要注意版本,不要贸然采用最新版, 有些会是存在缺陷, 安装的时候会出现问题, 这里采用的nautilus版本。
版本说明:
拉取镜像:本名称 版本号 发布时间 早期版本 … … Luminous 12.2.12 2017年10月 mimic 13.2.7 2018年5月 nautilus 14.2.5 2019年2月 octopus 15.2.1 2020年4月
修改版本分支,便于后续使用docker pull ceph/daemon:master-7ef46af-nautilus-centos-7-x86_64
docker images
修改命令:REPOSITORY TAG IMAGE ID CREATED SIZE ceph/daemon master-7ef46af-nautilus-centos-7-x86_64 6f68932df7dd 10 months ago 946MB
docker tag 6f68932df7dd ceph/daemon:latest
4. 启动MON服务
三台节点上都需安装Mon服务。先在主节点操作。
-
在主节点的/usr/local/ceph/admin目录下创建start_mon.sh脚本:
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=172.16.0.126,172.16.0.125,172.16.0.124 \ -e CEPH_PUBLIC_NETWORK=172.16.0.0/24 \ ceph/daemon:latest mon
- name参数,指定节点名称, 这里设为mon
- 建立宿主机与容器的目录映射关系,包含etc、lib、logs目录
- MON_IP 参数指定mon服务的节点IP信息
- CEPH_PUBLIC_NETWORK参数,指定mon的ip网段信息(注意这里是24位,将最后一位改为0就可以)。
- 最后指定镜像版本, 采用的是最新镜像, mon为参数, 代表启动的是mon服务,不能乱填。
-
给脚本增加权限:
[root@CENTOS7-1 ~]# chmod 777 -R /usr/local/ceph/admin/start_mon.sh
-
启动mon服务:
[root@CENTOS7-1 ~]# /usr/local/ceph/admin/start_mon.sh
-
创建Ceph配置文件
vi /usr/local/ceph/etc/ceph.conf
配置内容及说明:
[global] fsid = 646aa796-0240-4dd8-83b3-8781779a8feb # mon节点名称 mon initial members = CENTOS7-1 # mon 主机地址信息 mon host = 172.16.0.126,172.16.0.125,172.16.0.124 # 对外访问的IP网段 public network = 172.16.0.0/24 # 集群IP网段 cluster network = 172.16.0.0/24 # journal 大小 , 一般设为(磁盘带宽 * 文件同步刷新时间)的2倍 osd journal size = 100 # 设置pool池默认分配数量 osd pool default size = 2 # 容忍更多的时钟误差 mon clock drift allowed = 10 mon clock drift warn backoff = 30 # 允许删除pool mon_allow_pool_delete = true [mgr] # 开启WEB仪表盘 mgr modules = dashboard [client.rgw.CENTOS7-1] # 设置rgw网关的web访问端口 rgw_frontends = "civetweb port=20003"
-
检查mon服务状态,
出现HEALTH_OK代表服务启动成功:[root@CENTOS7-1 admin]# docker exec -it mon ceph -s cluster: id: 646aa796-0240-4dd8-83b3-8781779a8feb health: HEALTH_OK
-
将主节点配置复制到其他两个节点, 覆盖/usr/local/ceph/目录。
远程复制:scp -r /usr/local/ceph/ root@172.16.0.125:/usr/local/ scp -r /usr/local/ceph/ root@172.16.0.124:/usr/local/
复制完成之后, 分别在其他两个节点启动mon服务
[root@CENTOS7-2 ~]# /usr/local/ceph/admin/start_mon.sh [root@CENTOS7-3 ~]# /usr/local/ceph/admin/start_mon.sh
-
检查集群状态
这里我们只搭建了三个mon节点, 正常的话可以看到已成功组件集群:[root@CENTOS7-1 local]# docker exec -it mon ceph -s cluster: id: 646aa796-0240-4dd8-83b3-8781779a8feb health: HEALTH_OK services: mon: 3 daemons, quorum CENTOS7-1,CENTOS7-2,CENTOS7-3 (age 5s) mgr: no daemons active osd: 0 osds: 0 up, 0 in data: pools: 0 pools, 0 pgs objects: 0 objects, 0 B usage: 0 B used, 0 B / 0 B avail pgs:
5. 启动OSD服务
以下步骤在三台节点依次处理。
-
创建OSD磁盘
OSD服务是对象存储守护进程, 负责把对象存储到本地文件系统, 必须要有一块独立的磁盘作为存储。
① 如果没有独立磁盘,怎么办? 可以在Linux下面创建一个虚拟磁盘进行挂载。
初始化10G的镜像文件:mkdir -p /usr/local/ceph-disk dd if=/dev/zero of=/usr/local/ceph-disk/ceph-disk-01 bs=1G count=10
将镜像文件虚拟成块设备:
losetup -f /usr/local/ceph-disk/ceph-disk-01
格式化:
#名称根据fdisk -l进行查询确认, 一般是/dev/loop0 mkfs.xfs -f /dev/loop0
挂载文件系统:
mkdir -p /usr/local/ceph/data/osd/ mount /dev/loop0 /usr/local/ceph/data/osd/
② 如果有独立磁盘的话,那就简单一些。
直接格式化:#名称根据fdisk -l进行查询 mkfs.xfs -f /dev/sdb
挂载文件系统:
mkdir -p /usr/local/ceph/data/osd/ mount /dev/sdb /usr/local/ceph/data/osd/
-
创建OSD服务启动脚本
vi /usr/local/ceph/admin/start_osd.sh
脚本内容:
docker run -d \ --name=osd \ --net=host \ --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 /usr/local/ceph/data/osd:/var/lib/ceph/osd \ ceph/daemon:latest osd_directory
再赋予权限:
chmod 777 /usr/local/ceph/admin/start_osd.sh
说明: 这里我们采用的是osd_directory镜像模式,如果有独立磁盘的话, 也可以采用osd_ceph_disk模式, 不需格式化, 直接指定设备名称即可OSD_DEVICE=/dev/sdb。
-
创建OSD密钥文件
这里有个坑, 如果不创建密钥, 直接启动脚本会出现错误:2019-12-08 23:56:26 /opt/ceph-container/bin/entrypoint.sh: static: does not generate config 2019-12-08 23:56:26 /opt/ceph-container/bin/entrypoint.sh: Creating osd [errno 13] error connecting to the cluster
或者错误:
docker ceph var/lib/ceph/bootstrap-osd ceph.keyring must exist. You can extract it from your curren ...
创建密钥文件的命令(三台mon节点都需执行):
docker exec -it mon ceph auth get client.bootstrap-osd -o /var/lib/ceph/bootstrap-osd/ceph.keyring
注意, 该命令是在容器mon节点服务上执行。
-
启动osd节点
最后执行/usr/local/ceph/admin/start_osd.sh脚本, 启动osd服务。
检查容器是否启动成功:[root@CENTOS7-1 admin]# docker ps -a | grep osd 8294effe52dc ceph/daemon:latest "/opt/ceph-container…" 1 days ago Up 1 days osd
-
如果osd启动失败, 检查确认目录权限
chown 167:167 -R /usr/local/ceph chmod 777 -R /usr/local/ceph
6. 启动mgr服务
依次在三台节点上执行。
- 创建启动脚本
脚本内容:vi /usr/local/ceph/admin/start_mgr.sh
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 mgr
- 启动服务
执行/usr/local/ceph/admin/start_mgr.sh脚本。[root@CENTOS7-1 admin]# docker ps -a | grep mgr a98d2a2ab893 ceph/daemon "/opt/ceph-container…" 1 days ago Up 1 days mgr
7. 启动rgw服务
依次在三台节点上执行。
-
创建启动脚本
vi /usr/local/ceph/admin/start_rgw.sh
脚本内容:
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 rgw
-
在mon节点生成rgw密钥信息
docker exec mon ceph auth get client.bootstrap-rgw -o /var/lib/ceph/bootstrap-rgw/ceph.keyring
-
启动服务
执行/usr/local/ceph/admin/start_mgr.sh脚本。[root@CENTOS7-1 admin]# docker ps -a | grep rgw f81e2b9641bb ceph/daemon "/opt/ceph-container…" 1 days ago Up 1 days rgw
8. 启动mds服务
依次在三台节点上执行。
-
创建启动脚本
vi /usr/local/ceph/admin/start_mds.sh
脚本内容:
docker run -d \ --net=host \ --name=mds \ --privileged=true \ -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 CEPHFS_CREATE=0 \ -e CEPHFS_METADATA_POOL_PG=512 \ -e CEPHFS_DATA_POOL_PG=512 \ ceph/daemon mds
说明下:
CEPHFS_CREATE 是为METADATA服务生成文件系统, 0表示不自动创建文件系统(默认值), 1表示自动创建。
CEPHFS_DATA_POOL_PG是数据池的数量,默认为8。
CEPHFS_METADATA_POOL_PG是元数据池的数量,默认为8。 -
启动服务
执行/usr/local/ceph/admin/start_mds.sh脚本。[root@CENTOS7-1 admin]# docker ps -a | grep mds f5daf99bf325 ceph/daemon "/opt/ceph-container…" 1 days ago Up 1 days mds
9. 安装Dashboard管理后台
在主节点执行即可。
-
开启dashboard功能
docker exec mgr ceph mgr module enable dashboard
-
创建证书
docker exec mgr ceph dashboard create-self-signed-cert
-
创建登陆用户与密码:
docker exec mgr ceph dashboard set-login-credentials admin test
设置用户名为admin, 密码为test。
-
配置外部访问端口
docker exec mgr ceph config set mgr mgr/dashboard/server_port 18080
-
配置外部访问IP
docker exec mgr ceph config set mgr mgr/dashboard/server_addr $IP
-
关闭https(如果没有证书或内网访问, 可以关闭)
docker exec mgr ceph config set mgr mgr/dashboard/ssl false
-
重启Mgr DashBoard服务
docker restart mgr
-
查看Mgr DashBoard服务信息
[root@CENTOS7-1 admin]# docker exec mgr ceph mgr services { "dashboard": "http://0.0.0.0:18080/" }
管理控制台界面:
10. 创建FS文件系统
在主节点执行即可。
-
创建Data Pool:
docker exec osd ceph osd pool create cephfs_data 128 128
-
创建Metadata Pool:
docker exec osd ceph osd pool create cephfs_metadata 64 64
注意: 如果受mon_max_pg_per_osd限制, 不能设为128,可以调小点, 改为64。
-
创建CephFS:
docker exec osd ceph fs new cephfs cephfs_metadata cephfs_data
将上面的数据池与元数据池关联, 创建cephfs的文件系统。
-
查看FS信息:
[root@CENTOS7-1 admin]# docker exec osd ceph fs ls name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
11. 查看整个集群信息
至此, 整个集群就已经搭建完毕, 通过ceph -s 命令, 可以查看整个集群信息,我们规划的所有节点都已创建成功并加入集群。
[root@CENTOS7-1 admin]# docker exec mon ceph -s
cluster:
id: 646aa796-0240-4dd8-83b3-8781779a8feb
health: HEALTH_OK
services:
mon: 3 daemons, quorum CENTOS7-1,CENTOS7-2,CENTOS7-3 (age 6d)
mgr: CENTOS7-1(active, since 6d), standbys: CENTOS7-3, CENTOS7-2
mds: cephfs:1 {0=CENTOS7-1=up:active} 2 up:standby
osd: 3 osds: 3 up (since 6d), 3 in (since 6d)
rgw: 3 daemons active (CENTOS7-1, CENTOS7-2, CENTOS7-3)
data:
pools: 8 pools, 360 pgs
objects: 256 objects, 46 KiB
usage: 3.3 GiB used, 27 GiB / 30 GiB avail
pgs: 360 active+clean
12. 关于重启mon服务失败问题
如果修改了配置或者宿主机出现问题, 需要重启mon服务, 会出现不能正常启动的问题,查看容器日志, 最后一行提示:
Existing mon, trying to rejoin cluster abort
没有具体的原因, 解决的办法是删除/usr/local/ceph/lib/mon目录, 再重新启动, 但这会破坏原有配置与数据, 影响集群的正常运转,这是我们不能接受的, 无耐,只有研究它的启动脚本。( 这不是Docker容器问题, 是Ceph的镜像脚本编写有点问题。) 将脚本拷贝出来:
docker cp mon:/opt/ceph-container/bin/start_mon.sh .
找到并修改以下内容:
# 注释此行,直接将v2v1复制为2,代表是走V2协议, 以指定IP方式加入集群
#v2v1=$(ceph-conf -c /etc/ceph/${CLUSTER}.conf 'mon host' | tr ',' '\n' | grep -c ${MON_IP})
v2v1=2
再将脚本复制至容器内:
docker cp start_mon.sh mon:/opt/ceph-container/bin/start_mon.sh
这样就搞定了, 大伙又可以愉快的重启玩转Ceph集群了。
合一
- 本章教程讲解了通过Docker Ceph完成了整个集群的搭建,通过容器镜像,可以简化一些配置,但是也多出一些容器脚本的配置, 大家要注意不要搞混淆了。这里容器网络都是采用HOST主机模式, 便于Ceph集群内外部的通讯, 大家也可以根据自己的需要, 组建不同的网络模式。
- Docker Ceph 镜像最新版难免会有些坑, 在生产环境当中, 建议大家选用稳定版, 尝鲜就在实验中试试就行了。
- Docker Ceph集群创建好了, 在实际环境当中如何去调用? rgw服务在librados之上向应用提供访问ceph集群的RestAPI,支持Amazon S3和openstack swift两种接口, 下篇会针对Java Swift Api 封装与调用来做讲解。
本文由mirson创作分享,如需进一步交流,请加QQ群:19310171或访问www.softart.cn