存档

2013年12月 的存档

在 python 中动态导入模块

2013年12月23日 没有评论

在模块化编程的时候, 有时候模块的名字和细节, 主模块是不清楚的, 为了实现动态载入 模块(运行时载入模块), 不同的编程语言有不同的处理方式, 如在 C/CPP 中的 dlopen 等.

在 python 中, 也有相应的处理机制, 这些机制可以避免我们在模块化编程的时候, 频繁的修改上层代码, 比如不断的 import 等.

以一个小程序为例, 该程序支持 add, remove 命令:

# foo add some
# foo remove some

为了支持更多的命令, 比较优雅的方式是把每个命令模块化, 在合适的时机导入/注册 这些模块, 而不是在上层接口不断的 import. 我们可以通过 setuptools 的 entry_points 来达到这个目的.

1 首先, 在 setup 中注册插件名称和加载函数, 在 entry_points 中设置插件的组, 和需要注册的插件(名称和load函数)

# @file setup.py
from setuptools import setup
 
setup(
    # Other keywords
    entry_points={
        'foo': [
            'add = add:make',
            'remove = remove:make',
            'update = update:make',
        ],
    }
)

2 分别编写 add.py, remove.py, update.py 这些模块, 在每个模块里面, 分别编写各 自的 load 方法, 方法名要和上面设置的(这里为 make)一致, 例如:

# file add.py
import os
 
 
def make():
    print "register %s" % os.path.splitext(os.path.basename(__file__))[0]

3 通过 pkg_resources, 获取相应的模块名和模块方法

# file foo.py
import pkg_resources
entry_points = [
    (ep.name, ep.load()) for ep in pkg_resources.iter_entry_points('foo')
    ]
for (name, fn) in entry_points:
    fn()

以后如果增加新的命令, 只需要修改 setup.py, 把模块名字和方法注册进去就可以了.

测试一下:

$ python setup.py sdist
$ python foo.py 
register add
register update
register remove

分类: programming 标签: ,

从错误状态恢复虚拟机

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 标签: , ,

CEPH 初体验

2013年12月12日 2 条评论

介绍

Ceph 是新一代的分布式文件系统, 具有高扩展, 高可靠性, 高性能的特点. 它采用多个 多个元数据 + 多个存储节点 + 多个监控节点的架构, 解决单点故障的问题.

架构简介

如图, ceph 的后端是 RADOS, 一个对象存储系统. 通过 rados, 提供了以下接口:

  • 类似于 amazon S3 的对象存储系统
  • Block 设备接口
  • 文件系统接口, 兼容 POSIX

ceph architecture

组件简介

ceph 主要由以下组件:

  • osd: Object Storage Device, 负责提供存储资源
  • monitor: 维护整个 ceph 集群的状态
  • mds: 保存 cephfs 的元数据, 非必须, 只有 cephfs 接口需要此模块
  • rados gateway: 提供 REST 接口, 兼容 S3 和 Swift 的 API

搭建环境准备

准备了三台机器, 每台机器有两个磁盘(vda, vdb), 初始搭建用 ceph1 作为 mon, ceph2, ceph3 作为 osd, osd mon, osd 的扩展之后完成

  | Hostname |     IP Address | Role       |
  |----------+----------------+------------|
  | ceph1    | 192.168.176.30 | mon, admin |
  | ceph2    | 192.168.176.31 | osd        |
  | ceph3    | 192.168.176.32 | osd        |

1 修改三台节点的 hosts 文件, 使得彼此可见, 在每一个节点 的/etc/hosts 中, 加入

192.168.176.30  ceph1
192.168.176.31  ceph2
192.168.176.32  ceph3

2 把 admin 节点(ceph1) 的 ssh 密钥拷贝到其他节点, 使得 ceph1 可以无密码访问其他节点

 # ssh-keygen
 # ssh-copy-id ceph1
 # ssh-copy-id ceph2
 # ssh-copy-id ceph3

3 在 admin node(ceph1) 上, 设置 ceph 的软件源仓库

 # wget -q -O- 'https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc' | \
apt-key add -
 # echo deb http://ceph.com/packages/ceph-extras/debian $(lsb_release -sc) main | \
tee /etc/apt/sources.list.d/ceph-extras.list
 # CODENAME 是 lsb_release -sc 得到的值
 # apt-add-repository 'deb http://ceph.com/debian-emperor/ {CODENAME} main'
 # apt-get update && apt-get install ceph-deploy

部署

部署工作是在 admin node 上完成的.

 # 1. 创建一个工作目录
 # mkdir -p ~/my-cluster && cd ~/my-cluster
 
 # 2. 创建一个集群, 默认集群名为 ceph, 默认 monitor 为 ceph1
 # ceph-deploy new ceph1
 
 # 3. 在所有节点上安装 ceph 软件包, 此操作将在所有节点上执行以下操作, 1) 添加 ceph
 #    的软件源, 2) 更新软件源数据库, 安装 ceph ceph-mds ceph-common ceph-fs-common
 #    和 gdisk 软件包
 # ceph-deploy install ceph1 ceph2 ceph3
 
 # 4. 创建 mon, 这里选择 ceph1 作为 monitor 节点, 大概的流程如下:
 #    1) 把 ceph.conf 文件复制到 ceph1:/etc/ceph
 #    2) 在 ceph1 中创建 ceph1:/var/lib/ceph/mon/ceph-ceph1 并把 ceph.mon.keyring 
 #       复制到 ceph1:/var/lib/ceph/tmp/ceph-ceph1.mon.keyring
 #    3) 在 ceph1 中使用以下命令初始化 monitor data: 
 #       ceph-mon --cluster ceph --mkfs -i ceph1 --keyring /var/lib/ceph/tmp/ceph-ceph1.mon.keyring
 #    4) 在 ceph1 中运行 initctl emit ceph-mon cluster=ceph id=ceph1 启动 ceph-mon
 #       或者使用 service ceph -c /etc/ceph/ceph.conf start mon.ceph1
 #    5) 在 ceph1 中用 ceph --cluster=ceph --admin-daemon /var/run/ceph/ceph-mon.ceph1.asok mon_status
 #        检查 ceph1 的 mon 状态, 如果有错误, 报告之
 # ceph-deploy mon create ceph1
 
 # 5. 复制远程 node 上的密钥复制到当前文件夹, 包括:
 #    ceph.client.admin.keyring ==> ceph.client.admin.keyring
 #    /var/lib/ceph/mon/ceph-ceph1/keyring ==> ceph.mon.keyring
 #    /var/lib/ceph/bootstrap-osd/ceph.keyring ==> ceph.bootstrap-osd.keyring
 #    /var/lib/ceph/bootstrap-mds/ceph.keyring ==> ceph.bootstrap-mds.keyring
 # ceph-deploy gatherkeys ceph1
 
 # 6. 增加 osd
 #    prepare 主要步骤:
 #    1) push 配置文件 到 ceph{2,3}:/etc/ceph/ceph.conf
 #    2) push ceph.bootstrap-osd.keyring 复制到 ceph{2,3}:/var/lib/ceph/bootstrap-osd/ceph.keyring
 #    3) udevadm trigger --subsystem-match=block --action=add
 #    4) ceph-disk-prepare --fs-type xfs --cluster ceph -- /dev/vdb ==> 创建分区, 格式化 等
 #    activate 步骤:
 #    ceph-disk-activate --mark-init upstart --mount /dev/vdb ==> 挂载 ceph 分区, 使用以下命令启动
 #    initctl emit --no-wait -- ceph-osd cluster=ceph id=0
 # ceph-deploy osd prepare ceph2:/dev/vdb ceph3:/dev/vdb
 # ceph-deploy osd activate ceph2:/dev/vdb ceph3:/dev/vdb
 # ceph osd tree # 查看 osd 的状态
 # id   weight  type name   up/down reweight
-1  0.3 root default
-2  0.09999     host ceph2
0   0.09999         osd.0   up  1   
-3  0.09999     host ceph3
1   0.09999         osd.1   up  1   
 
 # 7. 复制 admin 密钥到其他节点
 #    复制 ceph.conf, ceph.client.admin.keyring 到 ceph{1,2,3}:/etc/ceph
 # ceph-deploy admin ceph1 ceph2 ceph3
 
 # 8. 查看部署状态
 # ceph health
HEALTH_OK ==> that's all

添加新的 osd

这里准备把 ceph1 变为 一个新的 osd

 # 根据上面的介绍, 新增一个 osd 很简单
 # ceph-deploy osd prepare ceph1:/dev/vdb
 # ceph-deploy osd activate ceph1:/dev/vdb
 # ceph osd tree # 查看状态
 # id   weight  type name   up/down reweight
-1  0.3 root default
-2  0.09999     host ceph2
0   0.09999         osd.0   up  1   
-3  0.09999     host ceph3
1   0.09999         osd.1   up  1   
-4  0.09999     host ceph1
2   0.09999         osd.2   up  1

添加新的 mon

为了 monitor 的高可用, 一般部署的时候推荐设置多个 monitor, 这里把 ceph2 和 ceph3 也变为 monitor.

 # 1. ceph2, ceph3 不在 mon_initial_members 中, 这里把 ceph{2,3} 也加入配置文件中
 #    顺便把 public 网络也设置一下
 # emacsclient ceph.conf
 # cat ceph.conf
root@ceph1:~/my-cluster# cat ceph.conf 
[global]
...
mon_initial_members = ceph1 ceph2 ceph3
public_network = 192.168.176.0/24
...
 
 # 2. 把配置文件同步到其它节点
 # ceph-deploy --overwrite-conf config push ceph1 ceph2 ceph3
 
 # 3. 创建 monitor
 # ceph-deploy mon create ceph2 ceph3

添加新 mds

mds 是 metadata service, 目前官方只推荐在生产环境中使用一个 mds. 因为 object 和 block storage 没有文件的概念, 不需要元数据, 所以 mds 只有在部署 CephFS 才有 意义.

 # 1. 细节解释:
 #    1) 把 ceph.conf 和 ceph.bootstrap-mds.keyring 复制到 ceph1:/etc/ceph 和
 #       /var/lib/ceph/bootstrap-mds/ceph.keyring
 #    2) 创建 ceph1:/var/lib/ceph/mds/ceph-ceph1
 #    3) ceph --cluster ceph --name client.bootstrap-mds \
 #       --keyring /var/lib/ceph/bootstrap-mds/ceph.keyring \
 #       auth get-or-create mds.ceph1 osd allow rwx mds allow mon allow profile mds \
 #       -o /var/lib/ceph/mds/ceph-ceph1/keyring
 #    4) 启动 initctl emit ceph-mds cluster=ceph id=ceph1, 或者
 #       service ceph start mds.ceph1
 # ceph-deploy mds create ceph1

作为文件系统使用

在一台安装了 ceph 客户端的机器上, 直接挂在

 # mount -t ceph ceph1:6789:/ /mnt -o name=admin,secret=AQBhjqlSKBBTCxAAwchc9GauJ4+MPHz9hkV9Iw==
 # df -h | grep mnt
192.168.176.30:6789:/        297G  108M  297G   1% /mnt

作为块设备使用

在一台安装了 ceph 的机器上(或者可以用 ceph-deploy install machine-name 安装), 执行以下命令:

 # modprobe rbd # 挂载 rbd 的内核模块
 # rbd create --size 4096 test1 # 创建一个 4G 的 rbd 镜像
 # 把 上面创建的 rbd 镜像映射到块设备 /dev/rbd/{poolname}/imagename , 这里为 /dev/rbd/rbd/test
 # rbd map test1 --pool rbd
 # 然后, 就可以像使用普通快设备一样使用这个块设备了(格式化,分区,直接给虚拟机使用), 例如
 # mkfs.ext4 /dev/rbd/rbd/test1 # 格式化
 # mount /dev/rbd/rbd/test1 /rbd
 # df -h | grep rbd
/dev/rbd1                    3.9G  8.0M  3.6G   1% /rbd

参考

分类: 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 标签: