本文来自:SDNAP.com - SDN联合播报
11月份受邀访问了汉柏科技,据他们开发SDN小组介绍他们也正在SDN上面花大量人力物力,将会为数据中心提供一整套SDN解决方案。不久将有这方面DEMO,到时希望能在SDNAP沙龙做些分享,或是做些技术上的分享。本文是汉柏SDN产品线经理曾红李参加SDNAP沙龙听KkBluE做了这方面介绍,特意组织出这方面的一个教程分享。非常感谢大家的有心分享。
1 安装准备
本文主要介绍了openstack+contrail的安装过程,用户界面还是openstack的界面,只是openstack的网络功能由contrail 完成(可以从测试中对VM之间通信的抓包可以看出使用了mpls over GRE 隧道)。由于开源版本contrail 安装部署的文档较少,搭建这个环境比较复杂,在此我们分享一下安装和编译过程中遇到的问题和解决方案。由于代码开源,我们也简单介绍了一些调试的手段。如果有什么问题联系 chensheng(at)opzoon.com, 或是SDN QQ群#汉柏-树袋熊,或@holly77r25
1.1 硬件环境
- 服务器两台:操作系统fedora17(18,19应该也没问题)
- 以太网交换机:1台
逻辑组网拓扑图如下:
1.2 安装软件准备
(1)安装fedora系统(略);
(2)设置普通用户的sudo权限,openstack的安装是以普通用户的身份安装的(建议不要 以root身份执行安装脚本)
编译sudoers文件
$sudo chmod 777 /etc/sudoers
$vi /etc/sudoers
找到如下行
root ALL=(ALL) ALL
添加普通用户的sudo权限,如下
root ALL=(ALL) ALL
opzoon ALL=(ALL) NOPASSWD:ALL
把sudoers文件权限复原,否则执行安装脚本会报错
$sudo chmod 440 /etc/sudoers
(3)配置两台服务器的网络,其中一台配置如下(最简单的配置),另外一台的配置需要根据两个服务器是否在一个网段,进行IP地址的修改,在本例子中,两台服务器在同一个网段,IP地址分别为:10.0.0.11 和10.0.0.12
$sudo vi /etc/sysconfig/network-scripts/ifcfg-em1
UUID=”fcc9fad3-4b99-4a02-b02a-adfd6d8f0f64″
NM_CONTROLLED=”yes”
HWADDR=”D0:67:E5:EC:E9:08″
IPADDR=10.0.0.11
NETMASK=255.255.255.0
GATEWAY=10.0.0.1
DNS1=8.8.8.8
DEVICE=”em1″
ONBOOT=”yes”
(4)添加ssh认证
脚本安装过程会下载contrail源码,其下载过程需要ssh认证,需要去https://github.com网站注册个账户,然后在注册的账户里添加ssh公匙。步骤如下:
(1)安装ssh
$sudo yum install -y openssh-server
(2)生成公匙和私匙
$ssh-keygen
(3)显示生成的公匙
$cat ~/.ssh/id_rsa.pub
(4)网页登陆https://github.com上注册的账户,点击右上角的设置图标,进入设置界 面后,在左侧栏找到SSH-Keys,就可以添加SSH公匙了。把上面打印的公匙复制 到 key里点击add key就能可以了。
(5)验证密匙是否生效
$ssh -T git@github.com
如果打印如下信息,说明添加成功了。
Hi opzoon! You’ve successfully authenticated, but GitHub does not provide shell access.
(5)下载devstack(openstack 安装脚本)
Juniper公司把contrail的安装集成到了devstack脚本里,下载地址为https:github.com/dsetia/devstack,可以直接上网页下载zip包,也可以在命令行下用git clone命令下载。git下载方式如下:
$sudo yum install git -y
$cd ~/
$git clone https://github.com/dsetia/devstack.git
(6)下载相应系统内核源码和更新必要库文件
$sudo yum install -y kernel-devel #编译内核模块vrouter需要
$sudo yum update libtasn1 #运行openstack-compute时,不更新该库会出错
2. 安装和编译
根据前面的拓扑图,我们对服务节点和计算节点进行安装。
1.进入下载好的devstack目录,根据需要修改安装节点启动脚本(之后的步骤是一样的)。
(1)服务节点的安装脚本
把contrail目录下的localrc-multinode-server复制一份到devstack目录,并命名为 localrc, 如下:
$cd ~/devstack
$cp contrail/localrc-multinode-server ./localrc
修改localrc里的参数,例如:
PHYSICAL_INTERFACE=em1
HOST_IP=10.0.0.11
CONTRAIL_VGW_PUBLIC_SUBNET=10.0.0.240/28,建议IP范围和样本保持一致 (240 to 255)。
(2)计算节点的安装脚本
把contrail目录下的localrc-multinode-compute复制一份到devstack目录,并命名为 localrc,如下:
$cd ~/devstack
$cp contrail/localrc-multinode-compute ./localrc
修改localrc里的参数,例如:
PHYSICAL_INTERFACE=em1
HOST_IP=10.0.0.12
SERVICE_HOST=10.0.0.11
CONTRAIL_VGW_PUBLIC_SUBNET=10.0.0.240/28,建议IP范围和样本保持一致 (240 to 255)。
最后,再把enable_service contrail添加到localrc里。
2.脚本安装里下载的源码存放在了/opt/stack目录里,脚本可能没有权限创建stack目 录,需要手动创建,并设置权限。如下:
$sudo mkdir /opt/stack
$sudo chmod 777 /opt/stack
3.执行安装脚本,安装openstack和contrail。
$./stack.sh
第一次执行脚本,会下载源码和依赖包,安装时间比较长。安装结束后,会打印网页访问地址,用户及密码。一般情况下,很难一次就安装成功的,中间多少会出现一些问题。如果出现安装中断和失败,接着看后面的内容。如果安装失败或者安装提示完成了却仍然有问题,可以看看调试章节的内容定位问题的原因。脚本执行到下载contrail源码时,容易出问题,一般表现为认证、访问网址等诸多原因失败,如果出现这种情况后,需要手动下载(还用脚本下载有可能被跳过),下载方法看后面章节。
4.重新执行安装脚本之前,先执行卸载脚本。
$./unstack.sh
3 安装过程遇到的问题及解决方式
1) 如果安装过程遇到HOST_IP无法确定的问题,查看stack.sh里的 FLOATING_RANGE或FIXED_RANGE是否与你的IP地址有冲突。如果有冲突,把它 修改成其它的网段。
2) 如果以前下载过devstack,需要重新下载,新版本补丁做了修改,并修复了一些 BUG。
3) contrail源码下载出现问题,大概会长时间停留在如下打印处(后面可能还会打印 认证失败或访问被拒绝之类的):
repo init -u git@github.com:Juniper/contrail-vnc
或
repo init -u git@github.com:Juniper/contrail-vnc
Get https://gerrit.googlesource.com/git-repo
长时间无反应情况下,多按几次ctrl+c让脚本完全退出安装,执行手动下载,步骤 如下:
4) 首先判断是否有repo命令,如果没有,按如下步骤安装:
$wget http://commondatastorage.googleapis.com/git-repo-downloads/repo
$chmod 0755 repo
$sudo mv repo /usr/bin
5) 下载contrail源码(前提是前面的ssh认证通过了):
$sudo rm -rf /opt/stack/contrail
$sudo mkdir /opt/stack/contrail
$sudo chmod 777 /opt/stack/contrail
$cd /opt/stack/contrail
$git config –global user.name “Anonymous”
$git config –global user.email “anonymous@nowhere.com”
$repo init -u git@github.com:Juniper/contrail-vnc
如果上面这步出现问题,ctrl+c退出后,进行如下操作后重新执行(不行就多试几次,直到成功下载完)。
$rm -rf .repo*
$repo init -u git@github.com:Juniper/contrail-vnc
最后,同步源码
$repo sync
下载完contrail源码,就可以重新执行安装脚本了
$cd ~/devstack
$./stack.sh
6) contrail的编译和安装需要下载一些依赖,当脚本执行到编译contrail或安装contrail 时出现问题,先确认如下目录文件是否都下载成功。如发现某些文件大小为0的情况, 直接删除,下次执行安装脚本时会重新下载。
$ls -l /tmp/cache/third_party/
bind-9.9.2-P1.tar.gz
fysom-1.0.8.tar.gz
hiredis-master.zip
libxml2-2.8.0.tar.gz
tbb40_20111130oss_src.tgz
boost_1_48_0.tar.gz
gmock-1.6.0.zip
hiredis-v0.11.0.tar.gz
log4cplus-1.1.1.tar.bz2
thrift-0.8.0.tar.gz
bottle-0.11.6.tar.gz
gperftools-2.1.tar.gz
http-parser-v2.1.tar.gz
pugixml-1.2.tar.gz
curl-7.24.0.tar.gz
gtest-1.6.0.zip
ifmap-python-master.zip
rapidjson-0.11.zip
$ls -l /opt/stack/contrail/third_party
apache-cassandra-2.0.2
bottle-0.11.6
hiredis-0.11.0
irond-0.3.0-bin.zip
bottle_patch1.diff
hiredis-asio-patch1.diff
libxml2-2.8.0
tbb40_20111130oss
apache-cassandra-2.0.2-bin.tar.gz
curl-7.24.0
hiredis-boostasio-adapter
log4cplus-1.1.1
thrift-0.8.0
bind-9.9.2-P1
fetch_packages.py
hiredis-patch1.diff
ncclient-v0.3.2.tar.gz
thrift_autoconf.patch
bind_patch1.diff
fysom-1.0.8
http-parser-2.1
ncclient-v0.3.2.tar.gz.1
thrift_patch1.diff
boost_1_48_0
gmock-1.6.0
ifmap-python-client
packages.xml
zookeeper-3.4.5
boost_1_48_patch1.diff
gperftools-2.1
ifmap-python-patch1.diff
pugixml
zookeeper-3.4.5.tar.gz
boost_time_utc.patch
gtest-1.6.0
irond-0.3.0-bin
rapidjson
另外,把pache-cassandra-2.0.2复制一份命名为apache-cassandra-2.0.2-bin或者修改devstack/lib/neutron_thirdparty/contrail里对该文件存在的判断,以避免每次执行安装脚本都要下载。
7) 新版本的devstack安装后,好像没有安装config_parser命令(连它的本名都修改为 了contrail_parser.py),没有它contrail创建不了接口,创建虚拟机会失败。按如下方法 修复(前提是安装脚本至少执行到了给nova源码打补丁的地方,即执行完了 nova_v4.patch。否则没有这个文件):
$sudo cp -rf /opt/stack/nova/plugins/contrail/contrail_parser.py /usr/sbin/config_parser
$sudo chmod a+x /usr/sbin/config_parser
8) 安装过程可能还会遇到一些文件创建权限问题,对于这些情况,参照调试部分定位问题,设置权限。
4 如何调试
1.如果遇到了上面没有提到的问题,就需要看程序执行的情况来定位问题出现原因。 用devstack安装openstack和contrail后,会创建两个screen,在这两个screen中调试比 较方便,定位问题也方便多了。调试步骤如下(如果是root用户安装的,需要切换到 stack账户下调试):
(1)列出screen
$screen -ls
打印如下信息,说明两个screen都创建成功了。
4810.contrail (Detached)
4670.stack (Attached)
2 Sockets in /var/run/screen/S-opzoon.
(2)进入到contrail界面
$screen -x contrail
正常情况下,单节点和服务节点最后一行显示如下(计算节点只有agent和vif):
0$ shell 1$(L) redis 2$(L) cass 3$(L) zk 4$(L) ifmap 5$(L) disco 6$(L) apiSrv 7$(L) schema 8$(L) control 9$(L) agent 10$(L) vif*
其中显示有*号的表示现在正处于这个界面,切换到其它程序执行界面的方法:按 一下ctrl+a后,按数字进入对应的程序界面或按p和n进行前、后界面的切换。
(3)进入stack界面的方法及操作和contrail相同。
2.当发现有程序执行异常时,无法通过异常结果判断原因,可以用pdb进行调试查看 问题原因。pdb的使用方法,网上有许多教程,我就不多说了。
3.出现ERROR:Address already in use之类的错误时,大部分情况下表示该程序在另 一个地方运行,这种情况说明程序是正常的,小部分情况是你运行了一些其它的程序, 占用了该端口号。
4.每个程序运行界面,都可以ctrl+c退出程序的执行。不管程序异常退出,还是ctrl+c 退出的,都可以通过按向上的方向键找到运行程序的命令,重新运行程序。
5 实际测试
按照前面提到的拓扑进行测试环境安装过程,使用两台设备,一台安装服务节点(包含了计算节点),一台安装计算节点。在这个测试环境里,暂时没有涉及L3层网络,无法保证ssh能登陆虚拟机。登陆虚拟机的方式可以安装virt-manager,通过GUI界面登陆进去测试互通情况,不过在计算节点中创建的虚拟机无法登陆(可以在服务节点中的虚拟机通过ssh登陆),只能看到一个光标在闪,刚开始还以为创建虚拟机有问题,后来ping它里面的虚拟机才知道创建成功了。下面贴上两台主机里的虚拟机互ping抓包的结果,可以看出其隧道封装为MPLS over GRE
本文链接:http://www.sdnap.com/sdnap-post/3326.html \ 本文标签: opencontrail, openstack