本文并非关于Ceph的系统介绍,没有对Ceph原理等知识的介绍,基本都是操作命令。内容参考自Ceph官方文档,以及《Ceph Cookbook》。
本文内容在CentOS7上进行过几次成功的部署,没坑,所部署的Ceph版本为nautilus,部署工具为ceph-deploy。
以下方法二选一。
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
# 命令来自官方文档
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
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
在各 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}
安装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}
MON默认使用3300
和6789
端口,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
sudo setenforce 0
要使 SELinux 配置永久生效(如果它的确是问题根源),需修改其配置文件/etc/selinux/config
。
先在管理节点上创建一个目录(非root用户可以选择其他目录),用于保存 ceph-deploy 生成的配置文件和密钥对。
mkdir /etc/ceph
cd /etc/ceph
ceph-deploy 会把有些文件输出到当前目录,最好在此目录下执行 ceph-deploy 。
# 卸载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 \")
在管理节点上,进入刚创建的放置配置文件的目录,用 ceph-deploy 执行如下步骤。
ceph-deploy new {initial-monitor-node(s)}
# 例如(多个节点用空格隔开):
# ceph-deploy new node1
在当前目录下用 ls
和 cat
检查 ceph-deploy
的输出,应该有一个 Ceph 配置文件、一个 monitor 密钥环和一个日志文件。
如果有多个网卡,需要在[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
# 使用阿里云的源
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 。
配置初始 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
复制配置文件(ceph.conf
)和admin的key(ceph.client.admin.keyring
)到其他节点,这样在相应的节点上就可以无需指定MON地址和keyring来执行ceph
命令了。
ceph-deploy admin {ceph-node(s)}
# 例如
# ceph-deploy admin node1 node2 node3
luminous+的版本需执行:
ceph-deploy mgr create node1
添加前确保要使用的磁盘设备上没有重要数据,并且没有LVM虚拟卷和卷组。
ceph-deploy osd create --data {data-disk}
# 例如
# ceph-deploy osd create --data /dev/sdb node1
nautilus版本默认使用bluestore,早期版本一般使用filestore。
两种不同的文件系统在使用SSD做journal的时候是不同的方式,具体可以参考:如何ssd作为ceph-osd的日志盘使用。
ceph -s
ceph -w # 可以持续查看健康变化情况
一个集群中至少要有一个MON节点和一个MGR节点。
多个MON节点基于Paxos投票机制工作,因此最好有2N+1
个MON节点,以避免单点故障。
ceph-deploy mon add {ceph-node}
# 例如:
# ceph-deploy mon add node2
多个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
Ceph对象存储网关的使用需要RGW节点。
ceph-deploy rgw create {gateway-node}
默认情况下,RGW监听7480端口,其他端口可以这样配置:
[client]
rgw frontends = civetweb port=80
要在Ceph存储集群中存储对象数据,需要:
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
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
rbd
命令# 创建块设备(单位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
# 默认存储池是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模块了)。
# 调整大小
rbd resize --image rbd/rbd0 --size 20480 --name client.rbd
xfs_growfs /dev/rbd0
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
# 创建一个快照用于克隆
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
配置CephFS前,需要先配置好存储集群,并且处于active + clean
状态。
在部署节点执行如下命令:
ceph-deploy mds create {ceph-node}
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池。
挂载命令如下:
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用户。
使用FUSE(Filesystem in User Space)来挂载CephFS:
sudo ceph-fuse /mnt/mycephfs
如果要指定挂载目录可以使用-r
:
sudo ceph-fuse -r {path-to-be-mounted} /mnt/mycephfs
ceph-deploy install --rgw <client-node> [<client-node> ...]
ceph-deploy rgw create <client-node>
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>
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
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.为cinder
和glance
创建新用户。
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
在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
配置/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
编辑/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
编辑/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