Ceph部署、基本使用和与OpenStack的集成

本文并非关于Ceph的系统介绍,没有对Ceph原理等知识的介绍,基本都是操作命令。内容参考自Ceph官方文档,以及《Ceph Cookbook》。

本文内容在CentOS7上进行过几次成功的部署,没坑,所部署的Ceph版本为nautilus,部署工具为ceph-deploy

0 准备工作

0.1 安装ceph-deploy

以下方法二选一。

0.1.1 直接安装ceph-deploy

可以到国内的源中查找rpm包直接安装,比如阿里云

rpm -Uvh https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/noarch/ceph-deploy-2.0.1-0.noarch.rpm  
yum install -y epel-release python-setuptools
0.1.2 基于repo来安装
# 命令来自官方文档
sudo yum install -y yum-utils && sudo yum-config-manager --add-repo https://dl.fedoraproject.org/pub/epel/7/x86_64/ && sudo yum install --nogpgcheck -y epel-release && sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 && sudo rm /etc/yum.repos.d/dl.fedoraproject.org*

创建一个软件库配置文件。

sudo vim /etc/yum.repos.d/ceph.repo

内容如下:

[ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/noarch
enabled=1
gpgcheck=1
priority=1
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc

ceph-deploy是在noarch下的,所以先添加这个即可。然后就可以安装ceph-deploy了。

sudo yum install ceph-deploy python-setuptools

0.2 Ceph节点配置

0.2.1 安装chrony
sudo yum install -y chrony

mv /etc/chrony.conf /etc/chrony.conf.bak

cat > /etc/chrony.conf <<EOF
server ntp.aliyun.com iburst
stratumweight 0
driftfile /var/lib/chrony/drift
rtcsync
makestep 10 3
bindcmdaddress 127.0.0.1
bindcmdaddress ::1
keyfile /etc/chrony.keys
commandkey 1
generatecommandkey
logchange 0.5
logdir /var/log/chrony
EOF

systemctl enable chronyd
systemctl restart chronyd
0.2.2 创建Ceph用户(可选)

在各 Ceph 节点创建新用户。

ssh user@ceph-server
sudo useradd -d /home/{username} -m {username}
sudo passwd {username}

确保各 Ceph 节点上新创建的用户都有 sudo 权限。

echo "{username} ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/{username}
sudo chmod 0440 /etc/sudoers.d/{username}
0.2.3 SSH配置

安装SSH服务器:

sudo yum install openssh-server

配置ceph-deploy到ceph各节点的SSH免密登录:

# 生成密钥对
ssh-kengen

# 配置免密登录
ssh-copy-id {username}@node1
ssh-copy-id {username}@node2
ssh-copy-id {username}@node3

如果使用非root用户进行部署,那么推荐修改~/.ssh/config文件,

Host node1
   Hostname node1
   User {username}
Host node2
   Hostname node2
   User {username}
Host node3
   Hostname node3
   User {username}
0.2.4 开放端口

MON默认使用33006789端口,OSD默认使用6800-7300端口,RGW使用7480端口。

sudo firewall-cmd --zone=public --add-port=3300/tcp --permanent
sudo firewall-cmd --zone=public --add-port=6789/tcp --permanent
sudo firewall-cmd --zone=public --add-port=7480/tcp --permanent
sudo firewall-cmd --zone=public --add-port=6800-7300/tcp --permanent
0.2.5 关闭SELINUX
sudo setenforce 0

要使 SELinux 配置永久生效(如果它的确是问题根源),需修改其配置文件/etc/selinux/config

1 部署Ceph存储集群

先在管理节点上创建一个目录(非root用户可以选择其他目录),用于保存 ceph-deploy 生成的配置文件和密钥对。

mkdir /etc/ceph
cd /etc/ceph

ceph-deploy 会把有些文件输出到当前目录,最好在此目录下执行 ceph-deploy 。

1.0 重新部署

# 卸载Ceph
ceph-deploy purge {ceph-node} [{ceph-node}]
cd
# 清掉数据
ceph-deploy purgedata {ceph-node} [{ceph-node}]
# 删除key
ceph-deploy forgetkeys
# 删除所有ceph-deploy产生的文件
rm ceph.*

# 在有OSD的节点删除ceph创建的LVM
lvremove -f $(lvdisplay | grep "/dev/ceph" | awk '{print $3}')
vgremove -f $(vgscan | grep ceph | awk '{print $4}' | tr -d \")

1.1 创建集群

1.1.1 初始化一个集群

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

ceph-deploy new {initial-monitor-node(s)}
# 例如(多个节点用空格隔开):
# ceph-deploy new node1

在当前目录下用 lscat 检查 ceph-deploy 的输出,应该有一个 Ceph 配置文件、一个 monitor 密钥环和一个日志文件。

1.1.2 网络配置

如果有多个网卡,需要在[global]中设置public network

public network = {ip-address}/{prefix}
cluster network = {ip-address}/{prefix}
# 例如
# public network = 10.1.2.0/24
# cluster network = 10.2.2.0/24
1.1.3 安装Ceph包:
# 使用阿里云的源
export CEPH_DEPLOY_REPO_URL=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7
export CEPH_DEPLOY_GPG_URL=https://mirrors.aliyun.com/ceph/keys/release.asc
# 安装
ceph-deploy install {ceph-node} [{ceph-node} ...]
# 例如:
# ceph-deploy install admin-node node1 node2 node3

ceph-deploy 将在各节点安装 Ceph 。

1.1.4 部署初始MON节点

配置初始 monitor(s)、并收集所有密钥:

ceph-deploy mon create-initial

完成上述操作后,当前目录里应该会出现这些密钥环:

ceph.client.admin.keyring
ceph.bootstrap-mgr.keyring
ceph.bootstrap-osd.keyring
ceph.bootstrap-mds.keyring
ceph.bootstrap-rgw.keyring
1.1.5 复制配置文件到其他节点

复制配置文件(ceph.conf)和admin的key(ceph.client.admin.keyring)到其他节点,这样在相应的节点上就可以无需指定MON地址和keyring来执行ceph命令了。

ceph-deploy admin {ceph-node(s)}
# 例如
# ceph-deploy admin node1 node2 node3
1.1.6 部署一个manager daemon

luminous+的版本需执行:

ceph-deploy mgr create node1 
1.1.7 添加OSD

添加前确保要使用的磁盘设备上没有重要数据,并且没有LVM虚拟卷和卷组。

ceph-deploy osd create --data {data-disk}
# 例如
# ceph-deploy osd create --data /dev/sdb node1

nautilus版本默认使用bluestore,早期版本一般使用filestore。

两种不同的文件系统在使用SSD做journal的时候是不同的方式,具体可以参考:如何ssd作为ceph-osd的日志盘使用

1.1.8 查看健康状况
ceph -s 
ceph -w # 可以持续查看健康变化情况

1.2 扩展集群

1.2.1 添加MON节点

一个集群中至少要有一个MON节点和一个MGR节点。

多个MON节点基于Paxos投票机制工作,因此最好有2N+1个MON节点,以避免单点故障。

ceph-deploy mon add {ceph-node}
# 例如:
# ceph-deploy mon add node2
1.2.2 添加MGR节点

多个Manager节点以active/standby方式工作,若主节点宕机,备节点会接管。

ceph-deploy mgr create node2 node3

如果要添加控制面板功能:

# 安装 ceph-mgr-dashboard。注意,每个mgr节点都需要安装
yum install ceph-mgr-dashboard -y
# 启用 dashboard
ceph mgr module enable dashboard
# 创建自签名证书
ceph dashboard create-self-signed-cert
# 创建用户
ceph dashboard ac-user-create <user> <password> administrator
# 防火墙开放8443端口
firewall-cmd --zone=public --add-port=8443/tcp --permanent
firewall-cmd --reload

如果一段时间后发现dashboard无法访问,这样处理(暂时还没找到更好办法)是有效果的:

ceph mgr module disable dashboard
ceph config-key del mgr/dashboard/$name/server_addr
ceph config-key del mgr/dashboard/$name/server_port
ceph config-key del mgr/dashboard/server_addr
ceph config-key del mgr/dashboard/server_port
ceph mgr module enable dashboard
systemctl restart ceph-mgr.target
1.2.3 添加RGW节点

Ceph对象存储网关的使用需要RGW节点。

ceph-deploy rgw create {gateway-node}

默认情况下,RGW监听7480端口,其他端口可以这样配置:

[client]
rgw frontends = civetweb port=80
1.3 存储/读取对象数据

要在Ceph存储集群中存储对象数据,需要:

  1. 设置对象名称
  2. 指定一个pool
ceph osd map {poolname} {object-name}

Ceph客户端会取得最新的集群map,并用CRUSH算法计算出如何将对象映射到placement group,然后计算出该placement group在哪个OSD上。

一些命令示例

# 创建一个对象(文件)
echo {Test-data} > /tmp/testfile.txt

# 创建存储池
ceph osd pool create mypool 512

# 存储文件
# rados put {object-name} {file-path} --pool={pool-name}
rados put testfile /tmp/testfile.txt --pool=mypool

# 查看对象文件
rados -p mytest ls

# 下载对象文件
# rados get {object-name} {file-path} --pool={pool-name}
rados get testfile /tmp/testfile1.txt --pool=mypool

# 查看对象文件位置
# ceph osd map {pool-name} {object-name}
ceph osd map mypool testfile

# 删除对象
rados rm testfile --pool=mypool

# 删除存储池
ceph osd pool rm mypool

2 块设备服务

2.1 基本操作

0.创建块设备存储池

# 在admin节点,使用`ceph`命令来创建一个pool(`rbd`)
ceph osd pool create rbd 512
# 在admin节点,使用`rbd`命令来初始化pool
rbd pool init rbd

具体pg_num应该如何确定,可以参考这个计算网站

1.在ceph-client节点上,创建一个块设备镜像。

# rbd create foo --size 4096 --image-feature layering [-m {mon-IP}] [-k /path/to/ceph.client.admin.keyring] [-p {pool-name}]
rbd create rbd1 --size 4096 --image-feature layering -m 192.168.1.102 -k /etc/ceph/ceph.client.admin.keyring -p rbd 

2.在ceph-client节点上,映射到一个块设备。

# sudo rbd map foo --name client.admin [-m {mon-IP}] [-k /path/to/ceph.client.admin.keyring] [-p {pool-name}]
rbd map rbd0 --name client.admin -m 192.168.1.102 -k /etc/ceph/ceph.client.admin.keyring -p rbd

如果上一条命令报如下错误:

modinfo: ERROR: Module rbd not found.
modprobe: FATAL: Module rbd not found.
rbd: failed to load rbd kernel module (1)

则需升级kernel

3.在块设备上创建文件系统。

# sudo mkfs.ext4 -m0 /dev/rbd/{pool-name}/foo
sudo mkfs.ext4 -m0 /dev/rbd/rbd/rbd0(/dev/rbd0)

4.挂载文件系统。

sudo mkdir /mnt/ceph-block-device
sudo mount /dev/rbd0 /mnt/ceph-block-device
cd /mnt/ceph-block-device

2.2 rbd命令

2.2.1 创建块设备
# 创建块设备(单位MB)
rbd create rbd0 --size 10240 --name client.rbd

# 查看块设备
rbd ls --name client.rbd
rbd ls -p rbd --name client.rbd
rbd info --image rbd/rbd0
2.2.2 映射块设备
# 默认存储池是rbd,否则需要指定 -p {pool_name}
rbd map --image rbd/rbd0 --name client.rbd
rbd showmapped --name client.rbd

# 挂载到文件系统
mkfs.xfs /dev/rbd0
mkdir /mnt/rbd0
mount /dev/rbd0 /mnt/rbd0

# 取消映射
umount /mnt/rbd0
rbd unmap --image rbd/rbd0

挂载需要内核支持,如果在mount的时候提示没有rbd模块(具体啥错误不记得了),可以执行
modprobe rbd,然后,lsmod | grep rbd看看是否已经有该模块了。
如果依然没有,可能需要升级内核:yum update kernel(这篇文章发出来的时候,CentOS7最新的内核已经有rbd模块了)。

2.2.3 调整RBD大小
# 调整大小
rbd resize --image rbd/rbd0 --size 20480 --name client.rbd
xfs_growfs /dev/rbd0
2.2.4 快照
rbd snap create rbd/rbd0@snapshot1 --name client.rbd
# rollback时需要先unmap RBD
rbd snap rollback rbd/rbd0@snapshot1 --name client.rbd
rbd snap ls rbd/rbd0 --name client.rbd
rbd snap rm rbd/rbd0@snapshot1 --name client.rbd
# 删除所有快照
rbd snap purge rbd/rbd0 --name client.rbd
2.2.5 克隆
# 创建一个快照用于克隆
rbd snap create rbd/rbd1@snapshot_for_cloning
# 克隆前需要先保护起来,以防被删除
rbd snap protect rbd/rbd1@snapshot_for_cloning
# 克隆
rbd clone rbd/rbd1@snapshot_for_cloning rbd/rbd1_clone
# 查看信息,发现其parent属性指向快照
rbd info rbd1_clone
# 可以将父镜像合并到克隆的镜像,这样克隆的镜像就独立了
rbd flatten rbd/rbd1_clone
# 查看信息,发现parent属性清空
rbd info rbd1_clone
# 这时可以取消保护了
rbd snap unprotect rbd/rbd1@snapshot_for_cloning
# 删除快照
rbd snap rm rbd/rbd1@snapshot_for_cloning

3 CephFS文件系统

3.1 前提

配置CephFS前,需要先配置好存储集群,并且处于active + clean状态。

3.2 部署METADATA服务

在部署节点执行如下命令:

ceph-deploy mds create {ceph-node}

3.3 创建一个文件系统

ceph osd pool create cephfs_data 32
ceph osd pool create cephfs_meta 32
# ceph fs new <CephFS名称> <元数据存储池> <文件数据存储池>
ceph fs new mycephfs cephfs_meta cephfs_data

建议:存储池可以命名为..,这样上边的pool可以命名为cephfs.mycehfs.data和cephfs.mycehfs.meta。

以上两个存储池分别用来保存文件的实际数据和元数据,可以放在不同的存储介质上的,比如元数据存储池可以放在SSD上,相关操作可以参考同一个ceph集群分别创建ssd和hdd池

3.4 挂载文件系统

3.4.1 使用内核驱动

挂载命令如下:

sudo mount -t ceph :{path-to-mounted} {mount-point} -o name={user-name}
sudo mount -t ceph :/ /mnt/mycephfs -o name=admin   # usable version

完整的命令:sudo mount -t ceph {ip-address-of-MON}:{port-number-of-MON}:{path-to-be-mounted} -o name={user-name},secret={secret-key} {mount-point}

{path-to-be-mounted}是CephFS内的路径,{mount-point}是客户端要挂载的路径,{user-name}是具备挂载CephFS权限的CephX用户。

3.4.2 使用FUSE

使用FUSE(Filesystem in User Space)来挂载CephFS:

sudo ceph-fuse /mnt/mycephfs

如果要指定挂载目录可以使用-r

sudo ceph-fuse -r {path-to-be-mounted} /mnt/mycephfs

4 对象存储

4.1 安装Ceph对象网关程序

ceph-deploy install --rgw <client-node> [<client-node> ...]

4.2 创建Ceph对象存储实例

ceph-deploy rgw create <client-node>

4.3 配置Ceph对象存储实例

1.配置端口号

[client.rgw.client-node]
rgw_frontends = "civetweb port=80"

2.重启服务

sudo systemctl restart ceph-radosgw.service

3.开放端口

sudo firewall-cmd --list-all
sudo firewall-cmd --zone=public --add-port 80/tcp --permanent
sudo firewall-cmd --reload

4.查看API

curl http://<client-node>:80

API响应如下:

<?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>

5 用户与权限

5.1 配置客户端与用户

1.在ceph-deploy执行节点执行如下命令:

ceph-deploy install client-node

2.将配置文件复制到client-node节点:

ceph-deploy config push client-node

3.一般不建议直接把client.admin复制到客户端节点,可以创建用户:

# 创建用户client.admin
ceph auth get-or-create client.rbd mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool =rbd'

4.将密钥添加到client-node节点:

ceph auth get-or-create client.rbd | ssh root@client-node tee /etc/ceph/ceph.client.rbd.keyring

5.使用密钥的时候需要指定用户名

ceph -s --name client.rbd

6 Ceph与OpenStack的集成

6.1 将OpenStack配置为Ceph客户端

1.首先配置ceph-deploy节点到OpenStack节点(os-node)的SSH免密登录。

2.在os-node上安装Ceph。

ceph-deploy install os-node

3.将ceph配置文件ceph.conf推送到os-node节点。

ceph-deploy config push os-node

4.创建Ceph存储池。

ceph osd pool create images 128
ceph osd pool create volumes 128
ceph osd pool create vms 128

5.为cinderglance创建新用户。

ceph auth get-or-create client.cinder mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=volumes, allow rwx pool=vms, allow rx pool=images'
ceph auth get-or-create client.glance mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=images'

6.为os-node添加keyring。

ceph auth get-or-create client.glance | ssh os-node tee /etc/ceph/ceph.client.glance.keyring
ssh os-node chown glance:glance ceph.client.glance.keyring
ceph auth get-or-create client.cinder | ssh os-node tee /etc/ceph/ceph.client.cinder.keyring
ssh os-node chown cinder:cinder ceph.client.cinder.keyring

7.当从cinder挂载或卸载设备时,libvirt进程需要有访问Ceph集群的权限。

# 在ceph节点创建一个临时的密钥副本,并传至OpenStack节点
ceph auth get-key client.cinder | ssh os-node tee /etc/ceph/temp.client.cinder.key
# 在OpenStack节点创建密钥
# ① 先生成uuid
uuidgen
# ② 用输出的uuid编写密钥文件
cat > secret.xml <<EOF
<secret ephemeral='no' private='no'>
  <uuid>{刚刚生成的uuid}</uuid>
  <usage type='ceph'>
    <name>client.cinder secret</name>
  </usage>
</secret>
EOF
# ③ 定义密钥文件
virsh secret-define --file secret.xml
# ④ 设置好密钥值
virsh secret-set-value --secret {刚刚生成的uuid} --base64 $(cat temp.client.cinder.key)
virsh secret-list

6.2 配置Ceph为Glance后端存储

在OpenStack节点,编辑/etc/glance/glance-api.conf

default_store=rbd
show_image_direct_url=True
...
[glance_store]
stores=rbd
rbd_store_ceph_conf=/etc/ceph/ceph.conf
rbd_store_user=glance
rbd_store_pool=images
rbd_store_chunk_size=8

重新启动glance-api服务。

systemctl restart openstack-glance-api

测试一下:

glance image-list
# 下载cirros镜像,并上传至glance
glance image-create --name cirros_0.5 --is-public=true --disk-format=qcow2 --container-format=bare < cirros-0.5.1-x86_64-disk.img

glance image-list
# 在ceph中验证
rados -p images ls --name client.glance --keyring /etc/ceph/ceph.client.glance.keyring | grep -i id

6.3 配置Ceph为Cinder后端存储

配置/etc/cinder/cincer.conf文件。其他包括:

glance_api_version=2
rbd_pool=volumes
rbd_user=cinder
rbd_ceph_conf=/etc/ceph/ceph.conf
rbd_flatten_volume_from_snapshot=false
rbd_secret_uuid=1f4e1d20-3c7f-4809-a2dd-dd88efa36c03
rbd_max_clone_depth=5
rbd_store_chunk_size=4
rados_connect_timeout=-1
volume_driver=cinder.volume.drivers.rbd.RBDDriver

重新启动Cinder服务:

systemctl restart openstack-cinder-volume

然后测试一下配置是否生效:

cinder list
# 创建一个卷
cinder create --display-name ceph-volume01 --display-description "Cinder volume on CEPH storage" 2
# 查看cinder和rados
cinder list
rados -p volumes --name client.cinder --keyring ceph-client.cinder.keyring ls | grep -i id

6.4 挂载Ceph RBD到Nova上

编辑/etc/nova/nova.conf,找到nova.virt.libvirt.volume部分,添加以下代码行:

rbd_user=cinder
rbd_secret_uuid={secret uuid}

重新启动nova-compute:

systemctl restart openstack-nova-compute

测试一下效果:

nova list
cinder list
# 将以上两个命令查到的虚拟机id和卷id用于以下命令:
cinder volume-attach {vm-id} {volume-id}
# 查看挂载效果
cinder list

6.5 Nova基于Ceph RBD启动实例

编辑/etc/nova/nova.conf文件,在[libvirt]部分编辑如下参数:

inject_partition=-2
images_type=rbd
images_rbd_pool=vms
images_rbd_ceph_conf=/etc/ceph/ceph.conf
rbd_user=cinder
rbd_secret_uuid=da6d95af-f8ba-4beb-8d65-60a916160f88

重启nova-compute服务:

systemctl restart openstack-nova-compute

测试一下效果:

# 将QCOW格式的镜像转换为RAW格式
qemu-img convert -f qcow2 -O raw cirros-0.5.1-x86_64-disk.img cirros-0.5.1-x86_64-disk.raw
# 用RAW镜像创建Glance镜像
glance image-create --name cirros_raw_image --is-public=true --disk-format=raw --container-format=bare < cirros-0.5.1-x86_64-disk.raw
# 创建一个可引导的卷来测试从Ceph卷启动虚拟机
cinder create --image-id 8d1623ab-c3e1-4c30-a4b0-d6ca7fae9bbb --display-name cirros-ceph-boot-volume 1
# 列出Cinder卷,看是不是bootable的
cinder list
# 基于可引导的卷创建虚拟机实例
nova boot --flavor 1 --block_device_mapping vda=6525f635-85ed-4754-877a-8b556c86334c::0 --image 8d1623ab-c3e1-4c30-a4b0-d6ca7fae9bbb vm2_on_ceph
# 检查实例状态
nova list
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值