centos7.2 搭建ceph集群

centos7.2 搭建ceph集群

最近正在学习Kubernetes,搭建Kubernetes。看到可以使用harbor和cephfs配合搭建docker私有仓库。于是学习搭建ceph集群。

  1. 环境介绍

    使用腾讯云的两台两台主机操作系统的和版本内核为: centos 7.2 、Linux 3.10.0-693.el7.x86_64。ceph 采用ceph version 10.2.10。

  2. Ceph 安装原理

    ceph分布式存储由若干个组件组成,包括:Ceph Monitor、Ceph OSD和Ceph MDS,其中如果你仅使用对象存储和块存储时,MDS不是必须的,仅当你用使用Cephfs时,MDS才是需要安装的。

    ceph的安装模型与k8是有些类似,也是通过一个deploy node远程操作其他Node以进行create、prepare和activate各个node上的组件,官方给的组件示意图如下:

    centos7.2 搭建ceph集群_第1张图片

​ 本次安装的实际环境是:

admin-node deploy-node 172.16.0.16
mon.node 172.16.0.16
osd.0 172.16.0.16
osd.1 172.16.16.7

两台腾讯云服务器承担多个角色。

  1. 环境准备

    • 配置host文件(每一台主机上)

      172.16.0.16 master
      172.16.0.16 admin # 仅在master上配置
      172.16.16.7 slave1
    • 创建ceph账户

      
      # useradd -d /home/${username} -m ${username}
      
      
      # passwd ${uasername}
      
      
      # cat << EOF > /etc/sudoers.d/ceph
      
      
      # > ceph All = (root) NOPAASSWD ALL
      
      
      # > EOF
      

      创建ceph使用的账户并且赋予sudo无密码权限

    • 配置ssh 免密码登录

      
      # ssh-keygen
      
      
      # 然后把master上的公钥拷贝到其他的节点上去
      
      
      # ssh-copy-id ceph@master
      
      
      # ssh-copy-id ceph@master
      
      
      # ceph 为上一步创建的账户
      

      执行完成后测试ssh免密码登录是否有效。最后在Deploy node节点上创建并编辑~/.ssh/config,这是ceph官方推荐的步骤,这样做的步骤可以避免每次执行ceph-deploy步骤时都要去指定–username参数。

      config内容如下:

      Host master
      Hostname master
      User ceph
      Host slave1
      Hostname slave1
      User ceph

      但是这儿有个小错误,发现创建config文件就就无法登陆了,一开始以为是自己的格式不对,但是怎么修改都不对,最后上网上查找之后发现是权限的问题。

      chmod 600 config

      问题就解决了。

    • 安装ntpd

      
      # yum -y install ntpd
      
      
      # systemctl enable ntpd
      
      
      # systemctl satus ntpd
      

      我参照网上以master节点为ntpd服务器,服务器的配置没有成果,只是简单的同步了一下时间。具体ntpd服务器如何配置请参考centos7.2ntpd服务器配置

  2. 安装ceph

    • 更新系统源

      rm -rf /etc/yum.repos.d/*.repo
      wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
      wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
      sed -i '/aliyuncs/d' /etc/yum.repos.d/CentOS-Base.repo
      sed -i 's/$releasever/7/g' /etc/yum.repos.d/CentOS-Base.repo
      sed -i '/aliyuncs/d' /etc/yum.repos.d/epel.repo
      yum clean all
      yum makecache fast
    • 如果之前安装过ceph,可以先使用如下命令,清理一个干净的环境。

      ceph-deploy purge node1 node2
      ceph-deploy purgedata node1 node2
      ceph-deploy forgetkeys
    • 安装ceph-deploy

      
      #yum install http://mirrors.163.com/ceph/rpm-jewel/el7/noarch/ceph-deploy-1.5.38-0.noarch.rpm
      
      
      
      # 查看ceph-deploy版本
      
      
      # ceph-deploy --version
      
      
      # 1.5.38
      

      这里指定了系统源,防止国外镜像无法下载

    • 安装ceph

      在deploy节点上建立cephinstall目录,我们首先来创建一个ceph cluster,这个环节需要通过执行ceph-deploy new {initial-monitor-node(s)}命令。然后进行目录执行创建的相关命令会在该目录下生产相关的配置文件。我们的ceph monitor node就是master,因此我们执行下面命令来创建一个名为ceph的ceph cluster。

      
      # ceph-deploy new master
      

      遇到如下错误

      Traceback (most recent call last):
      File "/usr/bin/ceph-deploy", line 18, in <module>
       from ceph_deploy.cli import main
      ImportError: No module named ceph_deploy.cli

      从网上查找之后发现是系统python版本的问题吧/usr/bin/ceph-deploy第一行修改成

      /usr/bin/python2.7即可。然后重新执行。

      执行完成后会在cephinstall目录下生成相关的文件。

      
      # ls
      
      
      # eph-deploy-ceph.log     ceph.conf    ceph.mon.keyring
      

      由于我们仅有两个OSD节点,因此我们在进一步安装之前,需要先对ceph.conf文件做一些配置调整:
      修改配置以进行后续安装

      
      # 在 global标签下添加
      
      [global]
      osd pool default size = 2

      ceph.conf保存退出。接下来,我们执行下面命令在master和slave1上安装ceph运行所需的各个binary包.

      ceph-deploy install --release jewel --repo-url http://mirrors.163.com/ceph/rpm-jewel/el7 --gpg-url http://mirrors.163.com/ceph/keys/release.asc master slave1

      安装的时候指定了系统源。同样会因为报系统python版本的问题而报错,修改之后就可以了。

    • 初始化 ceph monitor node

      有了ceph启动的各个程序后,我们首先来初始化ceph cluster的monitor node。在deploy node的工作目录cephinstall下,执行

      ceph-deploy mon create-initial

      执行完成后又会在目录下多出许多配置文件。

    • prepare ceph OSD node。

      至此,ceph-mon组件程序已经成功启动了,剩下的只有OSD这一关了。启动OSD node分为两步:prepare 和 activate。OSD node是真正存储数据的节点,我们需要为ceph-osd提供独立存储空间,一般是一个独立的disk。但我们环境不具备这个条件,于是在本地盘上创建了个目录,提供给OSD。

      在deploy node上执行:
      
      ssh master
      sudo mkdir /var/local/osd0
      exit
      
      ssh slave1
      sudo mkdir /var/local/osd1
      exit
      
      # 如果未给文件添加权限的话在activate的时候会报错
      
      master:
      sudo chown -R ceph:ceph /var/local/osd0
      
      slave1:
      sudo chown -R ceph:ceph /var/local/osd1
      

      接下来,我们就可以执行prepare操作了,prepare操作会在上述的两个osd0和osd1目录下创建一些后续activate激活以及osd运行时所需要的文件。

      
      # ceph-deploy osd activate master:/var/local/osd0 slave1:/var/local/osd1
      

      prepare并不会启动ceph osd,那是activate的职责。

    • activate OSD node

      
      # ceph-deploy osd activate node1:/var/local/osd0 node2:/var/local/osd1
      

      执行这一步的时候我都报错了

      ceph ** ERROR: error creating empty object store in /var/local/osd0: (22) Invalid argument

      这个错误我报的很绝望呀,在网上各种查都不行。怎么也找不到解决办法,然后我最后不知道抽风了的还是怎么的重新执行了以便就执行成功了,这真的让我很绝望。这个问题折腾了我一天。

    • 执行 ceph admin

      没有错误报出!但OSD真的运行起来了吗?我们还需要再确认一下。

      我们先通过ceph admin命令将各个.keyring同步到各个Node上,以便可以在各个Node上使用ceph命令连接到monitor。执行admin

      ceph-deploy admin admin master slave1

      接下来执行 ceph命令查看一下集群节点中的状态:

      ceph osd tree
      ID WEIGHT  TYPE NAME             UP/DOWN REWEIGHT PRIMARY-AFFINITY
      -1 0.07660 root default
      -2 0.03830     host master
      0 0.03830         osd.0            down        0          1.00000
      -3 0.03830     host slave1
      1 0.03830         osd.1            down        0          1.00000

      果然真的报错了,查看一下master上的日志:/var/log/ceph/ceph-osd.0.log:

      错误如下:

      filestore(/var/lib/ceph/osd/ceph-0) mount: enabling WRITEAHEAD journal mode: checkpoint is not enabled
      2018-01-09 16:02:23.806486 7f9343003800 -1 journal FileJournal::_open: disabling aio for non-block journal.  Use journal_force_aio to force use of aio anyway
      2018-01-09 16:02:23.806488 7f9343003800  1 journal _open /var/lib/ceph/osd/ceph-0/journal fd 18: 5368709120 bytes, block size 4096 bytes, directio = 1, aio = 0
      2018-01-09 16:02:23.807386 7f9343003800  1 journal _open /var/lib/ceph/osd/ceph-0/journal fd 18: 5368709120 bytes, block size 4096 bytes, directio = 1, aio = 0
      2018-01-09 16:02:23.807643 7f9343003800  1 filestore(/var/lib/ceph/osd/ceph-0) upgrade
      2018-01-09 16:02:23.807774 7f9343003800 -1 osd.0 0 backend (filestore) is unable to support max object name[space] len
      2018-01-09 16:02:23.807778 7f9343003800 -1 osd.0 0    osd max object name len = 2048
      2018-01-09 16:02:23.807779 7f9343003800 -1 osd.0 0    osd max object namespace len = 256
      2018-01-09 16:02:23.807780 7f9343003800 -1 osd.0 0 (36) File name too long
      2018-01-09 16:02:23.808564 7f9343003800  1 journal close /var/lib/ceph/osd/ceph-0/journal
      2018-01-09 16:02:23.815770 7f9343003800 -1  ** ERROR: osd init failed: (36) File name too long
      

      发现问题是filename 太长,官方不建议采用ext4文件系统作为ceph的后端文件系统,如果采用,那么对于ext4的filesystem,应该在ceph.conf中添加如下配置:修改ceph.conf文件在global标签下添加如下.

      osd max object name len = 256
      osd max object namespace len = 64

      由于配置已经分发到个个node上,我们需要到各个Node上同步修改:/etc/ceph/ceph.conf,添加上面两行。然后重新activate osd node,这里不赘述。重新激活后,我们来查看ceph osd状态:

      $ ceph osd tree
      ID WEIGHT  TYPE NAME             UP/DOWN REWEIGHT PRIMARY-AFFINITY
      -1 0.07660 root default
      -2 0.03830     host master
      0 0.03830         osd.0              up  1.00000          1.00000
      -3 0.03830     host slave1
      1 0.03830         osd.1              up  1.00000          1.00000

      至此ceph集群搭建完成。

      [1]: http://tonybai.com/2016/11/07/integrate-kubernetes-with-ceph-rbd/ “使用Ceph RBD为Kubernetes集群提供存储卷”
      [2]: https://www.lijiawang.org/posts/intsall-ceph.html “基于CentOS 7.3 安装Ceph Jewel 10.2.9”

你可能感兴趣的:(linux,kubernetes,docker)