存档

文章标签 ‘OpenStack’

RDO 初体验

2014年2月9日 没有评论

无数的实践证明, Openstack 的搭建不是一个技术活, 纯粹是体力活, 所以有了各种 各样的搭建工具, e.g. puppet, chef. 理论上在 ubuntu 等平台用 puppet 搭建 相对已经 很简单了, 但是还有其他的问题, 需要去简单熟悉 puppet 的语法, 修改类似于 ruby 的 配置文件. 但是 RDO 这货, 虽然是基于 puppet 来构建 openstack 的, 但是用户 在使用的过程中完全感觉不到 puppet 的存在, 甚至只会简单的一些 linux 命令的新手 也能很快的上手.

环境设置

Hostname IpAddress Role
rdo.cloud.com 192.168.176.36(eth0) 10.0.0.15(eth1) master(compute node)
rdo2.cloud.com 192.168.176.37(eth0) 10.0.0.16(eth1) compute node

安装配置

登陆到 rdo.cloud.com 这台机器上. 执行下列指令:

# yum install -y http://rdo.fedorapeople.org/openstack/openstack-havana/rdo-release-havana.rpm
# yum install -y openstack-packstack
# yum -y update # 为了方便, 把系统升级到最新
# reboot
# packstack --gen-answer-file my_answers.txt # 生成一个应答文件
# emacsclient my_answers.txt # 修改稍许设置, 主要是以下几项
CONFIG_NTP_SERVERS=pool.ntp.org
CONFIG_KEYSTONE_ADMIN_PW=admin # 为了方便, 把 admin 的密码修改为 admin, 不然登陆 UI 的时候太麻烦了
CONFIG_NOVA_COMPUTE_HOSTS=192.168.176.36,192.168.176.37
CONFIG_NEUTRON_OVS_TENANT_NETWORK_TYPE=gre
CONFIG_NEUTRON_OVS_TUNNEL_RANGES=1:1000
CONFIG_NEUTRON_OVS_TUNNEL_IF=eth1

最后一步, 在所有上面配置文件上定义的节点上安装配置 openstack

# packstack --answer-file my_answers.txt # 会询问密码

So easy, have fun!

分类: OpenStack 标签:

从错误状态恢复虚拟机

2013年12月21日 没有评论

我的 openstack 整个环境被我不小心重启了, 重启计算节点出了问题没有启动起来, 我于是想 stop 这个实例, 但是 stop 后, 虚拟机异常了, 如下:

# nova list
+--------------------------------------+--------------+--------+--------------+-------------+-----------------------+
| ID                                   | Name         | Status | Task State   | Power State | Networks              |
+--------------------------------------+--------------+--------+--------------+-------------+-----------------------+
| 015ac60a-1902-4d39-b4ea-11376838872b | myvm         | ACTIVE | None         | Running     | private=192.168.22.34 |
| 72824bed-4ce6-440c-996f-12d725e3fa71 | myvm-on-ceph | ACTIVE | None         | Running     | private=192.168.22.36 |
| a8bdeb86-981f-449e-a529-e6f43314f7dc | myvm2        | ACTIVE | powering-off | Running     | private=192.168.22.35 |
+--------------------------------------+--------------+--------+--------------+-------------+-----------------------+
 
# nova stop myvm2
ERROR: Instance a8bdeb86-981f-449e-a529-e6f43314f7dc in task_state powering-off. 
Cannot stop while the instance is in this state. (HTTP 400) (Request-ID: req-f91e6cfd-bc05-43c8-87e5-5f00bc25f713)

我把计算节点修复好了, 该虚拟机也一直无法恢复, 这时候只有通过 nova reset-state 先恢复状态了, 该指令会把 instance 的 Task State 恢复为 None, 然后就可以 stop 或者 delete 该虚拟机了.

# nova reset-state myvm2
# nova list
+--------------------------------------+--------------+--------+------------+-------------+-----------------------+
| ID                                   | Name         | Status | Task State | Power State | Networks              |
+--------------------------------------+--------------+--------+------------+-------------+-----------------------+
| 015ac60a-1902-4d39-b4ea-11376838872b | myvm         | ACTIVE | None       | Running     | private=192.168.22.34 |
| 72824bed-4ce6-440c-996f-12d725e3fa71 | myvm-on-ceph | ACTIVE | None       | Running     | private=192.168.22.36 |
| a8bdeb86-981f-449e-a529-e6f43314f7dc | myvm2        | ERROR  | None       | Running     | private=192.168.22.35 |   <== 状态已经更新
+--------------------------------------+--------------+--------+------------+-------------+-----------------------+

状态已经修复, 可以 stop && start 了

# nova stop myvm2
# nova list
+--------------------------------------+--------------+---------+------------+-------------+-----------------------+
| ID                                   | Name         | Status  | Task State | Power State | Networks              |
+--------------------------------------+--------------+---------+------------+-------------+-----------------------+
| 015ac60a-1902-4d39-b4ea-11376838872b | myvm         | ACTIVE  | None       | Running     | private=192.168.22.34 |
| 72824bed-4ce6-440c-996f-12d725e3fa71 | myvm-on-ceph | ACTIVE  | None       | Running     | private=192.168.22.36 |
| a8bdeb86-981f-449e-a529-e6f43314f7dc | myvm2        | SHUTOFF | None       | Shutdown    | private=192.168.22.35 |
+--------------------------------------+--------------+---------+------------+-------------+-----------------------+
 
 
# nova list
+--------------------------------------+--------------+--------+------------+-------------+-----------------------+
| ID                                   | Name         | Status | Task State | Power State | Networks              |
+--------------------------------------+--------------+--------+------------+-------------+-----------------------+
| 015ac60a-1902-4d39-b4ea-11376838872b | myvm         | ACTIVE | None       | Running     | private=192.168.22.34 |
| 72824bed-4ce6-440c-996f-12d725e3fa71 | myvm-on-ceph | ACTIVE | None       | Running     | private=192.168.22.36 |
| a8bdeb86-981f-449e-a529-e6f43314f7dc | myvm2        | ACTIVE | None       | Running     | private=192.168.22.35 |
+--------------------------------------+--------------+--------+------------+-------------+-----------------------+

分类: OpenStack 标签:

整合 Openstack 和 Ceph

2013年12月18日 没有评论

环境

Hostname IP Address Roles
ceph1 192.168.176.30 ceph-monitor/admin
ceph2 192.168.176.31 ceph-osd
ceph3 192.168.176.32 ceph-osd
os-control 192.168.176.152 controller/compute/cinder-scheduler
os-compute 192.168.176.156 compute
cinder1 192.168.176.156 cinder-node

为 openstack 创建 osd pool

在 ceph-admin 节点上:

root@ceph1:~# ceph osd pool create volumes 128
root@ceph1:~# ceph osd pool create images 128
root@ceph1:~# ceph osd pool stats
pool data id 0
  nothing is going on
 
pool metadata id 1
  nothing is going on
 
pool rbd id 2
  nothing is going on
 
pool volumes id 3
  nothing is going on
 
pool images id 4
  nothing is going on

为 openstack 节点配置 ceph

安装软件包

在 glance-node(os-control) 上:

root@os-control:~# apt-get install -y python-ceph

在 cinder-node(cinder1) 上:

root@os-compute:~# apt-get install -y python-ceph ceph-common

配置

配置文件

在 ceph-admin 节点把 ceph 的配置文件复制到 {glance,cinder-node}:/etc/ceph, 如果这两个节点不存在该文件夹, 先创建

root@ceph1:~# ceph-deploy config push os-control
root@ceph1:~# ceph-deploy config push cinder1

设置认证

1 因为我们之前的 Ceph 配置开启了 cephx 认证, 创建相应的用户来使用 Ceph 服务.

root@ceph1:~# ceph auth get-or-create client.volumes mon 'allow r' \
osd 'allow class-read object_prefix rbd_children, allow rwx pool=volumes, allow rx pool=images'
 
root@ceph1:~# ceph auth get-or-create client.images mon 'allow r' \ 
osd 'allow class-read object_prefix rbd_children, allow rwx pool=images'

2 然后把 client.{volumes/images} 的 keyring 复制到相应的节点(glance-node/cinder-node)

root@ceph1:~# ceph auth get-or-create client.images | ssh os-control tee /etc/ceph/ceph.client.images.keyring
root@ceph1:~# ssh os-control sudo chown glance:glance /etc/ceph/ceph.client.images.keyring
 
root@ceph1:~# ceph auth get-or-create client.volumes | ssh cinder1 tee /etc/ceph/ceph.client.volumes.keyring
root@ceph1:~# ssh cinder1 chown cinder:cinder /etc/ceph/ceph.client.volumes.keyring

3 配置 compute-node(os-control), 在 compute 节点上, 认证是由 libvirt 来完成的.

# 1) 把 client.volumes 的 keyring 复制到 compute-node
root@ceph1:~# ceph auth get-key client.volumes | ssh os-control tee client.volumes.key
 
# 2) 在 compute-node 中, 创建 secret.xml 文件, 内容如下
<secret ephemeral='no' private='no'>
  <usage type='ceph'>
    <name>client.volumes secret</name>
  </usage>
</secret>
 
# 3) 把这个文件导入到 libvirt 中
# virsh secret-define --file secret.xml
3888d137-bcda-45fe-93e3-4fdd0112d0df
 
# 4) 把 client.volumes 的密钥导入 libvirt 中
# virsh secret-set-value --secret 3888d137-bcda-45fe-93e3-4fdd0112d0df \
--base64 $(cat client.volumes.key) && rm client.volumes.key secret.xml

设置 openstack

1 在 glance-node(os-control) 中, 修改配置文件 /etc/glance/glance-api.conf 的以下值

default_store=rbd
rbd_store_user=images
rbd_store_pool=images
show_image_direct_url=True

2 在 cinder-node(cinder1) 中, 修改 /etc/cinder/cinder.conf 的以下值

volume_driver=cinder.volume.drivers.rbd.RBDDriver
rbd_pool=volumes
glance_api_version=2
rbd_user=volumes
rbd_secret_uuid=3888d137-bcda-45fe-93e3-4fdd0112d0df

3 在各自节点重启 openstack 相关服务

# service glance-api restart
# service nova-compute restart
# service cinder-volume restart

使用

创建 images

# 1) 用 glance 上传一个镜像, 命令和普通 glance 操作一样 ==>
# du -h /mnt/Images/ubuntu-13.10-server-cloudimg-amd64-disk1.img 
232M    /mnt/Images/ubuntu-13.10-server-cloudimg-amd64-disk1.img
# glance image-create \
--name="ubuntu-ceph-image" \
--is-public True \
--container-format bare \
--disk-format qcow2 \
--file /mnt/Images/ubuntu-13.10-server-cloudimg-amd64-disk1.img \
--progress
 
# 2) 查看上传的镜像
# nova image-list
+--------------------------------------+-----------------------+--------+--------+
| ID                                   | Name                  | Status | Server |
+--------------------------------------+-----------------------+--------+--------+
| 8aa5b765-1a4d-4b98-b5ad-9b6c7b58d57b | Ubuntu 13.10 cloudimg | ACTIVE |        |
| 7849c15e-9c28-49c6-97ab-d278bc27b525 | ubuntu-ceph-image     | ACTIVE |        |
+--------------------------------------+-----------------------+--------+--------+
 
# 3) 在 ceph 节点上查看 rados 的情况
# rbd ls images
7849c15e-9c28-49c6-97ab-d278bc27b525
# rbd info images/7849c15e-9c28-49c6-97ab-d278bc27b525
rbd image '7849c15e-9c28-49c6-97ab-d278bc27b525':
    size 231 MB in 29 objects                         <== 注意这个大小
    order 23 (8192 kB objects)
    block_name_prefix: rbd_data.10c2375b6
    format: 2
    features: layering

创建可启动 volumes

# 1) 创建一个 10G 的可启动盘
# cinder create --image-id 7849c15e-9c28-49c6-97ab-d278bc27b525 --display-name boot-vol-on-ceph 10
 
# 2) 查看创建的磁盘信息
# cinder list
+--------------------------------------+-----------+------------------+------+-------------+----------+--------------------------------------+
|                  ID                  |   Status  |   Display Name   | Size | Volume Type | Bootable |             Attached to              |
+--------------------------------------+-----------+------------------+------+-------------+----------+--------------------------------------+
| 6f01529e-1d42-4c53-b4c7-e50d466571cc |   in-use  |     volume1      |  1   |     None    |  false   | 015ac60a-1902-4d39-b4ea-11376838872b |
| 7604e894-231b-4d86-b613-9659c7583936 |   in-use  |     volume2      |  1   |     None    |  false   | 015ac60a-1902-4d39-b4ea-11376838872b |
| bd3a9b3a-64c8-4865-8f55-32dfc683ff67 | available | boot-vol-on-ceph |  10  |     None    |   true   |                                      |
+--------------------------------------+-----------+------------------+------+-------------+----------+--------------------------------------+
 
# 3) 查看 rbd 的信息
# rbd ls volumes
volume-bd3a9b3a-64c8-4865-8f55-32dfc683ff67
# rbd info volumes/volume-bd3a9b3a-64c8-4865-8f55-32dfc683ff67
rbd image 'volume-bd3a9b3a-64c8-4865-8f55-32dfc683ff67':
    size 10240 MB in 2560 objects                           <== 创建的大小 10G
    order 22 (4096 kB objects)
    block_name_prefix: rbd_data.10e02ae8944a
    format: 2
    features: layering

启动

# nova boot --flavor 2 --key_name mykey --block_device_mapping vda=bd3a9b3a-64c8-4865-8f55-32dfc683ff67:::0 myvm-on-ceph
# nova list
+--------------------------------------+--------------+--------+--------------+-------------+-----------------------+
| ID                                   | Name         | Status | Task State   | Power State | Networks              |
+--------------------------------------+--------------+--------+--------------+-------------+-----------------------+
| 015ac60a-1902-4d39-b4ea-11376838872b | myvm         | ACTIVE | None         | Running     | private=192.168.22.34 |
| 10309940-f56a-4c64-9910-561e29fb7b81 | myvm-on-ceph | ACTIVE | None         | Running     | private=192.168.22.36 |
+--------------------------------------+--------------+--------+--------------+-------------+-----------------------+

查看 QEMU 的命令行信息, 在 compute-node 节点

# ps aux | grep '[1]9537' | awk -F " -" '{ i=1;while(i<NF) {print NF,$i;i++}}' | grep 'drive file'
32 drive file=rbd:volumes/volume-bd3a9b3a-64c8-4865-8f55-32dfc683ff67:id=volumes:key=AQBkJK9SOA1UDBAAUqjfU6SvWzEv/w7ZH8nBmg==:auth_supported=cephx\;none:mon_host=192.168.176.30\:6789\;192.168.176.31\:6789\;192.168.176.32\:6789,if=none,id=drive-virtio-disk0,format=raw,serial=bd3a9b3a-64c8-4865-8f55-32dfc683ff67,cache=none

可以看到, QEMU 已经使用了 rbd 的 url 来读写虚拟机镜像了.

其它

如果配置多个 {compute,cinder}-node, 按照上面各自节点的配置做相应的配置即可.

分类: OpenStack, Storage 标签: , ,

OpenStack Step By Step(5) – setup cinder

2013年12月8日 3 条评论

介绍

Cinder 是 OpenStack 的块设备存储模块, 是从 nova 的 nova-volume 组件演化而来的. 它提供块设备存储服务, 为 nova 提供可被虚拟机使用的块设备, nova 可以通过 cinder 创建 block 设备, 为虚拟机挂载这些设备, 也可以 对块设备执行删除, 从虚拟机分离等操作.

安装部署

cinder 的部署分为两部分, cinder 的控制节点和存储节点. 在本次部署中, 控制节点在之前的 openstack 控制节点上, 存储节点在之前的计算节点上. 这样做只是为了方便, 实际上, 这两个节点可以和之前的模块分离.

role hostname ip address
cinder controller os-control 192.168.176.152
cinder storage node os-compute1 192.168.176.156

另外, 为了方便, 之前我部署 openstack 的时候使用的是 sqlite 数据库, 但是在搭建 cinder 多个节点的时候遇到了问题. 我将数据库从 sqlite 改为 mysql 后 该问题消失了了. 所以本次搭建开始使用 mysql 作为数据库. 将 sqlite 改为 mysql 很简单, 只需要将前文配置文件中数据库配置修改改为 mysql 即可, 其它所有一切的配置都相同.

connection = sqlite:////var/lib/nova/nova.sqlite

改为:

connection = mysql://nova:linux@os-control/nova

并创建相关的数据库, 然后同步数据库即可(根据你的配置文件修改对应的密码):

# mysql -u root -p
mysql> CREATE DATABASE nova;
mysql> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY 'linux';
# nova-manage db sync
# 重启服务

当然, 如果你用 sqlite 也能成功部署多个 storage node, 那么此处不需要做修改.

安装控制节点

# apt-get install -y cinder-api cinder-scheduler

修改 /etc/cinder/cinder.conf, 增加以下几项:

[DEFAULT]
...
rpc_backend = cinder.openstack.common.rpc.impl_kombu
rabbit_host = controller
rabbit_port = 5672
rabbit_userid = guest
rabbit_password = RABBIT_PASS
...
 
[database]
connection = mysql://cinder:linux@localhost/cinder

调整 /etc/cinder/api-paste.ini 中的 [filter:authtoken], 使其变为:

[filter:authtoken]
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory
auth_host = os-control
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = cinder
admin_password = geniux

创建并同步数据库:

# mysql -u root -p
mysql> CREATE DATABASE cinder;
mysql> GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' IDENTIFIED BY 'linux';
# rm /var/lib/cinder/cinder.sqlite
# cinder-manage db sync

创建并配置 cinder user, 创建 cinder 的 endpoint, 由于我们之前在 endpoint.sh 已经创建了一个 volume 的 endpoint, 这里只需要创建一个 V2 版本的即可.

# keystone user-create --name=cinder --pass=geniux --tenant=service --email=cinder@example.com
# keystone user-role-add --user=cinder --tenant=service --role=admin
# keystone service-create --name=volume --type=volume2 --description="Cinder Volume Service V2"
  keystone endpoint-create \
  --service-id=the_service_id_above \
  --publicurl=http://controller:8776/v2/%$latex tenant_id$s \
  --internalurl=http://controller:8776/v2/%$latex tenant_id$s \
  --adminurl=http://controller:8776/v2/%$latex tenant_id$s

一切就绪, 重启 cinder 服务:

# service cinder-scheduler restart
# service cinder-api restart

安装存储节点

安装 cinder 相关包

# apt-get install -y cinder-volume lvm2 tgt

设置 hosts

在该步骤, 需要同时在 controller node 和 storage node 上设置 /etc/hosts 文件, 使得二者可以互相看到对方的 hostname. 由于我们之前已经在配置 nova 模块的时候配置过了, 这里可以省略.

lvm setup

由于我们这里使用 lvm + iscsi 作为存储后端, 所以需要设置 lvm, 注意我的 storage 有两块硬盘: vda 和 vdb, 这里 vdb 分配给 cinder 使用.

LVM 的相关概念及操作见我之前的 LVM 杂记.

# pvcreate /dev/vdb
# vgcreate cinder-volumes /dev/vdb

设置 cinder

将 controller 的 /etc/cinder 下的 cinder.conf 和 api-paste.ini 文件复制过来, 覆盖即可. 还要注意 cinder.conf 的数据库连接路径不要写 localhost, 而要写 os-control

重启 cinder 和 iscsi 服务即可:

# service cinder-volume restart
# service tgt restart

测试

在 controller 节点上查看 cinder 的节点(可以看到 os-compute1 被加入控制了):

# cinder-manage host list
host                        zone           
os-control                  nova           
os-compute1                 nova

使用

前面说过, nova 利用 cinder 为虚拟机提供块设备服务. 下列操作展示了怎么给 虚拟机新增一个磁盘设备.

创建 volume

# nova volume-create --display_name "volume1" 1
+---------------------+--------------------------------------+
| Property            | Value                                |
+---------------------+--------------------------------------+
| status              | creating                             |
| display_name        | volume1                              |
| attachments         | []                                   |
| availability_zone   | nova                                 |
| bootable            | false                                |
| created_at          | 2013-12-07T20:25:27.648067           |
| display_description | None                                 |
| volume_type         | None                                 |
| snapshot_id         | None                                 |
| source_volid        | None                                 |
| size                | 1                                    |
| id                  | 6f01529e-1d42-4c53-b4c7-e50d466571cc |
| metadata            | {}                                   |
+---------------------+--------------------------------------+
root@os-control:/var/log/nova# nova volume-list
+--------------------------------------+-----------+--------------+------+-------------+-------------+
| ID                                   | Status    | Display Name | Size | Volume Type | Attached to |
+--------------------------------------+-----------+--------------+------+-------------+-------------+
| 6f01529e-1d42-4c53-b4c7-e50d466571cc | available | volume1      | 1    | None        |             |
+--------------------------------------+-----------+--------------+------+-------------+-------------+

PS: volume 也可以用 cinder 直接操作

将 volume 分配给虚拟机

将 id 为 6f01529e-1d42-4c53-b4c7-e50d466571cc 的磁盘分配给 myvm, 设备名称为 /dev/vdb

# nova volume-attach myvm 6f01529e-1d42-4c53-b4c7-e50d466571cc /dev/vdb

去我们的虚拟机里面看看实际的情况:

# ssh ubuntu@192.168.22.34
ubuntu@myvm:~$ cat /proc/partitions 
major minor  #blocks  name
 
 253        0   20971520 vda
 253        1   20970496 vda1
ubuntu@myvm:~$ sudo fdisk -l /dev/vdb
 
Disk /dev/vdb: 1073 MB, 1073741824 bytes
16 heads, 63 sectors/track, 2080 cylinders, total 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
 
Disk /dev/vdb doesn't contain a valid partition table

在虚拟机里面, 就可以像操作普通磁盘一样操作了.

进一步, 我们看看这个 volume 在 host 上的细节.

这个 volume 是在 os-compute1 上的 一个 LV, 由 ISCSI 协议被连接到本地:

在 controller node 上看看 ISCSI target 的信息:

root@os-control:~# iscsiadm -m node -o show | grep "node.name\|node.conn<p style="text-align:center"> $latex \displaystyle 0$ </p>.address"
node.name = iqn.2010-10.org.openstack:volume-6f01529e-1d42-4c53-b4c7-e50d466571cc
node.conn[0].address = 192.168.176.156

在 storage node 上看看 LVM 和 ISCSI 的相关信息:

root@os-compute1:/etc/cinder# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/cinder-volumes/volume-6f01529e-1d42-4c53-b4c7-e50d466571cc
  LV Name                volume-6f01529e-1d42-4c53-b4c7-e50d466571cc
  VG Name                cinder-volumes
  LV UUID                yj3I0y-DPMg-AZxh-pcUx-A1jy-aJQa-PcKiMg
  LV Write Access        read/write
  LV Creation host, time os-compute1, 2013-12-08 04:25:27 +0800
  LV Status              available
  # open                 1
  LV Size                1.00 GiB
  Current LE             256
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:2
 
# cat /var/lib/cinder/volumes/volume-6f01529e-1d42-4c53-b4c7-e50d466571cc 
<target iqn.2010-10.org.openstack:volume-6f01529e-1d42-4c53-b4c7-e50d466571cc>
    backing-store /dev/cinder-volumes/volume-6f01529e-1d42-4c53-b4c7-e50d466571cc
</target>

分类: OpenStack 标签:

OpenStack Step By Step(4) – setup compute node

2013年12月5日 没有评论

介绍

Compute Node 负责接受 Controller Node 对于虚拟机创建, 删除等的请求, 从名字可以看出, 它仅仅是作为一个计算节点, 只需要 nove-compute 这个 nova 的子模块.

安装配置

安装

如上所说, 我们只需要 nova 的 nova-compute 模块.

# apt-get install nova-compute-kvm python-guestfs

配置

如前所述, nova 的配置文件位于 /etc/nova, 需要修改的是: nova.conf 和 api-paste.ini, 其实 controller node 和 compute node 的 node 配置几乎相同, 在我们的例子里, 只需要修改 my_ip 为 node 的真实 IP 即可.

修改 nova.conf:

[DEFAULT]
...
my_ip=192.168.176.156 # 根据你自己的情况修改

重启 nova-compute 服务即可.

# service nova-compute restart

测试

在 controller node 节点中, 查看我们的 compute node 是否被 controller 所认知(看最后一行):

# nova-manage service list
Binary           Host                                 Zone             Status     State Updated_At
nova-cert        os-control                           internal         enabled    :-)   2013-12-05 17:12:48.567536
nova-consoleauth os-control                           internal         enabled    :-)   2013-12-05 17:12:44.650398
nova-scheduler   os-control                           internal         enabled    :-)   2013-12-05 17:12:40.872264
nova-network     os-control                           internal         enabled    :-)   2013-12-05 17:12:41.040888
nova-conductor   os-control                           internal         enabled    :-)   2013-12-05 17:12:42.623085
nova-compute     os-control                           nova             enabled    :-)   2013-12-05 17:12:42.563989
nova-compute     os-compute1                          nova             enabled    :-)   2013-12-05 17:12:44.212783

在 compute node 上启动虚拟机

启动虚拟机的时候, nova 有自己的算法在不同的 node 间调度, 这里为了测试我们新加 的 node 能正常工作, 我们指定在该 node 上启动虚拟机.

方法很简单, 就是在启动的命令后加一个参数, –availability-zone, 后面接的值 即是上面 list 列出来的名字(nova:os-compute1)

# 启动一个名字为 myvm2 的虚拟机, 指定在 os-compute1 上运行
# nova boot --flavor 2 --key_name mykey --image 836911d3-6e65-48d9-abf4-2e6051f3925d myvm2 \
--availability-zone nova:os-compute1
# nova list
+--------------------------------------+-------+--------+------------+-------------+-----------------------+
| ID                                   | Name  | Status | Task State | Power State | Networks              |
+--------------------------------------+-------+--------+------------+-------------+-----------------------+
| d5de16b1-b723-4161-b409-839e83c85bc9 | myvm  | ACTIVE | None       | Running     | private=192.168.22.34 |
| e6036773-fdad-4593-8797-ac3c1587c724 | myvm2 | ACTIVE | None       | Running     | private=192.168.22.35 |
+--------------------------------------+-------+--------+------------+-------------+-----------------------+
# 用 ssh 登陆进去看看是否成功
# ssh ubuntu@192.168.22.35
ubuntu@myvm2:~$ ifconfig
eth0      Link encap:Ethernet  HWaddr fa:16:3e:26:ad:21  
          inet addr:192.168.22.35  Bcast:192.168.22.63  Mask:255.255.255.224
          inet6 addr: fe80::f816:3eff:fe26:ad21/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:353430 errors:0 dropped:11 overruns:0 frame:0
          TX packets:24641 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:38239227 (38.2 MB)  TX bytes:2396159 (2.3 MB)
 
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Yes! That’s all

分类: OpenStack 标签:

OpenStack Step By Step(3) – setup nova

2013年12月4日 没有评论

介绍

Nova 是 Openstack 的计算模块, 是最核心的组件. 它对上提供包括虚拟机的创建, 启动, 删除, 虚拟磁盘的挂载/卸载等服务, 对下它封装各种不同的 hypervisor 的 API, 使得整个 OpenStack 对不同的 hypervisor(qemu/kvm, xen, virtualbox) 都有统一的 API 接口.

PS: 以下配置在这台机器上同时安装 controller service 和 compute service(all in one)

安装配置

安装

# apt-get install -y nova-api nova-cert nova-common nova-compute \
nova-compute-kvm nova-doc nova-network nova-objectstore nova-scheduler \
nova-volume nova-consoleauth novnc python-nova python-novaclient \
nova-conductor rabbitmq-server

配置

修改配置文件

nova 的配置文件位于 /etc/nova, 目前我们需要修改的是: nova.conf 和 api-paste.ini

  • nova.conf
    在 [DEFAULT]后面, 添加
    auth_strategy=keystone # 使用 keystone 认证
    rpc_backend = nova.rpc.impl_kombu
    rabbit_host = 192.168.176.152 # rabbitmq server 的地址
    flat_injected=true
    # 以下是网络设置
    network_manager=nova.network.manager.FlatDHCPManager
    fixed_range=192.168.22.32/27 # 设置虚拟机内部 IP 的地址范围
    floating_range=192.168.176.160/27 # 设置浮动IP的范围, 该IP用于和外部通信
    flat_network_dhcp_start=192.168.22.33 # 设置内部DHCP的地址段
    flat_network_bridge=br100 # 设置网桥名称
    flat_interface=eth1 # 设置内部网络走的网卡
    public_interface=eth0 # 设置外部网络走得网卡, 用于浮动 IP 的发放
    my_ip=192.168.176.152 # 本节点的 IP
    glance_host=192.168.176.152 # glance 的地址

    添加两个段: database, keystone_authtoken

    [database]
    sql_connection=sqlite:////var/lib/nova/nova.sqlite
     
    [keystone_authtoken]
    auth_host = 192.168.176.152 
    auth_port = 35357
    auth_protocol = http
    admin_tenant_name = service # 参考前面 keystone 的配置
    admin_user = nova
    admin_password = geniux

  • api-paste.ini
    将:
    [filter:authtoken]
    paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory
    auth_host = 127.0.0.1
    auth_port = 35357
    auth_protocol = http
    admin_tenant_name = %SERVICE_TENANT_NAME%
    admin_user = %SERVICE_USER%
    admin_password = %SERVICE_PASSWORD%

    修改为:

    [filter:authtoken]
    paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory
    auth_host = 127.0.0.1
    auth_port = 35357
    auth_protocol = http
    admin_tenant_name = service # 参考前面 keystone 的配置
    admin_user = nova
    admin_password = geniux

创建数据库

清空 apt-get 安装时默认创建的数据库, 然后手动创建一个

# rm /var/lib/nova/nova.sqlite
# nova-manage db sync
# chown nova:nova /var/lib/nova/nova.sqlite
# for a in nova-compute nova-network nova-api nova-cert nova-consoleauth nova-scheduler nova-conductor; do service "$a" restart; done

网络配置

创建一个虚拟机使用的内部 IP 段和浮动IP段

# 创建内部IP段
# nova-manage network create private --fixed_range_v4=192.168.22.32/27 \
--num_networks=1 --bridge=br100 --bridge_interface=eth1 --network_size=32
# 创建浮动 IP 段
# nova-manage floating create --ip_range=192.168.176.160/27

测试

列出可用的镜像

# nova image-list
+--------------------------------------+-----------------------+--------+--------+
| ID                                   | Name                  | Status | Server |
+--------------------------------------+-----------------------+--------+--------+
| 836911d3-6e65-48d9-abf4-2e6051f3925d | Ubuntu 13.10 cloudimg | ACTIVE |        |
+--------------------------------------+-----------------------+--------+--------+

启动虚拟机

接下来, 就可以启动第一台虚拟机了.

导入密钥

由于我上面没有配置 vnc, 我通过 ssh 的方式访问启动的虚拟机. 如果 ssh 密钥 被虚拟机验证通过的话, 就可以直接访问了. 聪明的 openstack 会为我们做这件 事情, 在虚拟机创建的时候, 它会把你给它的 ssh 密钥注入进虚拟机的相应位置.

# ssh-keygen # 如果没有 ssh 密钥(~/.ssh/id_rsa 不存在), 创建一个
# nova keypair-add --pub_key id_rsa.pub mykey # 导入密钥, 命名为 mykey
# nova keypair-list
+-------+-------------------------------------------------+
| Name  | Fingerprint                                     |
+-------+-------------------------------------------------+
| mykey | 5d:cc:62:1d:3a:1c:18:f4:b4:a3:69:e3:bc:79:2b:2f |

设置安全组

允许 ssh 和 ping 我们的虚拟机.

# nova secgroup-add-rule default tcp 22 22 0.0.0.0/0
# nova secgroup-add-rule default icmp -1 -1 0.0.0.0/0

选择规格

openstack 的规格(flavor), 指的是你给虚拟机指定的硬件参数, 包括内存大小, CPU 数量, 磁盘大小等等.

首先来看看 openstack 默认给用户提供了什么样的规格

# nova flavor-list
+----+-----------+-----------+------+-----------+------+-------+-------------+-----------+
| ID | Name      | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public |
+----+-----------+-----------+------+-----------+------+-------+-------------+-----------+
| 1  | m1.tiny   | 512       | 1    | 0         |      | 1     | 1.0         | True      |
| 2  | m1.small  | 2048      | 20   | 0         |      | 1     | 1.0         | True      |
| 3  | m1.medium | 4096      | 40   | 0         |      | 2     | 1.0         | True      |
| 4  | m1.large  | 8192      | 80   | 0         |      | 4     | 1.0         | True      |
| 5  | m1.xlarge | 16384     | 160  | 0         |      | 8     | 1.0         | True      |
+----+-----------+-----------+------+-----------+------+-------+-------------+-----------+

如果觉得不满意, 还可以自己创建/删除规格, 比如, 创建一个 1G 内存, 10G硬盘, 双核 CPU 的规格.

# nova flavor-create --is-public true myflavor 6 1024 10 2
+----+----------+-----------+------+-----------+------+-------+-------------+-----------+
| ID | Name     | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public |
+----+----------+-----------+------+-----------+------+-------+-------------+-----------+
| 6  | myflavor | 1024      | 10   | 0         |      | 2     | 1.0         | True      |
+----+----------+-----------+------+-----------+------+-------+-------------+-----------+
# nova flavor-list
+----+-----------+-----------+------+-----------+------+-------+-------------+-----------+
| ID | Name      | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public |
+----+-----------+-----------+------+-----------+------+-------+-------------+-----------+
| 1  | m1.tiny   | 512       | 1    | 0         |      | 1     | 1.0         | True      |
| 2  | m1.small  | 2048      | 20   | 0         |      | 1     | 1.0         | True      |
| 3  | m1.medium | 4096      | 40   | 0         |      | 2     | 1.0         | True      |
| 4  | m1.large  | 8192      | 80   | 0         |      | 4     | 1.0         | True      |
| 5  | m1.xlarge | 16384     | 160  | 0         |      | 8     | 1.0         | True      |
| 6  | myflavor  | 1024      | 10   | 0         |      | 2     | 1.0         | True      |
+----+-----------+-----------+------+-----------+------+-------+-------------+-----------+

启动

通过上面的设置, 启动虚拟机就恨简单了, 下面的参数都是自解释的.

# nova boot --flavor 2 --key_name mykey --image 836911d3-6e65-48d9-abf4-2e6051f3925d myvm
# nova list
+--------------------------------------+-------+--------+------------+-------------+-----------------------+
| ID                                   | Name  | Status | Task State | Power State | Networks              |
+--------------------------------------+-------+--------+------------+-------------+-----------------------+
| d5de16b1-b723-4161-b409-839e83c85bc9 | myvm  | ACTIVE | None       | Running     | private=192.168.22.34 |
+--------------------------------------+-------+--------+------------+-------------+-----------------------+
# ps aux | grep qemu # 查看 qemu 的运行参数
# ssh ubuntu@192.168.22.34 # ssh 登陆虚拟机
ubuntu@myvm:~$ df -h # 查看磁盘状态
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        20G  853M   18G   5% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev            997M   12K  997M   1% /dev
tmpfs           201M  336K  200M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none           1002M     0 1002M   0% /run/shm
none            100M     0  100M   0% /run/user
ubuntu@myvm:~$ free -m # 查看内存状态
             total       used       free     shared    buffers     cached
Mem:          2002        429       1572          0         65        295
-/+ buffers/cache:         68       1933
Swap:            0          0          0

分类: OpenStack 标签:

OpenStack Step By Step(2) – setup glance

2013年12月3日 1 条评论

介绍

Glance 是 OpenStack 中处理虚拟机镜像的模块, 对外提供镜像查询, 上传 下载, 删除等服务. Nova 启动虚拟机的时候需要从 glance 里获取虚拟机的镜像/模板.

安装配置

安装

# apt-get install -y glance glance-api python-glanceclient glance-common glance-registry python-glance

配置

修改配置文件

修改 glance 的配置文件: glance-api.conf 和 glance-registry.conf 把 [keystone_authtoken] 部分从:

[keystone_authtoken]
auth_host = 127.0.0.1
auth_port = 35357
auth_protocol = http
admin_tenant_name = %SERVICE_TENANT_NAME%
admin_user = %SERVICE_USER%
admin_password = %SERVICE_PASSWORD%

修改为:

[keystone_authtoken]
auth_host = 127.0.0.1
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = glance
admin_password = geniux

设置认证方式, 设置为通过 keystone 认证, 将配置文件中:

[paste_deploy]
#flavor=

修改为:

[paste_deploy]
flavor = keystone

创建数据库

清空 apt-get 安装时默认创建的数据库, 然后手动创建一个

# rm -f /var/lib/glance/glance.sqlite
# glance-manage version_control 0
# glance-manage db_sync
# chown glance:glance /var/lib/glance/glance.sqlite
# service glance-api restart && service glance-registry restart

测试

glance --os-username admin --os-password geniux --os-tenant-name admin --os-auth-url http://localhost:5000/v2.0/ index
ID                                   Name                           Disk Format          Container Format     Size          
------------------------------------ ------------------------------ -------------------- -------------------- --------------

上传镜像到 glance

为了方便, 把用户名, 租户信息, api url 信息放到用户配置文件下, 每次登陆 自动导入这些信息:

# tail -n 4 ~/.bashrc
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=geniux
export OS_AUTH_URL="http://localhost:5000/v2.0/"

首先获取一个需要导入的镜像(为了省事, 这里直接使用 ubuntu 提供的”云”镜像)

# axel -n 8 http://uec-images.ubuntu.com/releases/13.10/release/ubuntu-13.10-server-cloudimg-amd64-disk1.img

用 glance image-create 上传该镜像

# image-create --name="Ubuntu 13.10 cloudimg" --is-public True --container-format bare \
--disk-format qcow2 --file ubuntu-13.10-server-cloudimg-amd64-disk1.img --progress
[=============================>] 100%
+------------------+--------------------------------------+
| Property         | Value                                |
+------------------+--------------------------------------+
| checksum         | eef6cffa7f1c680afb7bc0405d932f06     |
| container_format | bare                                 |
| created_at       | 2013-12-03T06:54:34.157369           |
| deleted          | False                                |
| deleted_at       | None                                 |
| disk_format      | qcow2                                |
| id               | 836911d3-6e65-48d9-abf4-2e6051f3925d |
| is_public        | True                                 |
| min_disk         | 0                                    |
| min_ram          | 0                                    |
| name             | Ubuntu 13.10 cloudimg                |
| owner            | 5c5dc9b3e96b4dc886ab9c9d78535618     |
| protected        | False                                |
| size             | 242941952                            |
| status           | active                               |
| updated_at       | 2013-12-03T06:54:35.371760           |
+------------------+--------------------------------------+

以后 Nova 创建虚拟机的时候, 就可以使用这个镜像了, 下节探讨.

分类: OpenStack 标签:

OpenStack Step By Step(1) – setup keystone

2013年12月2日 没有评论

介绍

关于 Keystone 的介绍, 网络上很多, 比如 What is this Keystone anyway?, 这里就不浪费口水了.

安装配置

为了方便, 在以下的安装过程中使用 sqlite3 作为数据库

安装

# apt-get install -y sqlite3 keystone python-keystone python-keystoneclient

配置

修改 admin 权限

首先修改 admin 的令牌, 这里我修改为 “geniux”

# emacsclient /etc/keystone/keystone.conf
# admin_token = geniux # 设置 admin_token 为 geniux

接下来, 创建需要的 tenant, user, roles 等 keystone 需要的元素, 这里使用 devstack 的 keystone_data.sh 脚本来创建, 我简单的把admin和 service 的token修改为上面设置的值. 具体见下表:

Tenant User Roles
admin admin admin
service glance admin
service nova admin, [ResellerAdmin (swift only)]
service quantum admin # if enabled
service swift admin # if enabled
demo admin admin
demo demo Member, anotherrole
invisible_to_admin demo Member

首先, 清空 apt-get 安装时默认创建的数据库, 手动创建一个

# rm -f /var/lib/keystone/keystone.db
   keystone-manage db_sync
   chown keystone:keystone /var/lib/keystone/keystone.db
   service keystone restart

然后, 用 keystone_data.sh 脚本创建上表的元素

# ./keystone_data.sh

最后一步, 是创建 endpoint(OpenStack 服务的 API 接口), 这里我使用一个由 hastexo 提供的脚本来实现, 因为原始的脚本是用 mysql 来搭建地, 所以我这里需要 将 mysql 的相关代码修改为 sqlite 的接口, 修改后的文件见附件.

# ./endpoints.sh

测试

# keystone --token geniux --endpoint http://127.0.0.1:35357/v2.0/ user-list
+----------------------------------+--------+---------+--------------------+
|                id                |  name  | enabled |       email        |
+----------------------------------+--------+---------+--------------------+
| c3ec029db5f5447c949fe36b8f1119a0 | admin  |   True  | admin@hastexo.com  |
| 2fcb4478f84a4a6d92b0aa62063fb320 |  demo  |   True  |  demo@hastexo.com  |
| 1c9c5d982c894f2ebb1edc70addebcf8 | glance |   True  | glance@hastexo.com |
| e0485d57f45744a58c3ac2d4cb9db137 |  nova  |   True  |  nova@hastexo.com  |
| ee73fbd4d3ee4c898ccb9aa5d4ec1b7c | swift  |   True  | swift@hastexo.com  |
+----------------------------------+--------+---------+--------------------+

分类: OpenStack 标签:

OpenStack Step By Step(0) – Introduction

2013年12月2日 没有评论

新公司聘用我负责公司产品底层存储方面的技术, 但是该产品是基于 openstack 平台来做的, 所以我不得不花一点点时间来了解一下 openstack 的东西. 这也就是 这个博客系列的由来: 手动搭建一遍 openstack 的各个组件.

但是由于我不会去专门负责该产品 openstack 相关部分的研发, 为了省事, 我使用 ubuntu 13.10 来作为我搭建的环境, 选择的 openstack 版本是 havana.

以下是这个系列的索引:

分类: OpenStack 标签: