云与虚拟化

ceph学习及部署使用

ceph介绍

我们常见的存储需求可以简单归纳成3个:
1.对象存储 Object Storage
2.块存储 Block Storage
3.文件系统 FileSystem
ceph则是一个满足了3种不同需求的存储开源解决方案,不仅有分布式存储的功能,还有不同的灾备机制,以及灵活的机制以对接到现有的各种虚拟化接口,使用户可以用简单的服务器+磁盘搭建有分布式存储特性的服务,还可以应用到自身的云平台当中。本例子我们会用”块存储“,服务作为搭建使用ceph的实验演示,选择这个作为实验对象是因为块服务可以直接对接到云平台的虚拟机虚拟磁盘,第二篇文章会实验ceph+kvm技术,虚拟化技术使用kvm,虚拟磁盘会使用ceph的块服务。

以下大部分资料来自于ceph官网文档 http://docs.ceph.com/docs/master/

部署环境及拓扑图

软件 版本
OS Ubuntu 14.04 Server 64bit

官方文档的逻辑架构图:
Alt textAlt text

我们参考官方然后设计了自己试验环境拓扑图:
Alt textAlt text

单元功能 IP地址 描述
ceph-deploy 192.168.85.100 ceph部署管理机,通过该服务器可以部署集群
mon-node1 192.168.85.102 ceph集群管理机,该机器维护着整个集群的各种状态信息
osd0-node2 192.168.85.101 OSD数据服务器,负责存储数据以及数据的相关操作
osd1-node3 192.168.85.105 OSD数据服务器,负责存储数据以及数据的相关操作
ceph-client 192.168.85.110 ceph客户端,测试ceph块服务的节点
kvm-server 192.168.85.145 kvm服务端,测试ceph块服务的kvm服务器

前期准备

所有服务器保证时区与时间的准确性,具体可以参考相关资料文档,这里不详细描述。

各服务器配置好相关主机名hostname
编辑/etc/hostname文件,修改好对应的主机名
更新主机名
$ hostname 主机名

配置服务器hosts列表
所有服务器 /etc/hosts 文件增加以下内容

1
2
3
4
5
6
192.168.85.100	ceph-deplog
192.168.85.102	mon-node1
192.168.85.101	osd0-node2
192.168.85.105	osd1-node3
192.168.85.110	ceph-client
192.168.85.145	kvm-server

服务器ssh免密码访问
配置ceph-deploy主机ssh到mon-node1,osd0-node2,osd1-node3主机免密码
在ceph四台服务器上面执行一下命令

1
2
3
ssh-keygen #一路回车到底
cd ~/.ssh/
cat id_rsa.pub >> authorized_keys

把ceph-deploy的~/.ssh/id_rsa.pub秘钥增加到mon-node1,osd0-node2,osd1-node3主机的~/.ssh/authorized_keys文件里面,同时把mon-node1,osd0-node2,osd1-node3主机的~/.ssh/id_rsa.pub秘钥添加到ceph-deploy主机的~/.ssh/authorized_keys文件里面,这时候ceph-deploy主机已经能免密码ssh到mon-node1,osd0-node2,osd1-node3主机了。

1
2
3
4
#在ceph-deploy主机测试到各ceph服务器的ssh情况
$ ssh root@mon-node1
$ ssh root@osd1-node2
$ ssh root@osd2-node3
1
2
3
#ceph-deploy主机安装ceph部署包 ceph-deploy
$ apt-get update && apt-get install ceph-deploy
#安装完毕之后,进入下一个阶段,部署ceph集群

部署ceph集群

在osd1-node2主机执行一下命令

1
2
#为了简单,在osd主机上面我们通过目录作为数据存储而不是专门提供一个数据磁盘
$ mkdir /var/local/osd0

在osd2-node3主机执行一下命令

1
2
#为了简单,在osd主机上面我们通过目录作为数据存储而不是专门提供一个数据磁盘
$ mkdir /var/local/osd1

在ceph-deploy主机执行以下命令

#创建集群配置目录以存放部署过程中产生的各种配置文件
$ cd ~
$ mkdir my-cluster
$ cd my-cluster

#创建monitor
$ ceph-deploy new mon-node1
#执行完之后会产生一个ceph.conf的配置文件,在ceph.conf
文件[global]里面增加
$ osd pool default size = 2
#把ceph集群设置为active + clean,ceph默认会提供两份数
据备份,因为我们的实验环境只有2台osd所以我们选择该设置。

#安装ceph到各个ceph节点
$ ceph-deploy install ceph-deploy mon-node1 osd0-node2
 osd1-node3
#在实战过程中,会发现安装ceph到节点的时候经常会超时报错,
这个时候我们可以单独一台台地安装,把以上命令拆分成,
每执行完一个节点再到下一个节点,如果提示超时了,登录到对
应节点把apt-get进程kill掉才能再次安装,否则会提示apt-get
已经被锁了。
$ ceph-deploy install ceph-deploy mon-node1 
$ ceph-deploy install ceph-deploy osd0-node2
$ ceph-deploy install ceph-deploy osd1-node3

#初始化mon
$ ceph-deploy mon create-initial
#执行完毕之后会产生3个配置文件
xxx.client.admin.keyring
xxx.bootstrap-osd.keyring
xxx.bootstrap-mds.keyring

#prepare osd
$ ceph-deploy osd prepare osd0-node2:/var/local/osd0
$ ceph-deploy osd prepare osd1-node3:/var/local/osd1

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

#复制ceph相关配置文件和管理key到各个节点
$ ceph-deploy admin ceph-deploy mon-node1 osd0-node2 osd1
-node3

#来到这里,整个ceph集群已经部署完毕,执行ceph health查
看当前是否正常运行
$ ceph health
HEALTH_OK #代表集群已经正常运作

#执行ceph status查看集群详细信息
$ ceph status
    cluster f457079a-f09c-4e6a-a978-a5a5e5d42d34
     health HEALTH_OK
     monmap e1: 1 mons at {mon-node1=192.168.85.
102:6789/0}, election epoch 1, quorum 0 mon-node1
     osdmap e18: 2 osds: 2 up, 2 in
      pgmap v478: 320 pgs, 4 pools, 1172 MB data, 
312 objects
            15347 MB used, 728 GB / 783 GB avail
                 320 active+clean

使用ceph块服务之——ceph-client

使用ceph-client的方式使用ceph块服务

1
2
3
#ceph-deploy执行部署ceph-client
$ ceph-deploy install ceph-client
$ ceph-deploy admin ceph-client

部署完毕ceph-client之后,就可以在ceph-client服务器上调用ceph的块服务了

#在ceph-client执行
#-m mon IP
$ rbd create foo --size 1024 -m 192.168.85.102 -k 
/etc/ceph/ceph.client.admin.keyring
$ rbd map foo --name client.admin -m 192.168.85.102 -k
 /etc/ceph/ceph.client.admin.keyring 
#执行完毕之后,我们可以看到/dev/rbd/rbd下面多了一个
foo的磁盘设备,接下来我们对齐进行格式化并挂载
$ mkfs.ext4 -m0 /dev/rbd/rbd/foo
$ mkdir /mnt/ceph-block-device
$ mount /dev/rbd/rbd/foo /mnt/ceph-block-device
#完成之后,我们就可以正常使用ceph提供的分布式块存储服务了

使用ceph块服务之——kvm+libvirt+rbd

在kvm中使用ceph块服务作为虚拟器的虚拟磁盘,关于kvm的部署使用等请参考http://blog.eflypro.com/2015/07/27/kvm-iscsi/ 详情就不在这里描述,这里只是介绍通过配置虚拟机的xml文件使用ceph块服务设备。下面是ceph块服务的逻辑栈

Alt textAlt text

到目前为止,ceph块服务支持以下接口:

支持项 描述
Commands 命令行方式
Kernel Modules 内核模块
Snapshots 快照
QEMU qemu虚拟化
libvirt libvirt是虚拟化的常见API接口层,目前支持QEMU/KVM XEN LXC VirtualBox等,我们的kvm方案就使用libvirt作为实验对象
Cache Settings
OpenStack 开源虚拟化平台
CloudStack
Manpage rbd
Manpage rbd-fuse
Manpage ceph-rbdnamer
RBD Replay
Manpage rbd-replay-prep
Manpage rbd-replay
Manpage rbd-replay-many
librbd API

libvirt与ceph块服务的对接方案如下图:
Alt textAlt text

先为kvm虚拟机创建存储池以及相关权限

#ceph-deploy执行
#先安装qemu工具库
$ apt-get install qemu-utils

#创建存储池libvirt-pool
$ ceph osd pool create libvirt-pool 128 128

#查看是否创建成功
$ ceph osd lspools
0 data,1 metadata,2 rbd,3 libvirt-pool,

#创建及配置ceph用户权限
$ ceph auth get-or-create client.libvirt mon 'allow r' 
osd 'allow class-read object_prefix rbd_children, allow rwx 
pool=libvirt-pool'

#检查用户及权限情况
$ ceph auth list
installed auth entries:

osd.0
	key: AQBzdBxWoLH7JRAADjlJL0St0A+1x/cwYEb7BA==
	caps: [mon] allow profile osd
	caps: [osd] allow *
osd.1
	key: AQB6dBxWILjsMBAAWXdg1YAQWyQNSB69CW8Ttw==
	caps: [mon] allow profile osd
	caps: [osd] allow *
client.admin
	key: AQBfcxxW2GEhHRAA382/y9k+UvAV1pqv1xzyKw==
	caps: [mds] allow
	caps: [mon] allow *
	caps: [osd] allow *
client.bootstrap-mds
	key: AQBgcxxWGIdFAhAAl7BYUp4HlAI6zwyh5zGMhg==
	caps: [mon] allow profile bootstrap-mds
client.bootstrap-osd
	key: AQBfcxxWcGmFLRAAhvGkUHPm0Cfx8Ypzcvfx7A==
	caps: [mon] allow profile bootstrap-osd
client.libvirt
	key: AQAFqxxWkJvZBBAAEpkVKhwys8g+obqKP/h4NQ==
	caps: [mon] allow r
	caps: [osd] allow class-read object_prefix rbd_children, 
allow rwx pool=libvirt-pool

#在池libvirt-pool里面创建一个给kvm使用的块,大小为2G
$ qemu-img create -f rbd rbd:libvirt-pool/new-libvirt-image 2G

#查看是否成功创建
$ rbd -p libvirt-pool ls
new-libvirt-image

#最后,创建ceph用户key文件已给到kvm服务器使用ceph块服务时认证用到
$ ceph auth get-key client.libvirt | tee client.libvirt.key
#执行完毕之后会产生一个client.libvirt.key密钥文件,我们把它copy
到kvm-server去,自此ceph-deploy部分命令已经完结,下面到kvm-server

kvm配置使用ceph块设备作为虚拟机虚拟磁盘
#在kvm-server创建secret.xml文件,内容如下

1
2
3
4
5
<secret ephemeral='no' private='no'>
        <usage type='ceph'>
                <name>client.libvirt secret</name>
        </usage>
</secret>
1
2
3
4
5
6
#kvm-server执行以下命令,创建secret uuid
$ virsh secret-define --file secret.xml
xxxxx bca96153-b84f-45d0-a312-9361fe566458 xxxxx

#把命令返回输出的uuid记录下来,然后执行,其中uuid是之前产生的,
client.libvirt.key文件是ceph-deploy产生的
$ virsh secret-set-value --secret bca96153-b84f-45d0-a312-9361fe
566458 --base64 $(cat client.libvirt.key)

我们贴上虚拟机的完整xml配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<domain type='kvm'>
	<name>ceph001</name>                      //虚拟机名称
	<memory>524288</memory>                  //最大内存512MB
	<currentMemory>524288</currentMemory>    //可用内存512MB
	<vcpu>1</vcpu>                           //虚拟cpu个数
	<os>
		<type arch='x86_64' machine='pc'>hvm</type>
		<boot dev='cdrom'/>                    //光盘启动
	</os>
	<features>
		<acpi/>
		<apic/>
		<pae/>
	</features>
	<clock offset='localtime'/>
	<on_poweroff>destroy</on_poweroff>
	<on_reboot>restart</on_reboot>   
	<on_crash>destroy</on_crash>
	<devices>
		<!--<emulator>/usr/libexec/qemu-kvm</emulator>-->
        
        <!--这部分是ceph块服务设置,disk的source protocol要设置为rbd,
name对应池路径及块名称,host是ceph mon的ip地址及对应端口,auth里面的
secret是我们之前已经生成的uuid-->
		<disk type='network' device='disk'>
			<source protocol='rbd' name='libvirt-pool/
new-libvirt-image' >
				<host name='192.168.85.102' port=
'6789'/>
			</source>
			<auth username='libvirt'>
				<secret type='ceph' uuid='bca96153
-b84f-45d0-a312-
9361fe566458'/>
			</auth>
			<target dev='vda' bus='virtio'/>
		</disk>
        
        
		<disk type='file' device='cdrom'>
			<source file='/opt/iso/ubuntu-14.04.2-server
-amd64.iso'/> //
光盘镜像路径
			<target dev='hdb' bus='ide'/>
		</disk>
		<interface type='bridge'>		
//虚拟机网络连接方式
	 		<source bridge='br0'/>
			<mac address="54:52:00:aa:aa:01"/>	
//为虚拟机分配mac地址,
务必唯一,否则dhcp获得同样ip,引起冲突
			<virtualport type='openvswitch'></virtualport>
			<model type='virtio'/>
		</interface>
	<input type='mouse' bus='ps2'/>
	<graphics type='vnc' port='-1' autoport='yes' listen = '0.0.0.0'
 keymap='en-us'
/>//vnc方式登录,端口号自动分配,自动加1
	</devices>
 </domain>

创建启动虚拟机

1
2
3
4
5
6
7
$ virsh define cephvm.xml
$ virsh start ceph001
$ virsh vncdisplay ceph001 #查看ceph001实例的vnc端口
#然后使用vnc工具连接到kvm-server的IP以及ceph001实例的vnc端口即可远程管理了

#最后我们可以使用以下命令去查看ceph001实例使用ceph块的情况
$ virsh qemu-monitor-command --hmp ceph001 'info block'
Be the First to comment.

Leave a Comment

电子邮件地址不会被公开。 必填项已用*标注

63 views