使用ceoh-deploy工具快速部署ceph–部署

  • Post author:
  • Post category:其他


最近按照ceph的官方文档来部署ceph,发现遇到了不少的问题,其中很多问题都是安装部署的时候遇到的坑,在这里提出来和大家一起分享探讨,如有不足之处欢迎评论。

存储集群部署

在controllernode上我们使用刚刚创建出来的普通用户Bob_Hou来登录,在该普通用户的家目录下创建一个用于我们来部署ceph是存放ceph-deploy释放出来文件的的目录。

mkdir /home/Bob_Hou/my-cluster
cd ./my-cluster/

禁用 requiretty

在某些发行版(如 CentOS )上,执行 ceph-deploy 命令时,如果你的 Ceph 节点默认设置了 requiretty 那就会遇到报错。可以这样禁用此功能:执行 sudo visudo ,找到 Defaults requiretty 选项,把它改为Defaults:ceph !requiretty ,这样 ceph-deploy 就能用 ceph 用户登录并使用 sudo 了。

每个ceph节点都需要执行。

visudo
Defaults:ceph    !requiretty

这里写图片描述

否则会报错 IOError cannot send (already closed)

这里写图片描述

创建集群

清除信息操作

再创建集群前如果在某些地方碰到麻烦,想从头再来,可以用下列命令清除配置:

ceph-deploy purge {ceph-node} [{ceph-node}](连ceph安转包一起清除)
ceph-deploy purgedata {ceph-node} [{ceph-node}] (清楚各个节点上残留的配置文件)
ceph-deploy forgetkeys(清除秘钥环信息)

在管理节点上,进入刚创建的放置配置文件的my_cluster目录,用 ceph-deploy 执行如下步骤。

ceph-deploy new ceph-1(这里我们先用ceph-1作为mon的节点)

在当前目录下用 ls 和 cat 检查 ceph-deploy 的输出,应该有一个 Ceph 配置文件、一个 monitor 密钥环和一个日志文件。ls可以看到有ceph的配置文件个和mon的秘钥环。

这里写图片描述

修改ceph.conf配置文件

把 Ceph 配置文件里的默认副本数从 3 改成 2 ,这样只有两个 OSD 也可以达到 active + clean 状态。把下面这行加入 [global] 段:

osd pool default size = 2

如果你有多个网卡,可以把 public network 写入 Ceph 配置文件的 [global] 段下:

public network = 192.168.1.0/24

如果是3.10的内核请把这个加上:

rbd_default_features = 1

安装ceph,所有节点都必须安装

ceph-deploy install ceph-1 ceph-2 ceph-3 controllernode

错误1:sudo: sorry, you must have a tty to run sudo

这个需要你把visudo中的requiretty选项配置。

错误2:sudo: no tty present and no askpass program specified

由于账号没有开启免密码导致。

错误3:yum安装超时

请参照之前的文档来修改下你的yum源。或者在每个节点上预先执行yum安装命令,如果预先执行了yum安装了ceph的话,这里脚本检测到你有软件包就会跳过安装步骤。

错误4:解析yum安装地址出错

这里写图片描述

检查/etc/resolv.conf 域名解析。

配置初始monitors,并收集所有秘钥

ceph-deploy mon create-initial

当这一步操作成功完成之后my_cluster会成功出现下面的秘钥环

这里写图片描述

如果你之前安装过ceph但是没有及时清理掉配置文件的话,初始化监控会报错。会说已有的配置文件已经存在,需要使用–overwirte-conf来强制替换文件。

这里写图片描述

ceph-deploy mon create-initial --overwrite-conf

添加三个 OSD

为了快速安装,这里我们使用文件夹形式来添加OSD而不是以硬盘。

ssh ceph-1
mkdir /ceph-1
chown -R ceph:ceph /ceph-1/
ssh ceph-2
mkdir /ceph-2
chown -R ceph:ceph /ceph-2/
ssh ceph-3
mkdir /ceph-3
chown -R ceph:ceph /ceph-3/

然后,从管理节点执行 ceph-deploy 来准备 OSD,并且激活。

ceph-deploy osd prepare ceph-1:/ceph-1 ceph-2:/ceph-2 ceph-3:/ceph-3
ceph-deploy osd activate ceph-1:/ceph-1 ceph-2:/ceph-2 ceph-3:/ceph-3

部署jewel版本osd激活权限报错:

[ceph_deploy.osd][DEBUG ] activating host ceph-2 disk /ceph-2

[ceph_deploy.osd][DEBUG ] will use init type: systemd [ceph-2][DEBUG ]

find the location of an executable [ceph-2][INFO ] Running command:

/usr/sbin/ceph-disk -v activate –mark-init systemd –mount /ceph-2

[ceph-2][WARNIN] main_activate: path = /ceph-2 [ceph-2][WARNIN]

activate: Cluster uuid is 5cdb403b-af80-4c98-bacc-edd800024cdf

[ceph-2][WARNIN] command: Running command: /usr/bin/ceph-osd

–cluster=ceph –show-config-value=fsid [ceph-2][WARNIN] activate: Cluster name is ceph [ceph-2][WARNIN] activate: OSD uuid is

a0dc326a-e5ac-438c-8214-a5f74006156e [ceph-2][WARNIN] allocate_osd_id:

Allocating OSD id… [ceph-2][WARNIN] command: Running command:

/usr/bin/ceph –cluster ceph –name client.bootstrap-osd –keyring

/var/lib/ceph/bootstrap-osd/ceph.keyring osd create –concise

a0dc326a-e5ac-438c-8214-a5f74006156e [ceph-2][WARNIN] command: Running

command: /usr/sbin/restorecon -R /ceph-2/whoami.12486.tmp

[ceph-2][WARNIN] command: Running command: /usr/bin/chown -R ceph:ceph

/ceph-2/whoami.12486.tmp [ceph-2][WARNIN] activate: OSD id is 0

[ceph-2][WARNIN] activate: Initializing OSD… [ceph-2][WARNIN]

command_check_call: Running command: /usr/bin/ceph –cluster ceph

–name client.bootstrap-osd –keyring /var/lib/ceph/bootstrap-osd/ceph.keyring mon getmap -o

/ceph-2/activate.monmap [ceph-2][WARNIN] got monmap epoch 1

[ceph-2][WARNIN] command: Running command: /usr/bin/timeout 300

ceph-osd –cluster ceph –mkfs –mkkey -i 0 –monmap

/ceph-2/activate.monmap –osd-data /ceph-2 –osd-journal

/ceph-2/journal –osd-uuid a0dc326a-e5ac-438c-8214-a5f74006156e

–keyring /ceph-2/keyring –setuser ceph –setgroup ceph [ceph-2][WARNIN] Traceback (most recent call last): [ceph-2][WARNIN]

File “/usr/sbin/ceph-disk”, line 9, in [ceph-2][WARNIN]

load_entry_point(‘ceph-disk==1.0.0’, ‘console_scripts’, ‘ceph-disk’)()

[ceph-2][WARNIN] File

“/usr/lib/python2.7/site-packages/ceph_disk/main.py”, line 5009, in

run [ceph-2][WARNIN] main(sys.argv[1:]) [ceph-2][WARNIN] File

“/usr/lib/python2.7/site-packages/ceph_disk/main.py”, line 4960, in

main [ceph-2][WARNIN] args.func(args) [ceph-2][WARNIN] File

“/usr/lib/python2.7/site-packages/ceph_disk/main.py”, line 3329, in

main_activate [ceph-2][WARNIN] init=args.mark_init,

[ceph-2][WARNIN] File

“/usr/lib/python2.7/site-packages/ceph_disk/main.py”, line 3149, in

activate_dir [ceph-2][WARNIN] (osd_id, cluster) = activate(path,

activate_key_template, init) [ceph-2][WARNIN] File

“/usr/lib/python2.7/site-packages/ceph_disk/main.py”, line 3254, in

activate [ceph-2][WARNIN] keyring=keyring, [ceph-2][WARNIN] File

“/usr/lib/python2.7/site-packages/ceph_disk/main.py”, line 2747, in

mkfs [ceph-2][WARNIN] ‘–setgroup’, get_ceph_group(),

[ceph-2][WARNIN] File

“/usr/lib/python2.7/site-packages/ceph_disk/main.py”, line 2694, in

ceph_osd_mkfs [ceph-2][WARNIN] raise Error(‘%s failed : %s’ %

(str(arguments), error)) [ceph-2][WARNIN] ceph_disk.main.Error: Error:

[‘ceph-osd’, ‘–cluster’, ‘ceph’, ‘–mkfs’, ‘–mkkey’, ‘-i’, u’0’,

‘–monmap’, ‘/ceph-2/activate.monmap’, ‘–osd-data’, ‘/ceph-2’,

‘–osd-journal’, ‘/ceph-2/journal’, ‘–osd-uuid’,

u’a0dc326a-e5ac-438c-8214-a5f74006156e’, ‘–keyring’,

‘/ceph-2/keyring’, ‘–setuser’, ‘ceph’, ‘–setgroup’, ‘ceph’] failed :

2017-02-05 23:38:31.647941 7f3664382800 -1 filestore(/ceph-2) mkfs:

write_version_stamp() failed: (13) Permission denied [ceph-2][WARNIN]

2017-02-05 23:38:31.647978 7f3664382800 -1 OSD::mkfs:

ObjectStore::mkfs failed with error -13 [ceph-2][WARNIN] 2017-02-05

23:38:31.648077 7f3664382800 -1 ** ERROR: error creating empty object

store in /ceph-2: (13) Permission denied [ceph-2][WARNIN]

[ceph-2][ERROR ] RuntimeError: command returned non-zero exit status:

1 [ceph_deploy][ERROR ] RuntimeError: Failed to execute command:

/usr/sbin/ceph-disk -v activate –mark-init systemd –mount /ceph-2

解决办法:

解决办法很简单,将ceph集群需要使用的所有磁盘权限,所属用户、用户组改给ceph。

chown -R ceph:ceph /ceph-3/
chown -R ceph:ceph /ceph-2/

注意如果你之前部署过ceph但是没有完全清除残留数据的话重新部署OSD的时候会有报错。

这里写图片描述

查看此时keyring

ceph auth list

这里写图片描述

再查看ceph-2上bootstrap-osd的keyring值。

这里写图片描述

你会发现之前部署残留的配置文件还在,需要把里面的key值修改为现有你在部署的keyring值。

用 ceph-deploy 把配置文件和 admin 密钥拷贝到管理节点和 Ceph 节点,这样你每次执行 Ceph 命令行时就无需指定 monitor 地址和 ceph.client.admin.keyring 了。ceph-deploy 和本地管理主机( admin-node )通信时,必须通过主机名可达。

#ceph-deploy admin controllernode ceph-1 ceph-2 ceph-3

确保你对 ceph.client.admin.keyring 有正确的操作权限。

chmod +r /etc/ceph/ceph.client.admin.keyring

添加monitors

ceph存储集群需要至少一个monitor才能运行。未达到高可用,典型的ceph存储集群会运行多个monitors,这样在单个monitor失败时不会影响ceph存储集群的可用性。ceph使用PASOX算法,此算法要求有多半monitor(即1,2:3.3:4.3:5,4:6)形成法定人数。

新增两个监视器到ceph集群:

ceph-deploy mon add ceph-2 
ceph-deploy mon add ceph-3

新增monitor后,ceph会自动开始同步并形成法定人数,可以用下面的命令来检查法定人数状态:

#ceph quorum_status --format json-pretty
{
    "election_epoch": 6,
    "quorum": [
        0,
        1,
        2
    ],
    "quorum_names": [
        "ceph-1",
        "ceph-2",
        "ceph-3"
    ],
    "quorum_leader_name": "ceph-1",
    "monmap": {
        "epoch": 3,
        "fsid": "c2f1de7a-ece6-4b4c-8253-272fed45075c",
        "modified": "2017-03-06 14:16:22.712704",
        "created": "2017-03-06 13:57:50.832909",
        "mons": [
            {
                "rank": 0,
                "name": "ceph-1",
                "addr": "192.168.1.9:6789\/0"
            },
            {
                "rank": 1,
                "name": "ceph-2",
                "addr": "192.168.1.10:6789\/0"
            },
            {
                "rank": 2,
                "name": "ceph-3",
                "addr": "192.168.1.12:6789\/0"
            }
        ]
    }
}

当你的ceph集群运行着多个monitor时,各个monitor主机上应该配置NTP,而且要确保这些monitor位于NTP服务同一级。

创建块设备

.确认使用了合适的内核版本

#lsb_release -a
uname -r

2.在管理节点上,通过ceph-deploy吧ceph安装到ceph-client节点

这一步官档给的不是很有必要,因为之前已经执行过了

#ceph-deploy install ceph-celint

3.在管理节点上,用ceph-deploy把Ceph配置文件和ceph.client.admin.keyting拷贝到ceph-client。

同上,这部之前已经执行不需要考虑再执行

#ceph-deploy admin ceph-client
ceph-deploy 工具会把密钥环复制到 /etc/ceph 目录,要确保此密钥环文件有读权限(如 sudochmod +r /etc/ceph/ceph.client.admin.keyring

配置块设备

1.创建一个名为foo的rbd设备

#rbd create foo --size 4096 -m 192.168.1.9 -k /etc/ceph/ceph.client.admin.keyring

2.在ceph-client节点上,把image映射为块设备

rbd map foo -n client.admin -m 192.168.1.9,192.168.1.10,192.168.1.12 -k /etc/ceph/ceph.client.admin.keyring

在map块设备时候报错:

这里写图片描述

查看当前内核版本

[root@ceph-1 ceph-1]# uname -r
3.10.0-123.el7.x86_64

这里有两个办法,之前已经提到过如果你的内核版本为3.10的话我们可以通过降低ceph块设备的功能来使得内核支持,或者通过设计内核的办法来满足J版本rbd的功能。

首先说一下升级内核的方法

1.导入key

  rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

2.安装elrepo的yum源

  rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
  1. 安装内核
     yum --enablerepo=elrepo-kernel install kernel-ml-devel kernel-ml -y

4.查看设置默认启动顺序


awk -F \' '$1=="menuentry "{print $2}' /etc/grub2.cfg


显示结果应该是升级后的最新版本的内核在上面,执行以下命令:

    grub2-set-default 0

5.重启

    reboot

查看内核支持rbd模块

[root@ceph-1 ~]# lsmod | grep rbd
rbd                    86016  0
libceph               294912  1 rbd

第二种办法就是关闭一些rbd的功能,来使得3.10的内核能够支持。详情请见


rbd: image foo: image uses unsupported features: 0x38

在ceph-client节点上,创建文件系统后就可以使用块设备了

这里写图片描述

格式化磁盘

#mkfs.ext4 -m0 /dev/rbd/rbd/foo

这里写图片描述

在ceph-client节点上挂载此文件系统

sudo mkdir /mnt/ceph-block-device
sudo mount /dev/rbd/rbd/foo /mnt/ceph-block-device
cd /mnt/ceph-block-device

文件系统的创建

1.创建元数据服务器

至少需要一个元数据服务器才能使用CephFS,执行下列命令创建元数据服务器:

#ceph-deploy mds create ceph-1

当前生产环境下的ceph只能运行一个元数据服务器。你可以配置多个,但现在我们还不会为多个元数据服务器的集群提供商业支持。

添加RGW例程

要使用ceph的ceph对象网关,必须部署RGW例程。用下列方法创建新的RGW例程:

#ceph-deploy rgw create ceph-1

注意:这个功能是Hammer版和ceph-deploy v1.5.23才开始有的

RGW例程默认会监听7480端口,可以更改该节点ceph.conf内与RGW相关的配置。

这里我们到ceph-1下,进入/etc/ceph/ceph.conf

[client]
rgw frontends = civeweb port=80

2.创建文件系统

虽然已经创建了元数据服务器,但如果你没有创建存储池和文件系统,他是不会变为活动状态的。

虽然已创建了元数据服务器(存储集群快速入门),但如果你没有创建存储池和文件系统,它是不会变为活动状态的。

#ceph osd pool create cephfs_data <pg_num>
#ceph osd pool create cephfs_metadata <pg_num>
#ceph fs new <fs_name> cephfs_metadata cephfs_data

3.创建密钥文件

Ceph 存储集群默认启用认证,你应该有个包含密钥的配置文件(但不是密钥环本身)。用下述方法获取某一用户的密钥:

  • 在密钥环文件中找到与某用户对应的密钥,例如:

    cat ceph.client.admin.keyring

  • 找到用于挂载 Ceph 文件系统的用户,复制其密钥。大概看起来如下所示:

[client.admin]
  key = AQCj2YpRiAe6CxAA7/ETt7Hcl9IyxyYciVs47w==
  • 打开文本编辑器。

  • 把密钥粘帖进去,大概像这样:

    AQCj2YpRiAe6CxAA7/ETt7Hcl9IyxyYciVs47w==

  • 保存文件,并把其用户名 name 作为一个属性(如 admin.secret )。

  • 确保此文件对用户有合适的权限,但对其他用户不可见。

内核驱动

把 Ceph FS 挂载为内核驱动。

sudo mkdir /mnt/mycephfs
sudo mount -t ceph {ip-address-of-monitor}:6789:/ /mnt/mycephfs

Ceph 存储集群默认需要认证,所以挂载时需要指定用户名 name 和创建密钥文件一节中创建的密钥文件 secretfile ,例如:

sudo mount -t ceph 192.168.0.1:6789:/ /mnt/mycephfs -o name=admin,secretfile=admin.secret

Ceph 存储集群默认要求认证,需指定相应的密钥环文件,除非它在默认位置(即 /etc/ceph ):

#sudo ceph-fuse -k ./ceph.client.admin.keyring -m 192.168.0.1:6789 ~/mycephfs

CEPH 对象存储快速入门

从 firefly(v0.80)起,Ceph 存储集群显著地简化了 Ceph 对象网关的安装和配置。网关守护进程内嵌了 Civetweb,无需额外安装 web 服务器或配置 FastCGI。此外,可以直接 使用 ceph-deploy 来安装网关软件包、生成密钥、配置数据目录以及创建一个网关实例。

Tip Civetweb 默认使用 7480 端口。要么直接打开 7480 端口,要么在你的 Ceph 配置文件中设置首选端口(例如 80 端口)。

要使用 Ceph 对象网关,请执行下列步骤:

安装 CEPH 对象网关

  • 在 client-node 上执行预安装步骤。如果你打算使用 Civetweb 的默认端口 7480 ,必须通过 firewall-cmd 或iptables 来打开它。详情见预检。

  • 从管理节点的工作目录,在 client-node 上安装 Ceph 对象网关软件包。例如:

  • ceph-deploy install –rgw [ …]

新建 CEPH 对象网关实例

从管理节点的工作目录,在 client-node 上新建一个 Ceph 对象网关实例。例如:

#ceph-deploy rgw create

一旦网关开始运行,你就可以通过 7480 端口来访问它(比如

http://client-node:7480

)。

配置 CEPH 对象网关实例

  • 通过修改 Ceph 配置文件可以更改默认端口(比如改成 80 )。增加名为 [client.rgw.] 的小节,把 替换成你自己 Ceph 客户端节点的短名称(即 hostname -s 的输出)。例如,你的节点名就是client-node ,在 [global] 节后增加一个类似于下面的小节:

  • [client.rgw.client-node]rgw_frontends = “civetweb port=80”

  • Note 确保在 rgw_frontends 键值对的 port= 中没有空格。

  • 为了使新端口的设置生效,需要重启 Ceph 对象网关。

    sudo systemctl restart ceph-radosgw.service

  • 你应该可以生成一个未授权的请求,并收到应答。例如,一个如下不带参数的请求:

    http://:80

应该收到这样的应答:

<?xml version="1.0" encoding="UTF-8"?>
<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <Owner>
  <ID>anonymous</ID>
  <DisplayName></DisplayName>
  </Owner>
  <Buckets>
  </Buckets>
</ListAllMyBucketsResult>

这里写图片描述



版权声明:本文为minxihou原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。