存档

2014年2月 的存档

用 Puppet 部署 CEPH

2014年2月23日 没有评论

相比其他分布式系统(e.g. glusterfs), Ceph 的复杂毋庸置疑, 甚至在部署上也稍显
麻烦, 目前主流的部署方式主要有以下几种:

  • ceph-deploy: 取代之前的 mkcephfs, 不推荐在生产环节使用
  • chef: 官方推荐的部署工具
  • puppet: 大家部署这些服务最喜欢的方式
  • XXX: 自己从底层定制, 比如我这里写的 ceph-aio

本文主要介绍用 puppet 部署 ceph.

基本配置

三台机器, 每台机器都分别作为 monitor 和 osd, 并且每台机器都有两个磁盘,
把第二个磁盘(/dev/vdb)作为 osd. 我这里使用 这个 puppet 模块, 但是这个模块
官方没有对同时把一台节点变为 monitor 和 osd的测试, 我这里测试中也出了一点问题,
我用了一些 work around 的方法, 需要注意, 下面的 Troubleshoot 中会提到.

我部署的基本环境如下:

Hostname Ip Address Roles osd
ceph1.test 192.168.176.30 master + mon + osd /dev/vdb
ceph2.test 192.168.176.31 agent + mon + osd /dev/vdb
ceph3.test 192.168.176.32 agent + mon + osd /dev/vdb

修改每台节点的 hosts 文件, 使得可以互相用主机名 ping 通

# cat /etc/hosts
... ...
192.168.176.30  ceph1.test
192.168.176.31  ceph2.test
192.168.176.32  ceph3.test

puppet master 配置

1 安装 puppet 软件包

# apt-get install -y ruby1.8 puppetmaster sqlite3 libsqlite3-ruby \
  libactiverecord-ruby git augeas-tools puppet ruby1.8-dev libruby1.8
# update-alternatives --set ruby /usr/bin/ruby1.8

2 配置 puppet

修改 /etc/puppet/puppet.conf 的相应配置项为:

[master]
storeconfigs = true
dbadapter = sqlite3
 
[agent]
pluginsync = true
server = ceph1.test

设置我们的节点不需要认证:

# echo "*.test" > /etc/puppet/autosign.conf

3 puppet 的模块设置

安装需要的 puppet 模块:

# puppet module install ripienaar/concat
# puppet module install puppetlabs/apt

安装 puppet 的 ceph 模块:

# cd /etc/puppet/modules
# git clone git://github.com/enovance/puppet-ceph.git ceph

4 配置 site.pp 文件

我照着文档写了对应上面三个节点的 site.pp 文件, 可以从发 这里 下载, 然后拷贝到
/etc/puppet/manifests 目录下

5 重启 puppetmaster

# service puppetmaster restart

puppet agent 配置

注意: 此操作要在三个节点上同时执行.

1 安装 puppet 软件包

# apt-get -y install puppet

2 修改 /etc/puppet/puppet.conf 的相应配置项为:

[agent]
pluginsync = true
server = ceph1.test

3 大功告成, 开始利用 puppet 部署 ceph

# puppet agent --enable
# export AGENT_OPTIONS="--onetime --verbose --ignorecache --no-daemonize --no-usecacheonfailure --no-splay --show_diff --debug"
# puppet agent $AGENT_OPTIONS # 运行五步这步操作, 分别可以获取 keyring, 配置磁盘等等

4 依次登陆每个节点同步 ceph 的配置文件

# ssh cephx.test
# puppet agent -vt

Troubleshoot

在配置 osd 的时候会发现初始化 osd 的时候失败, 官方对同时把节点当做 monitor
和 osd 没有进行详细的测试, 我这里手动初始化 osd 来 work around 这个问题, 我这里
以 ceph1.test, 也就是 osd.0 为例来说明

# rm -rf /var/lib/ceph/osd/ceph-0/* # 先清空之前初始化失败的数据
# ceph auth add osd.0 osd 'allow *' mon 'allow rwx' -i /var/lib/ceph/osd/ceph-0/keyring # 初始化 osd 的目录
# service ceph start osd.0 # 启动 osd 服务

可以看到现在 osd 正常了

# ceph osd tree
# id    weight  type name   up/down reweight
-1  0.04999 root default
-2  0.04999     host ceph1
0   0.04999         osd.0   up  1

分类: Storage 标签: ,

Docker 初体验

2014年2月20日 没有评论

Introduction

Docker 是基于 LXC 的应用程序容器技术, 最近一年在虚拟化, 云计算领域非常的
流行, 它不但使得应用程序的自动化部署大大方便了, 甚至可以和 openstack 这样的
IaaS 平台整合, OMG!

以下以 ubuntu 系统来体验以下 docker.

Install

安装 docker

# apt-get install linux-image-extra-`uname -r`
# apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
# echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list
# apt-get update
# apt-get install -y lxc-docker

测试

# 如果没有 ubuntu 镜像的话, 会从仓库下载一份, 喝杯咖啡吧
root@ubuntu:~# docker run -i -t ubuntu /bin/echo 'hello world'
hello world

More usage

前面说过, docker 是应用程序的容器, 实际上, 可以把应用程序以 daemon 的模式
运行, 用 docker 提供的命令行接口和这些程序交互(e.g. I/O, 结束进程)

以一个简单的例子说明, 执行一个简单的脚本, 不断的在屏幕上打印 hello world

# docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
26f90b990b8cc0e592b0ffc5310584647e0e763d6c9794d65e9b3225a380ac81 #返回 container id

执行 docker 命令之后, 屏幕上除了打印一个 该 docker 容器的 ID 外, 什么也没有

要获取程序的输出, 可以用 logs 子命令, 该命令捕获程序的输出

# docker logs 26f90b990b8cc0e592b0ffc5310584647e0e763d6c9794d65e9b3225a380ac81
hello world
hello world
hello world
hello world
hello world
hello world

使用 attach 把该程序恢复到前台执行, 有点类似于 bash 下的 fg 指令, 如果对 gdb
很熟悉的朋友, 把他当做 gdb 下的 attach 也未尝不可

# docker attach -sig-proxy=false 26f90b990b8cc0e592b0ffc5310584647e0e763d6c9794d65e9b3225a380ac81
docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
6c82bf81c5e3        ubuntu:12.04        /bin/sh -c while tru   2 minutes ago       Up 2 minutes                            kickass_franklin

后台的程序可以使用 stop 直接结束

# docker stop 26f90b990b8cc0e592b0ffc5310584647e0e763d6c9794d65e9b3225a380ac81

如果想看当前容器运行着多少程序, 可以使用 ps 命令查看

# docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
7cf51b1d50358971ff699639fac4b6ea0e0a6d99e8dd6861addf200f2580681a
# docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
06fd537af32d05f99c1e26a19483d1ad0fe5dfb7512ab6a693ae23120ac43955
# docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
06fd537af32d        ubuntu:12.04        /bin/sh -c while tru   3 seconds ago       Up 3 seconds                            loving_franklin     
7cf51b1d5035        ubuntu:12.04        /bin/sh -c while tru   4 seconds ago       Up 4 seconds                            stoic_galileo

Deploy a web app

下面使用 docker 部署稍微复杂一点的程序, 一个使用 python 的 flask 框架编写
的简单的 web 程序

先把程序的容器镜像下载下来

# docker pull shykes/pybuilder # pull 一个新的 image
# URL=http://github.com/shykes/helloflask/archive/master.tar.gz #传递给前面镜像的 buildapp 程序

使用镜像内置的 buildapp 程序构建程序

# BUILD_JOB=$(docker run -d -t shykes/pybuilder:latest /usr/local/bin/buildapp $URL)

查看 build 状态

# docker attach -sig-proxy=false $BUILD_JOB

把刚才做的修改保存为 mydocker/hello

# BUILD_IMG=$(docker commit $BUILD_JOB mydocker/hello)

最后, 运行我们的 web 程序

# WEB_WORKER=$(docker run -d -p 5000 $BUILD_IMG /usr/local/bin/runapp)

查看服务器的运行状态

# docker logs $WEB_WORKER
 * Running on http://0.0.0.0:5000/

查找被映射到容器外的端口, 并用该端口测试是否部署成功

# WEB_PORT=$(sudo docker port $WEB_WORKER 5000 | awk -F: '{ print $2 }')
# curl http://127.0.0.1:$WEB_PORT
  Hello world!

分类: 虚拟化 标签:

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