Apr 27, 2015
Technology本节在前面部署完Fuel 控制节点的基础上,接着部署一个OpenStack HA环境,并准备好OpenContrail的三个部署节点。
节点初始化准备
所有加入到Fuel控制节点里的机器,在加入前都需要进行初始化配置,而后才可以被Fuel所识别.
在所有配置好的机器里,点击Details-> Boot Options, 设置如下:

因为第一次启动的时候,磁盘里是没有内容的,机器会自动从第二选项启动(PXE). 机器将自动侦测5个网段上的PXE Server, 因为Fuel Controller接管了10.20.0.0/24 网段上的PXE请求,它将会把机器从PXE变成可部署的状态。
OpenStack HA环境创建
创建一个OpenStack HA环境,如下步骤,因为是HA,所以需要至少三个OpenStack Controller节点和一个OpenStack Compute节点。
点击界面里的New OpenStack Environment, 在弹出的窗口中,命名需要部署的HA环境名,并选择部署所需要的镜像,这里我们选择Ubuntu作为部署OpenStack的基础镜像。

点击下一步,选择HA模式:

点击下一步,选择计算节点模式,这里选择qemu或者kvm问题都不大,不要选vcenter就是了:

点击下一步,进入到网络模式选择,选择Legacy Network(nova-network), 先部署成这种形式,接下来我们会使用neutron和contrail的组合重新规划网络:

点击下一步,Storage Backend,因为我们不打算引入任何存储节点,这里选择Default,直接进入下一步, Additional Service里我们也不打算启任何额外的服务,一路Next直到最后Create出整个OpenStack环境。
依次创建另一个OpenStack HA环境,用来部署三台Contrail Controller的节点机.
OpenStack环境网络
Fuel默认的网络配置会激活三个物理端口,第一个端口接入PXE网络,第二个接入Public网络,第三个上启三个VLAN,分别接入到Management/Storage/Private网络。我认为VLAN的配置增加了配置和部署的复杂度,更改为五个物理网络,分别使用我们在Virt-Manager中创建出的五个物理网卡接入。更改方法如下:
点击Network, 更改Management下的CIDR,手动填入10.55.55.0/24,然后去掉前面的Use VLAN Tag:

依次修改Storage网络和Private网络,更改完毕后,你的配置应该看起来是这样的:

对于Public网络我们不需要有任何修改,保持172.16网段的配置即可。
确认Network的配置为FlatDHCP Manager:

建立OpenStack HA环境
经PXE启动的虚拟机会把自己加入到"Unallocated Nodes"的队列里,在创建好的环境里,点击Node后,可以看到Fuel对角色的分配,添加一个OpenStack Controller的步骤如下:
在Assign Roles里选择"Controller”, 下面的备选节点里选择一台机器后,Apply Changes按钮会变绿,点击进入下一步.

在切换到的页面中,点击节点最右边的齿轮,配置该节点机器的网络、存储等,这里只配置网络:

点击Configure Network配置网络:

可以看到前4个节点已经配置好了,我们只需要把VM(Fix)这个框从eth0拖动到eth4即可:

添加完毕后,网络配置应该如下图:

点击Apply后,保存当前配置,然后点击Back to node list可以顺次添加其他节点。
下面是一个添加好的OpenStack HA环境示例(3 Controller + 2 Compute):

这里要注意,因为我们要启用嵌套虚拟化,所以确保Compute节点是把Host CPU Configuration下发了的那台。
添加完三个OpenStack Controller节点和一个OpenStack Compute节点后,就可以点击Deploy Changes开始部署了。整个部署的过程至少需要1个小时,取决于机器配置和磁盘读写快慢。
部署完毕后,Fuel会弹出提示信息,并给出可访问OpenStack HA Horizon界面的URL。
准备Contrail部署节点
在OpenStack HA节点部署的同时,我们可以准备好Contrail部署节点。
同样创建出一个新的OpenStack HA部署环境,记住我们不能在已有的OpenStack HA环境里添加节点机,因为那样部署出来的节点机都会带上OpenStack的一些包,我们需要一个纯净的Ubuntu环境进行Contrail组件的配置。
同样添加3个Compute节点,进行同样的网络配置,添加完节点后,Deploy Changes按钮是不能被点下的,因为我们的环境里没有OpenStack Controller. 一个环境示例如下:

我们需要登录到Fuel Controller的终端,就是10.20.0.2那台机器(用户名root,密码r00tme),手动对添加的三个Contrail节点进行provision:
# fuel --env <ENVIRONMENT_ID> node --list
# fuel node --node-id <NODE1_ID>,<NODE2_ID>,<NODE3_ID> --env-id <ENVIRONMENT_ID> --provision
如何得到当前的ENVIRONMENT_ID, 下面提供了一个例子:
[root@fuel ~]# fuel --env environment
id | status | name | mode | release_id | changes | pending_release_id
---|-------------|-----------------------------------|------------|------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------
36 | operational | JunoOpenStack | multinode | 2 | []
[root@fuel ~]# fuel --env 36 node --list
id | status | name | cluster | ip | mac | roles | pending_roles | online | group_id
---|--------|------------------|---------|-----------|-------------------|------------|---------------|--------|---------
3 | ready | Untitled (e5:f2) | 36 | 10.20.0.3 | da:98:96:c5:c3:4b | compute | | False | 36
4 | ready | Untitled (71:15) | 36 | 10.20.0.4 | 1a:ff:37:1f:26:44 | controller | | False | 36
[root@fuel ~]# fuel node --node-id 3 --env-id 36 --provision2
同样需要大约30分钟时间用来在三台Contrail Controller的节点机上部署完可用的Ubuntu系统,部署完毕后,node界面上可以看到绿色的小字"ubuntu installed”.
这一节我们通过Fuel部署完毕OpenStack HA, 并准备了用于后续部署OpenContrail的三台Contrail Controller节点。接下来我们可以进入到OpenStack和OpenContrail的集成了。
Apr 27, 2015
Technology在OpenStack HA部署好的基础上集成OpenContrail是一个比较繁琐的过程,所以这一节里我们主要做集成前的准备工作,准备网络拓扑和创建好OpenContrail本地部署仓库。
网络规划
在Miranti提供的集成参考里,有如下的图,定义了整个环境的网络拓扑。

从图中可以看到各个节点所接入到的物理网络。我们根据这些节点接入网络的不同,来定义对应系统上的网络配置。
在安装完毕后的虚拟机里,可以看到该节点的DNS名称,例如node-19, node-20之类,在Fuel Controller上可以通过ssh root@node-19来登入相应角色的机器上。
以下是三个OpenStack节点的网络部署, N/A代表不需要配置,可以直接把对应的接口文件删除:
对应的接口分别是从eth0 ~ eth4.
OS1: node-19, PXE:10.20.0.14, Public: 172.16.0.6, Management: 10.55.55.6, Storage: 10.66.66.5, Private: N/A.
OS2: node-20, PXE:10.20.0.15, Public: 172.16.0.7, Management: 10.55.55.7, Storage: 10.66.66.6, Private: N/A.
OS3: node-22, PXE:10.20.0.16, Public: 172.16.0.8, Management: 10.55.55.8, Storage: 10.66.66.7, Private: N/A.
Compute: node-18, PXE: 10.20.0.13, Public: 172.16.0.5, Management: 10.55.55.5, Storage: 10.66.66.4, Private: N/A.
Contrail1: node-24, PXE: 10.20.0.10, Public: N/A, Management: N/A, Storage: N/A, Private: 10.77.77.10
Contrail2: node-21, PXE: 10.20.0.11, Public: N/A, Management: N/A, Storage: N/A, Private: 10.77.77.11
Contrail3: node-23, PXE: 10.20.0.12, Public: N/A, Management: N/A, Storage: N/A, Private: 10.77.77.12
OpenStack和Compute各个节点的配置是自动配置好的,Contrail节点上的Private节点则需要手动配置,具体步骤如下:
root@node-24:~# vim /etc/network/interfaces.d/ifcfg-eth4
auto eth4
iface eth4 inet static
address 10.77.77.10
netmask 255.255.255.0
gateway 10.77.77.1
post-up ethtool -K eth4 gso off gro off || true
删除三个Contrail Controller节点上的未用端口, 并重启后得到我们要的配置:
root@node-24:~# rm -f /etc/network/interfaces.d/ifcfg-eth3
root@node-24:~# rm -f /etc/network/interfaces.d/ifcfg-eth2
root@node-24:~# rm -f /etc/network/interfaces.d/ifcfg-eth1
到这里,我们节点机的网络单机就配置完毕了。
网间互通
我们需要让Management网络和Private网络可以通过某种途径互相连通,这里为了部署的方便,直接在主机(Host机器)上用iptables加上以下规则:
# iptables -D FORWARD -i virbr5 -j REJECT --reject-with icmp-port-unreachable
# iptables -D FORWARD -o virbr5 -j REJECT --reject-with icmp-port-unreachable
# iptables -D FORWARD -o virbr3 -j REJECT --reject-with icmp-port-unreachable
# iptables -D FORWARD -i virbr3 -j REJECT --reject-with icmp-port-unreachable
# iptables -t nat -A POSTROUTING -s 10.55.55.0/24 -d 10.77.77.0/24 -j MASQUERADE
# iptables -t nat -A POSTROUTING -s 10.77.77.0/24 -d 10.55.55.0/24 -j MASQUERADE
值得注意的是,virbr5和virbr3就是10.55.55.0/24和10.77.77.0/24所附属的网口,具体可以在Virt-Manager的配置菜单里看到。
添加完毕后,在OpenStack的节点(OS1,OS2,OS3)ping Private网络里的地址,如ping 10.77.77.10, 确保可以ping通;在Contrail Controller的节点(Contrail1, Contrail2, Contrail3)上ping Management网络里的地址,如10.55.55.6,确保可以ping通。
集成OpenContrail的一个先决条件是Private网络和Management网络可以互通。
OpenContrail安装仓库准备
我们在Fuel Controller上建立OpenContrail的安装仓库,这样有利于快速部署, 具体的操作是从Juniper官方提供的deb包里释出OpenContrail安装所需要的包,形成一个本地仓库。具体步骤如下:
# yum -y install dpkg-devel
# cd ~/Deb
# mkdir -p /var/www/nailgun/contrail
# mv /root/contrail-install-packages_2.0-22~icehouse_all.deb ./
# ar vx contrail-install-packages_2.0-22~icehouse_all.deb
# rm -f contrail-install-packages_2.0-22~icehouse_all.deb
# tar xf data.tar.gz
# tar xf opt/contrail/contrail_packages/contrail_debs.tgz -C /var/www/nailgun/contrail
# cd /var/www/nailgun/contrail
# dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz
# rm -rf ~/Deb
这时候如果在本机上访问
http://10.20.0.2:8080/contrail/
就可以看到整个仓库的包列表及详情。这个仓库将在后面部署Contrail时被用到。
Apr 27, 2015
Technology前面已经准备好了集成OpenContrail的所有事宜,接下来就是真正部署OpenContrail的过程了。部署OpenContrail需要修改所有的Contrail Controller节点,OpenStack Controller节点, OpenStack Compute节点,为了避免混淆,本节主要完成在Contrail Controller上的部署工作。
OpenStack Controller节点部署后配置
在所有的OpenStack Controller节点(OS1,OS2,OS3)上,打开/usr/lib/ocf/resource.d/mirantis/ns_haproxy文件,编辑以下字段:
OCF_Parameters部分:
OCF_RESKEY_private_network_default="10.55.55.0/24"
OCF_RESKEY_private_network_gateway_default="10.55.55.1"
在meta_data()函数中,添加以下内容:
<parameter name="private_network">
<longdesc lang="en">
Private L3 network that should be configured inside the namespace
</longdesc>
<shortdesc lang="en">Namespace private network</shortdesc>
<content type="string" default="${OCF_RESKEY_private_network_default}" />
</parameter>
<parameter name="private_network_gateway">
<longdesc lang="en">
Private L3 network gateway that should be configured inside the namespace.
</longdesc>
<shortdesc lang="en">Namespace private gateway network</shortdesc>
<content type="string" default="${OCF_RESKEY_private_network_gateway_default}" />
</parameter>
set_ns_routing()函数中,添加一下内容:
nsip route list | grep -q "${OCF_RESKEY_private_network}"
if [ $? -gt 0 ]; then
ocf_log debug "Creating ${OCF_RESKEY_private_network} route inside the namespace"
ocf_run nsip route add "${OCF_RESKEY_private_network}" via "${OCF_RESKEY_private_network_gateway}"
fi
以上的修改是为了引入haproxy的namespace的。
配置Contrail部署节点
我们引入了三个Contrail Controller节点,从中挑选一个,作为部署的管理节点,OpenContrail通过fabric下发安装指令给各节点机,因此我们首先要准备的是部署节点。这里的例子中,我们选择Contrail1(10.20.0.10)作为部署节点。
# echo 'deb http://10.20.0.2:8080/contrail/ /' > /etc/apt/sources.list.d/contrail.list
# echo -e "Package: *\nPin: release l=Ubuntu\nPin-Priority: 100" > /etc/apt/preferences
# >/etc/apt/sources.list
# apt-get update
# apt-get install -y python-paramiko contrail-fabric-utils contrail-setup
# pip install --upgrade --no-deps --index-url=”” /opt/contrail/python_packages/Fabric-1.7.0.tar.gz
apt-get udpate前我们需要清空本机上的sources.list文件,因为经过前两步后,本机的sources.list中会加上10.20.0.2的默认源,这会引发update失败,因此我们清空此文件。
安装完一些准备包后,部署节点进入就绪状态。
编写testbed.py
testbed.py文件定义了整个OpenContrail的组建部署节点信息,在编写此文件前,我们需要得到以下信息:
A. OpenStack的Service_Token, 在任何一台OpenStack Controller机器上,运行以下命令以得到系统当前的service_token值:
root@node-20:~# cat /etc/keystone/keystone.conf | grep -i "admin_token=" | more
#admin_token=ADMIN
admin_token=rVlaAKUs
记下rVlaAKUs这个值,在testbed.py文件中我们会用到。
B. OpenStack Controller的Public vip和Management vip, 如下所示,结合我们的网络规划,Public vip是172网段,而Management vip则是10.55.55网段的IP:
root@node-20:~# source /root/openrc
root@node-20:~# keystone endpoint-list | grep 5000
| 0e3c0684e8ae4c9fa4e080c9e1c66513 | RegionOne | http://172.16.0.4:5000/v2.0 | http://10.55.55.4:5000/v2.0 | http://10.55.55.4:35357/v2.0 | f822df80ee1042d9b10d57118bb410aa |
C. Contrail Controller的内部vip和外部vip, 因为我们把Contrail Controller的Private IP分配在10.77.77.0/24网段,所以我们暂时选用10.77.77.9作为两个vip的地址。
D. 如果有外部路由器,则需要配置外部路由器的IP地址。这次的部署中我们不采用外部路由器,因而对比于官方的推荐配置文件,我们的testbed.py中删除了这一部分。
综合考虑到上述因素后,我们的testbed.py文件定义如下:
root@node-24:~# vim /opt/contrail/utils/fabfile/testbeds/testbed.py|more
from fabric.api import env
#Management ip addresses of hosts in the cluster
os_ctrl01 = 'root@10.55.55.6'
os_ctrl02 = 'root@10.55.55.7'
os_ctrl03 = 'root@10.55.55.8'
c_ctrl01 = 'root@10.77.77.10'
c_ctrl02 = 'root@10.77.77.11'
c_ctrl03 = 'root@10.77.77.12'
c_db01 = 'root@10.77.77.10'
c_db02 = 'root@10.77.77.11'
c_db03 = 'root@10.77.77.12'
#External routers
# ext_routers = [('gateway01', '<Gateway_node1_LOOPBACK_ip>'), ('gateway02', '<Gateway_node2_LOOPBACK_ip>')]
#Autonomous system number
router_asn = 64512
#Host from which the fab commands are triggered to install and provision
deploy_node = 'root@10.77.77.10'
#Role definition of the hosts.
env.roledefs = {
'all': [c_ctrl01, c_ctrl02, c_ctrl03, c_db01, c_db02, c_db03],
'cfgm': [c_ctrl01, c_ctrl02, c_ctrl03],
'openstack': [os_ctrl01, os_ctrl02, os_ctrl03],
'control': [c_ctrl01, c_ctrl02, c_ctrl03],
'compute': [],
'collector': [c_ctrl01, c_ctrl02, c_ctrl03],
'webui': [c_ctrl01, c_ctrl02, c_ctrl03],
'database': [c_db01, c_db02, c_db03],
'build': [deploy_node],
'storage-master': [],
'storage-compute': [],
}
#Openstack admin password
env.openstack_admin_password = 'admin'
env.password = 'r00tme'
#Passwords of each host
env.passwords = {
os_ctrl01: 'r00tme',
os_ctrl02: 'r00tme',
os_ctrl03: 'r00tme',
c_ctrl01: 'r00tme',
c_ctrl02: 'r00tme',
c_ctrl03: 'r00tme',
c_db01: 'r00tme',
c_db02: 'r00tme',
c_db03: 'r00tme',
deploy_node: 'r00tme',
}
#For reimage purpose
env.ostypes = {
os_ctrl01: 'ubuntu',
os_ctrl02: 'ubuntu',
os_ctrl03: 'ubuntu',
c_ctrl01: 'ubuntu',
c_ctrl02: 'ubuntu',
c_ctrl03: 'ubuntu',
c_db01: 'ubuntu',
c_db02: 'ubuntu',
c_db03: 'ubuntu',
deploy_node: 'ubuntu',
}
env.openstack = {
'service_token' : 'rVlaAKUs'
}
env.ha = {
'internal_vip': '10.55.55.4',
'external_vip': '172.16.0.4',
'contrail_internal_vip': '10.77.77.9',
'contrail_external_vip': '10.77.77.9',
}
env.keystone = {
'service_tenant': 'services',
'admin_token': 'rVlaAKUs',
}
multi_tenancy = True
编写完testbed.py文件后,就可以根据文件中的定义,部署OpenContrail的组件到多台节点主机了。
Fuel Controller节点上的id_rsa文件可以实现对各个节点的无密码登录,拷贝它到我们的Contrail部署节点上:
# scp 10.20.0.2:/root/.ssh/id_rsa /root/.ssh/id_rsa
# chmod 0600 /root/.ssh/id_rsa
部署多节点
首先切换到/opt/contrail/utils目录下,所有用fab执行的部署都需要在这个目录下执行。执行以下操作, 以初始化各部署子节点:
# cd /opt/contrail/utils
# fab -P -R control -w -- "ls /etc/apt/sources.list.d/contrail.list || echo 'deb \
http://10.20.0.2:8080/contrail/ /' > \
/etc/apt/sources.list.d/contrail.list"
# fab -P -R control -w -- 'ls /etc/apt/preferences || echo -e "Package: *\nPin: release \
l=Ubuntu\nPin-Priority: 100" > /etc/apt/preferences'
# fab -P -R control -w -- 'DEBIAN_FRONTEND=noninteractive apt-get -y --force-yes \
--allow-unauthenticated install python-crypto python-netaddr python-paramiko \
contrail-fabric-utils contrail-setup'
# fab -P -R control -w -- 'pip install --upgrade --no-deps --index-url="" \
/opt/contrail/python_packages/ecdsa-0.10.tar.gz'
# fab -P -R control -w -- 'pip install --upgrade --no-deps --index-url="" \
/opt/contrail/python_packages/Fabric-1.7.0.tar.gz'
如果出现apt-get update的问题,可以如上面提到的,手动登录到各个节点上去清空/etc/apt/sources.list文件,当然一般情况下不会出现这个问题。
运行以下命令,接受sun的协议:
# fab -P -R control -w -- 'echo "sun-java6-plugin shared/accepted-sun-dlj-v1-1 boolean \
true" | /usr/bin/debconf-set-selections' && fab -P -R control -w -- 'echo "sun-java6-bin shared/accepted-sun-dlj-v1-1 boolean \
true" | /usr/bin/debconf-set-selections' && fab -P -R control -w -- 'echo "debconf shared/accepted-oracle-license-v1-1 select \
true" | sudo debconf-set-selections' && fab -P -R control -w -- 'echo "debconf shared/accepted-oracle-license-v1-1 seen \
true" | sudo debconf-set-selections'
OpenContrail组件依赖于特定版本的tzdata, 用以下命令安装:
# fab -P -R control -w -- 'DEBIAN_FRONTEND=noninteractive apt-get -y --force-yes \
--allow-unauthenticated install tzdata=2014e-0ubuntu0.12.04'
安装和设置database, 并检查节点的状态:
# fab install_database && fab setup_database
# fab -R database -w -- "contrail-status"
# nodetool status
-- Address Load Tokens Owns Host ID Rack
UN 10.77.77.12 141.84 MB 256 33.3% 4ea3abec-16ee-417a-b78c-69e8dca292be rack1
UN 10.77.77.11 141.33 MB 256 35.8% d7677bf2-1447-48af-b1d4-356b4a8d6cff rack1
UN 10.77.77.10 134.28 MB 256 30.9% e418e4ef-af22-4874-ad94-777d6b4c511c rack1
当看到上面有三个条目时,代表安装成功,可以进行下一步。
安装cfgm, control, collector, webui 组件以及keepalived集群。
# fab install_cfgm && fab install_control && fab install_collector && fab install_webui && fab setup_contrail_keepalived && fab fixup_restart_haproxy_in_collector 2>&1 | tee all.txt
删除掉/etc/keepalived/keepalived.conf里的EXTERNAL部分, 值得注意的是,在三个Contrail Controller上,都需要执行此操作:
# vim /etc/keepalived/keepalived.conf
......remove something......
删除以后,重新启动keepalived服务:
# fab -P -R control -w -- 'service keepalived restart'
更新haproxy的配置文件,添加WebUI的虚拟IP地址(vip). 值得注意的是,在三个Contrail Controller上,都需要执行此操作:
# vim /etc/haproxy/haproxy.cfg
#contrail-webui-marker-start
frontend contrail-webui-api *:443
mode tcp
default_backend contrail-webui-api
backend contrail-webui-api
mode tcp
balance roundrobin
option nolinger
stick on src
stick-table type ip size 200k expire 300m
option tcp-check
tcp-check connect port 8143
default-server error-limit 1 on-error mark-down
server 10.77.77.10 10.77.77.10:8143 check inter 2000 rise 2 fall 3
server 10.77.77.11 10.77.77.11:8143 check inter 2000 rise 2 fall 3
server 10.77.77.12 10.77.77.12:8143 check inter 2000 rise 2 fall 3
#contrail-webui-marker-end
更改完以后,重启haproxy服务:
# fab -P -R control -w -- 'service haproxy restart'
更改每个节点上的tenant服务名称,从’service'改成’services’:
# fab -P -R control -w -- "sed -i '49s/service/services/g' \
/usr/local/lib/python2.7/dist-packages/contrail_provisioning/config/quantum_in_keystone_setup.py"
配置cfgm服务:
# fab setup_cfgm
这时我们可以验证neutron endpoint是否被正确安装,在任何一个OpenStack Controller节点上,运行以下命令:
# keystone service-list
# keystone endpoint-list
例如:
root@node-20:~# keystone service-list | grep neutron
| 2f4c887f68a9428aa448cbd688d7061f | neutron | network | network |
root@node-20:~# keystone endpoint-list | grep 2f4c887f68a9428aa448cbd688d7061f
| 7dd2c25e69ad4a3296f272aa253001c8 | RegionOne | http://10.77.77.9:9696 | http://10.77.77.9:9696 | http://10.77.77.9:9696 | 2f4c887f68a9428aa448cbd688d7061f |
成功的话,接着下一步设置,删除所有的Contrail Controller节点上文件/etc/haproxy/haproxy.cfg里的rabbit字段:
# vim /etc/haproxy/haproxy.cfg
......remove something......
重新启动haproxy服务:
# fab -P -R control -w -- 'service haproxy restart'
设置control,collector,webui组件服务:
# fab setup_control
# fab setup_collector && fab setup_webui
在任一OpenStack Controller节点上,运行以下命令,得到rabbit的密码:
root@node-22:~# cat /etc/rabbitmq/rabbitmq.config | grep default_pass
{default_pass, <<"gYFQP10P">>},
配置neutron插件,使用运行在OpenStack Controller上的rabbit 集群, 这里的rabbit_password使用上面得到的值:
# fab -P -R control -w -- 'openstack-config --del /etc/neutron/neutron.conf DEFAULT rabbit_host'
# fab -P -R control -w -- 'openstack-config --set /etc/neutron/neutron.conf DEFAULT rabbit_hosts \
10.55.55.6:5673,10.55.55.7:5673,10.55.55.8:5673'
# fab -P -R control -w -- 'openstack-config --set /etc/neutron/neutron.conf DEFAULT rabbit_userid \
nova'
# fab -P -R control -w -- 'openstack-config --set /etc/neutron/neutron.conf DEFAULT \
rabbit_password gYFQP10P'
# fab -P -R control -w -- 'service neutron-server restart'
配置contrail-api以使用运行在OpenStack Controller上的rabbit集群:
# fab -P -R control -w -- 'perl -pi -e \
"s/rabbit_server.*$/rabbit_server=10.55.55.4/" /etc/contrail/contrail-api.conf'
# fab -P -R control -w -- 'perl -pi -e "s/rabbit_port.*$/rabbit_port=5672/" \
/etc/contrail/contrail-api.conf'
# fab -R control -w -- "perl -pi -e 'print \"rabbit_password=gYFQP10P\n\" \
if \$_ =~ rabbit_port' /etc/contrail/contrail-api.conf"
# fab -P -R control -w -- "perl -pi -e 'print \"rabbit_user=nova\n\" if \$_ =~ rabbit_port' \
/etc/contrail/contrail-api.conf"
# fab -P -R control -w -- "service contrail-api restart"
使用前面下载的OpenContrail 插件,作为neutron挂载的插件, 或者你可以直接从github克隆下来:
# mkdir -p /tmp/contrail-repo
# apt-get install -y git
# git clone https://github.com/Juniper/contrail-neutron-plugin.git /tmp/contrail-repo
# cd /tmp/contrail-repo
# git checkout 3189155
# cp -r /tmp/contrail-repo/neutron_plugin_contrail/plugins/opencontrail \
/usr/share/pyshared/neutron_plugin_contrail/plugins/
重新启动neutron-service:
# cd /opt/contrail/utils
# fab -P -R cfgm -w -- 'service neutron-server restart'
设置Contrail Controller之间的BGP节点发现,metadata服务及encapsulation类型:
# fab prov_control_bgp && fab prov_metadata_services && fab prov_encap_type
用以下命令验证安装是否成功:
# fab verify_cfgm
# fab verify_control
# fab verify_collector
# fab verify_webui
# fab -R control -w -- "contrail-status"
更新rc.d,这样在启动的时候,不会启动supervisor-support进程:
# fab -P -R control -w -- 'update-rc.d supervisor-support-service disable'
用浏览器访问以下页面,以确认Contrail已经被正确安装:
https://10.77.77.9
此时你看到的页面应该如下:

本章过完以后,我们的OpenContrail部署已经完成了大半,接下来就是在Compute和OpenStack Controller节点上的配置,达到最后的集成过程。
Apr 27, 2015
Technology本节主要用于配置OpenStack使用OpenContrail作为其网络配置器,主要涉及到OpenStack Controller和OpenStack Compute上的配置.
OpenStack Controller配置
!!! 以下的所有操作,需要在每个OpenStack Controller节点上进行!!!
OpenStack Controller不需要使用Private 网络,所以我们可以删除ifcfg-eth0文件:
# rm -f /etc/network/interface.d/ifcfg-eth4
# service networking restart
为了保险,最好重启更改完网络后的节点。
配置/etc/nova/nova.conf文件中的以下字段:
# vim /etc/nova/nova.conf
[DEFAULT]
network_api_class = nova.network.neutronv2.api.API
neutron_url = http://10.77.77.9:9696
neutron_admin_tenant_name = services
neutron_admin_username = neutron
neutron_admin_password = rVlaAKUs
neutron_url_timeout = 300
neutron_admin_auth_url = http://10.55.55.4:35357/v2.0/
firewall_driver = nova.virt.firewall.NoopFirewallDriver
enabled_apis = ec2,osapi_compute,metadata
security_group_api = neutron
service_neutron_metadata_proxy = True
neutron_admin_password的值还是我们以前取得的admin token.
更改完上述配置后,重启以下服务:
# service nova-api restart
# service nova-scheduler restart
# service nova-conductor restart
在任一OpenStack Controller节点上,使用以下命令,在数据库中删除nova-network服务的定义。
# source ~/openrc
# for i in $(nova service-list|grep nova-network|awk '{print $2}'); \
do nova service-delete $i;done
Compute(计算)节点配置
!!! 以下操作,都应该在每个计算节点上运行 !!!!
在每个计算节点上,配置仓库:
# echo 'deb http://10.20.0.2:8080/contrail/ /' >/etc/apt/sources.list.d/contrail.list
# echo -e "Package: *\nPin: release l=Ubuntu\nPin-Priority: 100" > /etc/apt/preferences
# >/etc/apt/sources.list
# apt-get update
Contrail是不需要OpenVSwitch(OVS)的,所以我们要把它删除:
# apt-get purge -y openvswitch-common openvswitch-datapath-lts-saucy-dkms \
openvswitch-switch nova-network nova-api
验证openvswitch是否被彻底删除(应该输出空行才对):
# aptitude search -F '%p' '~i' | grep openvswitch
删除OVS的内核模块:
# lsmod | grep openvswitch && rmmod openvswitch
移除virbr0端口:
# virsh net-destroy default
# virsh net-undefine default
确保在所有节点的/etc/network/interface.d/下,只包括了ifcfg-eth0, ifcfg-eth4, 其他都需要被删除。
重启所有OpenStack Compute节点,以删除所有openvswitch和nova-network相关的iptables规则、接口等。
# reboot
重启以后,以下面的命令确保没有NAT规则存在:
# iptables -L -t nat
在所有的Compute节点上,安装Contrail vrouter 组件:
# apt-get install -y contrail-openstack-vrouter
所有节点上,配置vhost0和ifcfg-eth4:
root@node-18:~# vim /etc/network/interfaces.d/ifcfg-vhost0
auto vhost0
iface vhost0 inet static
netmask 255.255.255.0
network_name application
address 10.77.77.15
gateway 10.77.77.1
mtu 1300
root@node-18:~# vim /etc/network/interfaces.d/ifcfg-eth4
auto eth4
iface eth4 inet manual
up ip l set eth4 up
down ip l set eth4 down
post-up ethtool -K eth4 gso off gro off || true
创建agent_param文件:
# mv /etc/contrail/agent_param.tmpl /etc/contrail/agent_param
# vim /etc/contrail/agent_param
dev=eth4
设置vroute-agent配置:
# vim /etc/contrail/contrail-vrouter-agent.conf
[DEFAULT]
headless_mode=true
[DISCOVERY]
server=10.77.77.9
max_control_nodes=2
[HYPERVISOR]
type=kvm
[NETWORKS]
control_network_ip=10.77.77.15
[VIRTUAL-HOST-INTERFACE]
name=vhost0
ip=10.77.77.15/24
gateway=10.77.77.1
physical_interface=eth4
在每个OpenStack Compute节点上,配置:
# vim /etc/contrail/vrouter_nodemgr_param
DISCOVERY=10.77.77.9
配置nova-compute:
# openstack-config --set /etc/nova/nova.conf DEFAULT neutron_url http://10.77.77.9:9696
# openstack-config --set /etc/nova/nova.conf DEFAULT neutron_admin_auth_url http://10.55.55.4:35357/v2.0/
# openstack-config --set /etc/nova/nova.conf DEFAULT network_api_class nova_contrail_vif.contrailvif.ContrailNetworkAPI
# openstack-config --set /etc/nova/nova.conf DEFAULT neutron_admin_tenant_name services
# openstack-config --set /etc/nova/nova.conf DEFAULT neutron_admin_username neutron
# openstack-config --set /etc/nova/nova.conf DEFAULT neutron_admin_password rVlaAKUs
# openstack-config --set /etc/nova/nova.conf DEFAULT neutron_url_timeout 300
# openstack-config --set /etc/nova/nova.conf DEFAULT firewall_driver nova.virt.firewall.NoopFirewallDriver
# openstack-config --set /etc/nova/nova.conf DEFAULT security_group_api neutron
# service supervisor-vrouter restart
验证所有的vrouter服务都是active状态的:
root@node-18:~# contrail-status
== Contrail vRouter ==
supervisor-vrouter: active
contrail-vrouter-agent active
contrail-vrouter-nodemgr active
更改/etc/libvirt/qemu.confg中的cgroup_device_acl部分:
cgroup_device_acl = [
"/dev/null", "/dev/full", "/dev/zero",
"/dev/random", "/dev/urandom",
"/dev/ptmx", "/dev/kvm", "/dev/kqemu",
"/dev/rtc", "/dev/hpet","/dev/net/tun",
]
在每个OpenStack Compute节点上,添加iptables规则如下并保存:
# iptables -I INPUT 1 -s 169.254.0.0/16 -i vhost0 -j ACCEPT -m comment --comment "metadata service"
# iptables -I INPUT 1 -p tcp -m multiport --destination-ports 2049,8085,9090,8102,33617,39704,44177,55970,60663 -j ACCEPT -m comment --comment "juniper contrail rules"
# iptables-save > /etc/iptables/rules.v4
重启libvirt-bin和nova-compute服务:
# service libvirt-bin restart
# service nova-compute restart
更改vrouter的配置, !!!注意,这是在Contrail Deploy的那个节点运行的!!!! :
# python /opt/contrail/utils/provision_vrouter.py --host_name node-18 --host_ip 10.77.77.15 --api_server_ip 10.77.77.9 --admin_user neutron --admin_password rVlaAKUs --admin_tenant_name services --oper add
VGW配置
OpenContrail支持多种配置,例如Juniper vSRX, Juniper MX, Cisco ASR等,但这些都需要专有硬件的支持(路由器),我们仅仅采用软件路由器Vrouter, 这里我们配置VGW:
# export PYTHONPATH=/usr/lib/python2.7/dist-packages/contrail_vrouter_api/gen_py/instance_service
# python /opt/contrail/utils/provision_vgw_interface.py --oper create --interface vgw --subnets 10.88.88.0/24 --routes 0.0.0.0/0 --vrf default-domain:admin:ext:ext
更新/etc/contrail/contrail-vrouter-agent.con中的[GATEWAY-0]部分:
[GATEWAY-0]
routing_instance=default-domain:admin:ext:ext
interface=vgw
ip_blocks=10.88.88.0/24
routes=0.0.0.0/0
重新启动supervisor-vrouter进程:
# service supervisor-vrouter restart
重启其他所有的encapsulation方法,除了MPLS On UPD:

好了,这时候,Contrail已经集成到OpenStack环境里,你可以在Contrail的界面里,添加上网络,而后在OpenStack里使用它。Enjoy it !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Apr 22, 2015
Technology最近在做OpenContrail的解耦合操作,因为官方提供的OpenContrail一键安装包里诸多组件都是用的默认的推荐,通过解耦合可以做到更灵活的安装和配置,有利于更方便的部署和后续的维护。所以这一系列文章是关于如何用Fuel在部署完OpenStack的基础上完成OpenContrail的部署。
先决条件
先决条件主要是用于准备用于部署的硬件环境和软件包。
硬件环境:
i5-4460(3.2GHz/4核/6M三级缓存), 32G 内存。
系统:
Ubuntu 14.04 LTS
软件:
$ sudo apt-get install libvirtd virt-manager
从Miranti网站下载: MirantisOpenStack-6.0.iso
从Contrail网站下载: contrail-install-packages_2.0-22~icehouse_all.deb
contrail-neutron-plugin仓库:
git clone https://github.com/Juniper/contrail-neutron-plugin.git
CPU/内存/磁盘规划
需要构建一共8台虚拟机用于在部署好的Mirantis OpenStack上集成OpenContrail. CPU/内存/磁盘规划如下:
1台Mirantis Fuel控制节点机,2核,划分3G内存, 100G磁盘。
3个OpenStack Controller节点, 2核,各划分3G内存, 100G磁盘。
1个OpenStack Compute节点,2核(嵌套虚拟化),划分3G内存, 100G磁盘。
3个OpenContrail节点,2核,各划分4G内存, 100G磁盘。
一共需要27G内存。磁盘格式为qcow2,实际占用远小于这个数,各个节点最大也就是在5G左右大小。
其中,关于嵌套虚拟化的CPU设置,如下图, 记得选择Copy host CPU Configuration:

启用嵌套虚拟化需要在BIOS设置,并添加相应的内核模块。
网络规划
Fuel OpenStack规划了5个网络,分别是:
Admin(PXE)
Public
Management
Storage
Private
我们在Virt-Manager里也同样创建出这样的五个子网:
Admin(PXE) – FuelNAT – 10.20.0.0/24
Public – FuelPublic – 172.16.0.0/24
Management – FuelMgmt – 10.55.55.0/24
Storage – FuelStorage – 10.66.66.0/24
Private – FuelPrivate – 10.77.77.0/24
创建网络的步骤如下,双击Virtual Machine Manager里的localhost(QEMU), 弹出下面的窗口:

点击网络列表最下面的+号,弹出创建网络的窗口:

命名该网络,点击下一步:

禁用DHCP:

选择isolated网络模式:

接着点击下一步直到完成,这样我们的网络就创建好了。
用上面的方法创建出以上5个子网。
各个节点网络配置
Miranti Fuel Node: 仅FuelNAT, 安装完毕后,自动指定地址为10.20.0.2.
其他所有节点机,在创建时,把五个网络都添加上,添加方法如下:
Details -> Add Hardware -> Network, 而后选择:

Miranti Fuel Node安装
安装很简单,直接用下载的MirantisOpenStack-6.0.iso作为安装光盘,在创建出来的虚拟机里安装系统。安装完毕后,在Host机器的浏览器里访问
http://10.20.0.2:8000
输入用户名密码都为admin后,登录,可以看到以下界面:

在这个界面里我们可以进行OpenStack环境的准备、部署、配置、销毁等操作。
到这一步,我们已经完成了Miranti Fuel Node的安装,基本的部署准备工作已经完成,接下来我们将使用Fuel来部署一个可用的OpenStack环境, 以及三台用于部署Contrail的节点机.