目标

Docker越来越广泛的流行使用, 生产环境逐步采用容器化编排管理,对于Docker的可移植性、隔离性等优势就不必多说了,本篇教程主要讲解如何通过Docker镜像来完成Ceph的集群部署。(其中也有不少大坑, 找了较多的网上教程并未提及,本篇带大家一起来领略下)

脉络

  • 集群部署规划
  • 安装Docker服务
  • 启动MON服务
  • 启动OSD服务
  • 启动MGR服务
  • 启动RGW服务
  • 启动MDS服务
  • 安装Dashboard管理后台
  • 创建FS文件系统
  • 查看整个集群信息

知行

1. 集群部署规划

按照上篇所讲的集群规划, 仍采用三台节点部署, 不同的是IP地址不一样。
在这里插入图片描述
创建三台虚拟机, 本教程采用的是CENTOS7.6版本。

主机名称主机IP说明
CENTOS7-1172.16.0.126容器主节点(Dashbaord、mon、mds、rgw、mgr、osd)
CENTOS7-2172.16.0.125容器子节点(mon、mds、rgw、mgr、osd)
CENTOS7-3172.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服务, 如已安装, 可以忽略此步骤。

  1. 卸载旧版本
    yum -y remove docker  docker-common docker-selinux docker-engine
    
  2. 安装依赖包
    yum -y install yum-utils device-mapper-persistent-data lvm2
    
  3. 配置YUM源
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    
  4. 安装Docker服务
    安装最新版Docker, 为避免版本兼容性问题,这里就指定当时所安装的版本18.03.1-ce:
    yum -y install docker-ce-18.03.1.ce
    
  5. 启动服务
    systemctl start docker
    
    并设置开机启动
    systemctl enable docker
    
  6. 查看安装的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
    
    出现以上提示, 代表安装成功。
  7. 修改Docker仓库镜像, 加速下载
    vi /etc/docker/daemon.json
    {
      "registry-mirrors": [
        "https://registry.docker-cn.com",
        "http://hub-mirror.c.163.com",
        "https://docker.mirrors.ustc.edu.cn"
      ]
    }
    
    需要重启Docker服务
    systemctl daemon-reload
    systemctl restart docker
    
  8. 下载Ceph镜像
    这里要注意版本,不要贸然采用最新版, 有些会是存在缺陷, 安装的时候会出现问题, 这里采用的nautilus版本。
    版本说明:
    本名称版本号发布时间
    早期版本
    Luminous12.2.122017年10月
    mimic13.2.72018年5月
    nautilus14.2.52019年2月
    octopus15.2.12020年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服务。先在主节点操作。

  1. 在主节点的/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服务,不能乱填。
  2. 给脚本增加权限:

    [root@CENTOS7-1 ~]# chmod 777 -R  /usr/local/ceph/admin/start_mon.sh
    
  3. 启动mon服务:

    [root@CENTOS7-1 ~]# /usr/local/ceph/admin/start_mon.sh
    
  4. 创建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"
    
  5. 检查mon服务状态,
    出现HEALTH_OK代表服务启动成功:

    [root@CENTOS7-1 admin]# docker exec -it mon ceph -s  
      cluster:
        id:     646aa796-0240-4dd8-83b3-8781779a8feb
        health: HEALTH_OK
    
  6. 将主节点配置复制到其他两个节点, 覆盖/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
    
  7. 检查集群状态
    这里我们只搭建了三个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服务

以下步骤在三台节点依次处理。

  1. 创建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/
    
  2. 创建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。

  3. 创建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节点服务上执行。

  4. 启动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
    
  5. 如果osd启动失败, 检查确认目录权限

    chown 167:167 -R /usr/local/ceph
    chmod 777 -R /usr/local/ceph
    

6. 启动mgr服务

依次在三台节点上执行。

  1. 创建启动脚本
    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
    
  2. 启动服务
    执行/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服务

依次在三台节点上执行。

  1. 创建启动脚本

    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
    
  2. 在mon节点生成rgw密钥信息

    docker exec mon ceph auth get client.bootstrap-rgw -o /var/lib/ceph/bootstrap-rgw/ceph.keyring
    
  3. 启动服务
    执行/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服务

依次在三台节点上执行。

  1. 创建启动脚本

    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。

  2. 启动服务
    执行/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管理后台

在主节点执行即可。

  1. 开启dashboard功能

    docker exec mgr ceph mgr module enable dashboard
    
  2. 创建证书

    docker exec mgr ceph dashboard create-self-signed-cert
    
  3. 创建登陆用户与密码:

    docker exec mgr ceph dashboard set-login-credentials admin test
    

    设置用户名为admin, 密码为test。

  4. 配置外部访问端口

    docker exec mgr ceph config set mgr mgr/dashboard/server_port 18080
    
  5. 配置外部访问IP

    docker exec mgr ceph config set mgr mgr/dashboard/server_addr $IP
    
  6. 关闭https(如果没有证书或内网访问, 可以关闭)

    docker exec mgr ceph config set mgr mgr/dashboard/ssl false
    
  7. 重启Mgr DashBoard服务

    docker restart mgr
    
  8. 查看Mgr DashBoard服务信息

    [root@CENTOS7-1 admin]# docker exec mgr ceph mgr services
    {
       "dashboard": "http://0.0.0.0:18080/"
    }	
    

    管理控制台界面:
    在这里插入图片描述

10. 创建FS文件系统

在主节点执行即可。

  1. 创建Data Pool:

    docker exec osd ceph osd pool create cephfs_data 128 128
    
  2. 创建Metadata Pool:

    docker exec osd ceph osd pool create cephfs_metadata 64 64
    

    注意: 如果受mon_max_pg_per_osd限制, 不能设为128,可以调小点, 改为64。

  3. 创建CephFS:

    docker exec osd ceph fs new cephfs cephfs_metadata cephfs_data
    

    将上面的数据池与元数据池关联, 创建cephfs的文件系统。

  4. 查看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

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐