说明:因为个人兴趣,对openstack有浓厚的兴趣。在网上无意间看到了docker所以突发奇想做了这个实验。现拿出来给大家分享。此文只适合参考,不可直接使用到生产环境。因为里面有很多的系统漏洞,可能会被***利用。本文只用于大家学习研究,为大家降低docker与openstack结合的门槛,也降低了硬件门槛,提供一些广阔的思路。

此文在两个QQ群和百度文库中有过分享。文中也有借鉴一些网络的资料,在这里一并感谢那些前辈的资料和思路。因为不知道名字只能一起统称了!



openstack-kilo版本基于docker的云计算

 

 

 

 

目录

简介... 2

第一章、环境搭建... 2

第二章、创建openstack控制组件... 5

一、openstack镜像制作:... 5

二、创建mysql数据库镜像:... 6

三、创建rabbitmq-server镜像... 6

四、创建openstack-keystone镜像... 7

五、创建glance组件镜像... 8

六、nova计算节点和nova控制节点安装... 9

七、创建网页管理界面... 10

第三章、更改nova computer配置,使用docker启动实例。... 10

nova-docker使用注意事项:... 11

报错日志处理:... 11

第四章、排错和使用举例... 12

 

 

 

 

 

 

 

 

 

 

 

 

 

简介

说明:本文介绍使用docker作为openstack-kilo组件的容器进行安装。并且使用docker服务作为计算节点的虚拟机来启动实例。这样做有几个好处:

1、kilo组件除计算节点以外的关键组件都被放在了docker容器中,在云计算组件需要升级和补丁修复的时候可以无缝的进行切换。把升级完的镜像启动一个容器即可,如果升级失败只需要把新的容器停掉。如果成功只用把老版本的容器停掉。

2、节省资源,在本文中所有的openstack组件都启动在一台虚拟机中。虚拟机1G内存,1CPU。有了docker的帮助让很多没有硬件的人也可以玩上openstack的分布式部署充分了解openstack各个组件间的协作关系。

 

PS:因为没有DNS服务器,所以所有配置文件中的主机名称都要替换成相应的IP地址。在生产环境中如果使用这种方式强烈建议配置DNS服务器,然后在配置文件中使用主机名。这样在自动故障恢复的时候更加智能化。

第一章、环境搭建

物理环境使用两台物理主机,一台交换机分配两个网段。分别是192.168.1.1/24172.10.10.1/24172.10.10.1/24作为管理网段,192.168.1.1/24作为模拟公网网段。另外实例之间使用10.1.1.1/24作为实例分配网段。

另外为了管理方便,会为docker容器模拟openstack组件的服务器分配192.168.1.1172.10.10.1两个网段的地址。

首先需要在两台物理机上安装好docker服务,一台控制端上面使用docker模拟多台控制组件服务器,一台作为计算节点docker模拟openstack实例启动。

此处操作系统使用centos7作为基础,安装docker很简单使用yum install docker就安装好了。配置控制节点物理基础(注意:配置docker的步骤需要在基础镜像包之后再配置。):注意,其中有些内容需要***才能得到安装源和网页。请自备***

接下来是制作docker基础镜像:

启动systemctl start docker程序

首先获取一个镜像,docker pull centos 注意这获取方式需要***才能取得。

这样取得的镜像是没有ssh的,只是一个很基础的镜像包。接下来我们慢慢把带有ssh和一些基本工具的镜像包制作出来。

这里使用Dockerfile文件来创建镜像,编辑Dockerfile

FROM centos

MAINTAINERdenwrok@xxx.com   #这个可以没有。

COPY shadow/etc/shadow  #把自己基础系统的shadow文件复制到和Dokerfile相同的目录,不然你根本就ssh进去不了容器。用这个文件替换镜像中的文件,root密码就和你本机系统一样了。

ENV containerdocker

RUN yum update -y

RUN yum install -ypython-setuptools

RUN (cd/lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i ==systemd-tmpfiles-setup.service ] || rm -f $i; done); \

rm -f/lib/systemd/system/multi-user.target.wants/*;\

rm -f/etc/systemd/system/*.wants/*;\

rm -f/lib/systemd/system/local-fs.target.wants/*; \

rm -f/lib/systemd/system/sockets.target.wants/*udev*; \

rm -f/lib/systemd/system/sockets.target.wants/*initctl*; \

rm -f/lib/systemd/system/basic.target.wants/*;\

rm -f/lib/systemd/system/anaconda.target.wants/*;

RUN cp/usr/share/zoneinfo/Asia/Shanghai /etc/localtime

RUN yum install –yopenssh-server

RUN systemctlenable sshd

VOLUME["/sys/fs/cgroup"]

CMD["/usr/sbin/init"]

都准备好以后就可以使用 docker build -t="base:v1.2_ssh" . 命令创建镜像了。-t参数是新建镜像的名称和版本号,用冒号隔开,如果不写版本号默认名字交latest

Step 8 : EXPOSE 22

 ---> Using cache

 ---> 126b1779d925

Step 9 : CMD /usr/bin/supervisord-c /etc/supervisord.conf

 ---> Using cache

 ---> 8b0482f22d97

Successfully built8b0482f22d97

出现这些信息,最后一行表示成功了。

docker images可以查看到新建的镜像。

使用docker run –ti –name test1 base:v1.2_ssh/bin/bash可以查看是否能创建容器。如果能进入基本表示镜像可用。

接下来就使用脚本来创建一个可以和物理机网段相同的容器。

脚本 vi addhost.sh

#!/bin/bash

docker run --privileged=true-d --net=none --name $1 $2

sleep 5s

Cid=`docker ps -a| grep $1 |awk '{print $1}'`

pid=`dockerinspect -f '``.`State`.`Pid`' $Cid `

mkdir -p/var/run/netns

ln -s /proc/$pid/ns/net/var/run/netns/$pid

ip link add${pid}A1 type veth peer name ${pid}A2

brctl addif br0${pid}A1

ip link set${pid}A1 up

ip link set${pid}A2 netns $pid

ip netns exec $pidip link set dev ${pid}A2 name eth0

ip netns exec $pidip link set eth0 up

read -p"Please input container IP on eth0(172.0.0.1/24)" IPADDR

ip netns exec $pidip addr add $IPADDR dev eth0

echo "`echo$IPADDR | awk -F/ '{print $1}'`    $1" >> /etc/hosts

read -p "Doyou have any net interface?(Y/N)" CH

if ["$CH" = "Y" ]; then

ip link add${pid}B1 type veth peer name ${pid}B2

brctl addif br1${pid}B1

ip link set${pid}B1 up

ip link set${pid}B2 netns $pid

ip netns exec $pidip link set dev ${pid}B2 name eth1

ip netns exec $pidip link set eth1 up

read -p"Please input container IP on eth0(172.0.0.1/24)" IPADDR

ip netns exec $pidip addr add $IPADDR dev eth1

echo"$IPADDR   $1" >>/etc/hosts

fi

read -p"Please input container default gateway address." GATEWAY

ip netns exec $pidip route add default via $GATEWAY

 

有必要说一下使用方法,sh addhost.sh test1 bash_ssh:v1.1

第一个参数test1是容器的名称,第二个参数bash_ssh:v1.1是镜像的名称。脚本会指引输入网卡的IP地址和网关。默认网关只能有一个,最好是可以访问外网的那个网段的网关。当然不需要上外网的话当然可以随便。使用docker ps –a命令查看容器状态后就可以使用ssh 容器名称链接到容器了。如ssh test1

另外再给一个删除容器的脚本vi delhost.sh

#!/bin/bash

Cid=`docker ps -a| grep $1 |awk '{print $1}'`

pid=`dockerinspect -f '``.`State`.`Pid`' $Cid `

docker stop $1

docker rm $1

sed -i /$1/d/etc/hosts

rm -rf/var/run/netns/$pid

这里只有一个参数,就是传入容器名称如 sh delhost.sh test1

到此基础镜像就算制作完成了。

为了适应docker上安装openstack的物理环境,需要多docker进行一些配置。/etc/sysconfig/docker打开配置文件添加桥接端口OPTIONS='-b=br0'

为了方便管理桥接网卡为docker服务,需要安装bridge-utils包。

更改网络配置:

桥接口spacer.gif物理口spacer.gif

这里需要配置两个桥接网口br0br1分配桥接到两个物理网卡上。

PS 1:如果进入新建的容器后无法访问外网,请检查docker的配置和网卡是否开启混杂模式。

PS 2:容器的时间问题。因为openstack对时间比较敏感,所以需要在控制节点物理机中启用NTP服务。容器在启动的时候会使用主机的时间,另外计算节点物理机也需要和它进行同步。

下面将以此为基础分别创建openstack的其它组件。

Docker资料参考:http://dockerpool.com/static/books/docker_practice/index.html

 

第二章、创建openstack控制组件

说明:先说下网络规划,网段分配192.168.1.121-192.168.1.200172.10.10.121-172.10.10.200

注意:在某些时候国外的网站可能被墙,需要使用******后才能访问。网络问题请自行解决。

一、openstack镜像制作:

上面只是制作了centos的镜像包,下面将再制作一个openstack的镜像。创建一个Dockerfile

FROM base:v1.2_ssh

RUN yum install -yhttp://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm

RUN yum install -yhttps://repos.fedorapeople.org/repos/openstack/openstack-kilo/rdo-release-kilo-1.noarch.rpm

RUN yum upgrade -y

RUN yum install -y openstack-selinux

CMD ["/usr/sbin/init"]

运行docker build -t "openstack:base". 命令生成openstack的基本包。上面rpm包的地址和路径可能会与openstack官方文档中不一样,因为官方文档路径已经失效。如果报错请自行查找路径!

二、创建mysql数据库镜像:

创建一个给数据库使用的数据卷容器

docker run -d -v/data --name dbdata base:v1.2_ssh /bin/bash

mkdirdockerfile/openstack-db

cddockerfile/openstack-db

创建Dockerfile

FROMopenstack:base

RUN yum install -ymariadb mariadb-server MySQL-python

COPY mariadb_openstack.cnf/etc/my.cnf.d/

RUN systemctlenable mariadb

CMD["/usr/sbin/init"]

创建配置文件vi /etc/my.cnf.d/mariadb_openstack.cnf

[mysqld]

bind-address = 0.0.0.0

default-storage-engine= innodb

innodb_file_per_table

collation-server =utf8_general_ci

init-connect ='SET NAMES utf8'

character-set-server= utf8

运行docker build -t openstack:db . 命令制作DB镜像。

修改./addhost.shdocker run一行先注释一下,复制后添加

docker run --privileged=true-d --net=none --volumes-from dbdata --name $1 $2

然后使用./addhost.sh  test1 openstack:db命令创建一个容器,使用ssh链接上以后运行mysql_secure_installation ,根据提示操作。

修改vi /etc/my.cnf

datadir=/data

完成以后再次创建一个镜像

docker commitb8b9eff9264c openstack:db_v1.0  这个b8b9eff9264c替换成上面容器的ID使用docker ps –a命令查看。

到此数据库镜像创建完成,使用./addhost.sh openstack-db openstack:db_v1.0命令启动一个容器。过1分钟左右就能访问数据库了。

注意:容器的网络配置在重启物理服务器后会自动失效,可以编写一个脚本自动启动容器并添加相应IP地址。

三、创建rabbitmq-server镜像

addhost.sh脚本启动一个以openstack:base的容器。

ssh 链接到容器后进行操作。

此处内容和openstack官方文档一致

yum installrabbitmq-server

systemctl enablerabbitmq-server

systemctl startrabbitmq-server

rabbitmqctladd_user openstack  rabbit_password

rabbitmqctlset_permissions openstack ".*" ".*" ".*"

好,完成以后在物理主机上创建一个rabbit的镜像。

docker commitc1428dcc7d7b openstack:rabbit

docker images查看镜像是否创建成功。成功后使用./delhost.sh test1删除刚才的容器。

再使用./addhost.sh脚本创建一个rabbit容器。记得前面创建数据库的时候修改了这个脚本,要改回来。不然每个容器都有那么个数据库目录,不小心操作删除掉就完了。

四、创建openstack-keystone镜像

使用./addhost.sh 脚本以openstack:base为镜像创建一个容器。

ssh登录后按照openstack官方文档进行操作。

另外因为是分开安装的组件,所以/etc/keystone/keystone.conf中还需要修改

rabbit_host =RABBIT_IP,需要写IP地址,

rabbit_password =xxxxxxxRABBIT的密码。

 

PS:执行openstack service create --type identity--description "OpenStack Identity" keystone 命令时报错:

Traceback (mostrecent call last):

  File "/usr/bin/openstack", line 6,in <module>

    from openstackclient.shell import main

  File"/usr/lib/python2.7/site-packages/openstackclient/shell.py", line 23,in <module>

    from cliff import app

  File"/usr/lib/python2.7/site-packages/cliff/app.py", line 14, in<module>

    from .interactive import InteractiveApp

  File "/usr/lib/python2.7/site-packages/cliff/interactive.py",line 10, in <module>

    import cmd2

  File"/usr/lib/python2.7/site-packages/cmd2.py", line 361, in<module>

    class Cmd(cmd.Cmd):

  File"/usr/lib/python2.7/site-packages/cmd2.py", line 424, in Cmd

    if subprocess.Popen(['which', editor],stdout=subprocess.PIPE, stderr=subprocess.STDOUT).communicate()[0]:

  File"/usr/lib64/python2.7/subprocess.py", line 711, in __init__

    errread, errwrite)

  File"/usr/lib64/python2.7/subprocess.py", line 1327, in _execute_child

    raise child_exception

OSError: [Errno 2]No such file or directory

看了下py文件,没发现有错误。keystone.log也没有日志输出。网页上找了半天,后来什么都没改又可以创建了。不知道是怎么回事。

使用openstack endpoint create \

--publicurlhttp://controller:5000/v2.0 \

--internalurlhttp://controller:5000/v2.0 \

--adminurlhttp://controller:35357/v2.0 \

--region RegionOne\

identity   命令创建的时候controller需要改成IP地址,这个IP为即将创建的容器IP地址。

按照官方文档进行测试通过以后就可以创建镜像了

docker commit c7d4663a9d5fopenstack:keystone

然后使用./addhost脚本进行创建。

创建好以后再进行官方文档测试。没问题就算全部通过了。

五、创建glance组件镜像

为保证glance保存的镜像数据不会因为容器停止而删除,所以需要先创建一个数据卷容器。

docker run -d -v/glancedb --name glancedb base:v1.2_ssh

修改./addhost.sh  docker行为 

docker run--privileged=true -d --net=none --volumes-from glancedb  --name $1 $2

使用./addhost.sh 脚本以openstack:base为镜像创建一个容器。

ssh登录后按照openstack官方文档进行操作。

vi/etc/glance/glance-api.conf中修改这项内容如下。

filesystem_store_datadir=/glancedb/images/

下载测试镜像的时候,网址路径有错误。使用下面的网址下载。

http://download.cirros-cloud.net/0.3.3/cirros-0.3.3-x86_64-disk.img

修改路径拥有者chown glance:nobody /glancedb/

chown glance:glance/glancedb/images

注意查看,/var/lib/glance目录的权限和拥有者。改成一模一样,如果修改好以后还是不行。还需要使用chcon -t unlabeled_t /glancedb/ -R 命令修改seliunx参数。

下载后上传镜像,成功就算完成了。

因为这里需要保存docker的镜像到glance所以修改一下glance的配置。

vi/etc/glance/glance-api.conf

container_formats= ami,ari,aki,bare,ovf,docker

完成以后重启systemctl restart openstack-glance-api然后再上传镜像测试。成功后就可以使用docker commit命令提交一个新镜像了。

由于是在docker 容器中创建的glance,所以需要在控制端物理机上安装python-glanceclient组件,和配置admin-opencrh.sh的变量文件。

exportOS_PROJECT_DOMAIN_ID=default

exportOS_USER_DOMAIN_ID=default

exportOS_PROJECT_NAME=admin

exportOS_TENANT_NAME=admin

exportOS_USERNAME=admin

exportOS_PASSWORD=www.admin.com

exportOS_AUTH_URL=http://172.10.10.123:35357/v3

exportOS_IMAGE_API_VERSION=2

使用source命令使其生效。

然后在物理机中使用

docker savebase:v1.2_ssh | glance image-create --container-format docker --disk-format raw--name base:v1.2_ssh --visibility public --progress命令看是否能上传成功。

如果不出意外的话一般会成功的。可以进入glance容器查看/glancedb/images目录下是否有文件多出来。

结束后就可以docker commit命令,再次提交镜像保存。

提交成功后就可以使用./addhost.sh脚本用新的镜像启动一个glance组件了。

六、nova计算节点和nova控制节点安装

nova计算节点是物理机,nova控制节点是docker容器。所以下面创建的镜像都是nova控制节点,这里称作nova-api

使用./addhost.sh 脚本以openstack:base镜像启动一个容器。配置好IP地址!剩下的按照官方文档进行操作。

如果在配置完启动后面程序的时候发现有无法找到的服务,请重新安装那个包。

 

303-c177-4264-8396-6eb8248b03dd- - - - -] AMQP server 172.10.10.122:5672 closed the connection. Check logincredentials: Socket closed

因为rabbitMQ的账户密码不正确。。重新在rabbitMQ上面运行一下

rabbitmqctladd_user openstack  RABBIT_PASS

rabbitmqctlset_permissions openstack ".*" ".*" ".*"

两条命令。

跳到nova-network节点,把nova-apivi /etc/nova/nova.conf

network_api_class= nova.network.api.API

security_group_api= nova

也打开。

把计算节点和控制节点都安装好以后就可以对控制节点进行镜像提交了。

然后再用新提交的镜像创建容器,使用nova service-list再次查看服务状态。这时可能会出现刚才用来做模版的那个主机全部down状态,可以不用管。如果实在不想看到这些信息,可以在nova数据库的services表中删除相关的记录。

理论上nova-network也是可以单独拿一台服务来做的,不过为了达到冗余性一般都和nova计算节点放在一起。每个计算节点安装一个nova-network,各自负责。避免了nova-network宕机造成所有实例无法使用网络的情况。单独安装也能分担负载。

七、创建网页管理界面

使用./addhost.sh 脚本以openstack:base镜像启动一个容器。配置好IP地址!剩下的按照官方文档进行操作。

vi /etc/openstack-dashboard/local_settings

OPENSTACK_HOST =IPADDR。这个地址需要配置成keystoneIP地址。

启动网页后就可以试着在图形界面创建实例了。

使用官方文档中Launch an instance with legacy networking(nova-network)一节的方式创建parikey。等!然后在图形界面的Project->instances中启动一个实例。

 

后面还有swiftcinder等组件没有安装,这里就不一一示范。创建方式和上面其它组件一样。但只能选择创建控制节点,不能创建其它节点。因为其它节点需要提供磁盘等物理服务,并且需要对系统内核进行修改。容器对内核的修改权限是有限的,可能会导致创建不成功或者无法使用等情况。

第三章、更改nova computer配置,使用docker启动实例。

检查docker是否正常安装并启动。

安装docker使用yum install docker命令

安装git命令,yum install git

获取novadocker

pip install -egit+https://github.com/stackforge/nova-docker#egg=novadocker

如果没有pip命令,使用yum install python-pip安装。

如果提示pip版本不对,使用pip install –upgrade pip更新

pkg_resources.VersionConflict:(pbr 0.11.0 (/usr/lib/python2.7/site-packages),Requirement.parse('pbr>=1.8'))

使用pip install --upgrade pbr更新

安装novadocker

cd src/novadocker/

python setup.pyinstall

cat  ./etc/nova/rootwrap.d/docker.filters >>/etc/nova/rootwrap.conf

配置nova计算节点nova.conf修改以下内容:

compute_driver =novadocker.virt.docker.DockerDriver

 

system startdocker启动Docker程序。查看ll /var/run/docker.sock用户和组。

srw-rw----. 1 rootroot 0 12 31 10:53 /var/run/docker.sock

nova加入到docker.sock文件显示的所在组,这里是rootusermod -G root nova

配置完成以后重启openstack-nova-compute服务。然后查看nova service-list服务状态。up后代表配置正常无错误,服务正常启动。这时可以使用上面glance中上传的docker镜像创建一个实例了。

nova-docker使用注意事项:

1、VNC可以链接,docker是一个容器别想使用远程进入到容器内部来管理它。因为这么做毫无意义。就算修改成功后,停止或重启容器修改的数据都将全部丢失。

2、如果实在想管理容器,可以通过创建默认启动ssh服务的镜像来远程链接。但是不建议这么做。使用supervisord可以同时启动多个服务!

3、在实际应用中可以在创建docker镜像时指定外部数据卷来获取容器的日志等信息。

4、在实际应用中,为方便管理每个容器只运行一个服务。如mysqlhttp等其中之一。

5、容器不能作为lvs等需要使用数据包转发服务的应用。不过理论上是可以使用nginxhaproxy这种修改配置文件后就可以使用的服务。

6、docker容器只能用于基础服务的提供,比如各类数据库,WEB服务器等类似应用。

报错日志处理:

/var/log/messge

1default='nova.virt.firewall.NoopFirewallDriver')

无法启动nova-compute

编辑nova.conf注释下面这行。

#firewall_driver =nova.virt.libvirt.firewall.IptablesFirewallDriver

2Dec 31 10:39:16 nova-compute nova-compute:raise ConnectionError(err, request=request)

Dec 31 10:39:16nova-compute nova-compute: ConnectionError: ('Connection aborted.', error(2,'ENOENT'))

Dec 31 10:39:16nova-compute nova-compute: 2015-12-31 10:39:16.600 31594 ERRORnova.openstack.common.threadgroup [req-b694c876-30e1-4cb5-b324-13262bc081ab - -- - -] ('Connection aborted.', error(2, 'ENOENT'))

请检查docker是否启动。

 

3Dec 31 12:22:55 nova-compute docker:time="2015-12-31T12:22:55.347478315+08:00" level=errormsg="Handler for GET /images/{name:.*}/json returned error: No such image:base:v1.2_ssh"

修改文件"/usr/lib/python2.7/site-packages/novadocker/virt/docker/driver.py"

    def _get_image_name(self, context,instance, image):

        fmt = image['container_format']

        if fmt != 'docker':

            msg = _('Image container format notsupported ({0})')

            raiseexception.InstanceDeployFailure(msg.format(fmt),

                                                  instance_id=instance['name'])

        return image['name'].lower()

4Dec 31 12:30:55 nova-compute nova-network:s.py", line 38, in ensure_tree\n   os.makedirs(path, mode)\n', ' File "/usr/lib64/python2.7/os.py", line 157, in makedirs\n    mkdir(name, mode)\n', "OSError: [Errno13] Permission denied: '/usr/lib/python2.7/site-packages/networks'\n"]

修改nova.conf文件为

networks_path=/var/lib/nova/networks重启openstack-nova-network服务。

5Dec 31 13:56:04 nova-compute nova-compute:2015-12-31 13:56:04.632 3818 TRACE nova.compute.manager [instance:565d0b8d-dae7-4846-9861-79406cf175a9] Stderr: 'sh:/usr/local/bin/nova-dhcpbridge:\xe6\xb2\xa1\xe6\x9c\x89\xe9\x82\xa3\xe4\xb8\xaa\xe6\x96\x87\xe4\xbb\xb6\xe6\x88\x96\xe7\x9b\xae\xe5\xbd\x95\n\ndnsmasq:cannot run lease-init script /usr/local/bin/nova-dhcpbridge: No such file ordirectory\n'

修改nova.conf

dhcpbridge=/usr/bin/nova-dhcpbridge然后重启openstack-nova-network服务。

6Dec 31 14:06:52 nova-compute nova-compute:Stderr: u'Cannot open network namespace "785757e487b825d0386407994d12c47d96cc0a014940d5ca3efbe70646ad31df":Permission denied\n'

Dec 31 16:33:56nova-compute nova-compute: Stderr: u'"mount --make-rslave /" failed:Permission denied\n'

查看785757e487b825d0386407994d12c47d96cc0a014940d5ca3efbe70646ad31df确实没有这个目录,这个是链接指向/proc/7928/ns/net目录。而/proc/7928/ns/net目录没有建立。

问题始终没找到,元旦放假后重启计算节点就可以创建了。

7、在日志中发现

docker.host_url                = unix:///var/run/docker.sock

这个参数的意思是不是可以配置单独的docker服务器组,只要把url指向docker主机就行了。

 

第四章、排错和使用举例

1、创建实例报错:

2015-12-2917:49:53.983 17692 ERROR nova.virt.libvirt.driver[req-b15ea5e4-816e-4a45-b332-5ff57a8f3b22 bd935861e2b4487fbb39fcb006bd54270f01f0de5ef5482a98739b310454b89a - - -] Error launching a defined domain withXML: <domain type='kvm'>

  <name>instance-00000001</name>

…………………………..省略……………………………………………..

2015-12-2917:49:53.984 17692 TRACE nova.compute.manager [instance:a0fe0d99-2a93-47c6-a20e-0068ac77416c] libvirtError: internal error: referencedfilter 'no-mac-spoofing' is missing

经过上网搜索以后,发现问题与libvirtnwfilter功能相关。

处理方式:

使用virsh nwfilter-list查看信息。

UUID                                  Name                

------------------------------------------------------------------

 a746b2e6-317d-42db-a6d9-3004fcd2e742  nova-allow-dhcp-server

 a984bd3e-4830-41d5-9d4b-8de06aa730ed  nova-base          

 290c8d53-2989-40e0-93c5-632aaa948f6d  nova-instance-instance-00000001-fa163e02d32e

 6b48d414-081a-4b46-ac27-8b306cdef51b  nova-no-nd-reflection

 eefd31f5-1d3a-447c-8809-96d2bd923db5  nova-nodhcp        

 a64af4fd-5abd-4cf9-8187-ace5b36e7bca  nova-*** 

发现nwfilter缺少no-mac-spoofing信息

安装yum install libvirt-daemon-config-nwfilter

重启libvirtd服务

systemctl restartlibvirtd

 

 

2、登录页面成功后,第二天发现又报错无法登录。错误信息:

dashboard服务器中的,http错误日志。

[Wed Dec 3010:58:01.593575 2015] [:error] [pid 41] ValidationError:[u"'bd935861e2b4487fbb39fcb006bd5427' value must be an integer."]

 

keystone服务中的日志信息。

2015-12-3010:58:01.304 279 DEBUG keystone.middleware.core [-] Auth token not in therequest header. Will not build auth context. process_request /usr/lib/python2.7/site-packages/keystone/middleware/core.py:229

解决方法:

修改dashboard配置

vi/etc/openstack-dashboard/local_settings

添加下面两行

SESSION_ENGINE ='django.contrib.sessions.backends.cache'

AUTH_USER_MODEL ='openstack_auth.User'

然后重启httpd服务再重新登录。

3、无法通过控制台链接VNC。不能从网页console进入控制实例。

查看nova-api中的nova-novncproxy.log日志。报错

2015-12-3013:18:22.282 3932 INFO nova.console.websocketproxy[req-131fee8a-f39c-45bc-a2b3-53a1134f4db2 - - - - -]  31: connecting to: 172.10.10.15:5900

2015-12-3013:18:22.295 3932 INFO nova.console.websocketproxy[req-131fee8a-f39c-45bc-a2b3-53a1134f4db2 - - - - -] handler exception: [Errno113] EHOSTUNREACH

使用telnet命令确实无法访问到计算节点的5900端口。

使用iptables-save > iptables命令保存后,修改iptables文件。在INPUT最前面一行加入-A INPUT -p tcp -m tcp --dport 5900 -j ACCEPT 保存。

使用iptables-restore < iptables命令重新导入后再链接网页中的VNC发现可以链接了。

4、实例无法链接外网

实例创建成功并且获得内网IP以后无法访问外网。

使用iptables –L –t nat 命令查看结果是nova-network-float-snat  all --  anywhere             anywhere           

SNAT       all --  10.1.1.0/24          anywhere             to: 172.10.10.15

172.10.10.15是管理接口IP。经过排查发现这个IP的设置和nova.conf文件中my_ip参数相同。改成外网网卡的ip地址并重启openstack服务将会正常。

5、分配一个公网IP

使用命令

novafloating-ip-bulk-create [--pool POOL_NAME] [--interface INTERFACE]RANGE_TO_CREATE

例:nova floating-ip-bulk-create --pool  pub1  192.168.1.200/29

创建好以后可以使用nova floating-ip-bulk-list命令查看。

然后就可以从网页上project->Access & Security->FloatingIPs页面获取一个IP并分配给实例。

分配成功后就可以使用这个IP地址访问实例了。

 

参考内容:

Docker:http://dockerpool.com/static/books/docker_practice/introduction/README.html

running-systemd-within-a-docker-container:

https://rhatdan.wordpress.com/2014/04/30/running-systemd-within-a-docker-container/

openstack-yum:

http://docs.openstack.org/kilo/install-guide/install/yum/content/ch_preface.html

openstack-apt:

http://docs.openstack.org/kilo/install-guide/install/apt/content/ch_preface.html

nova-docker:

https://wiki.openstack.org/wiki/Docker#Configure_an_existing_OpenStack_installation_to_enable_Docker

容器与OpenStack二者如何深度整合介绍:

http://www.d1net.com/cloud/news/351191.html

联系方式:

QQ305543274

PS:如果有问题请通过百度或谷歌方式获取帮助。解决问题的直接方式永远只有 Just think and do it!