说明:因为个人兴趣,对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 内存, 1 核 CPU 。有了 docker 的帮助让很多没有硬件的人也可以玩上 openstack 的分布式部署充分了解 openstack 各个组件间的协作关系。
PS :因为没有 DNS 服务器,所以所有配置文件中的主机名称都要替换成相应的 IP 地址。在生产环境中如果使用这种方式强烈建议配置 DNS 服务器,然后在配置文件中使用主机名。这样在自动故障恢复的时候更加智能化。
第一章、环境搭建
物理环境使用两台物理主机,一台交换机分配两个网段。分别是 192.168.1.1/24 和 172.10.10.1/24 。 172.10.10.1/24 作为管理网段, 192.168.1.1/24 作为模拟公网网段。另外实例之间使用 10.1.1.1/24 作为实例分配网段。
另外为了管理方便,会为 docker 容器模拟 openstack 组件的服务器分配 192.168.1.1 和 172.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 包。
更改网络配置:
桥接口 物理口
这里需要配置两个桥接网口 br0 和 br1 分配桥接到两个物理网卡上。
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.200 、 172.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.sh 把 docker 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 =xxxxxxx 。 RABBIT 的密码。
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-api 的 vi /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 。这个地址需要配置成 keystone 的 IP 地址。
启动网页后就可以试着在图形界面创建实例了。
使用官方文档中 Launch an instance with legacy networking(nova-network) 一节的方式创建 parikey 。等!然后在图形界面的 Project->instances 中启动一个实例。
后面还有 swift 、 cinder 等组件没有安装,这里就不一一示范。创建方式和上面其它组件一样。但只能选择创建控制节点,不能创建其它节点。因为其它节点需要提供磁盘等物理服务,并且需要对系统内核进行修改。容器对内核的修改权限是有限的,可能会导致创建不成功或者无法使用等情况。
第三章、更改 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 文件显示的所在组,这里是 root 。 usermod -G root nova
配置完成以后重启 openstack-nova-compute 服务。然后查看 nova service-list 服务状态。 up 后代表配置正常无错误,服务正常启动。这时可以使用上面 glance 中上传的 docker 镜像创建一个实例了。
nova-docker 使用注意事项:
1、 无 VNC 可以链接, docker 是一个容器别想使用远程进入到容器内部来管理它。因为这么做毫无意义。就算修改成功后,停止或重启容器修改的数据都将全部丢失。
2、 如果实在想管理容器,可以通过创建默认启动 ssh 服务的镜像来远程链接。但是不建议这么做。使用 supervisord 可以同时启动多个服务!
3、 在实际应用中可以在创建 docker 镜像时指定外部数据卷来获取容器的日志等信息。
4、 在实际应用中,为方便管理每个容器只运行一个服务。如 mysql 、 http 等其中之一。
5、 容器不能作为 lvs 等需要使用数据包转发服务的应用。不过理论上是可以使用 nginx , haproxy 这种修改配置文件后就可以使用的服务。
6、 docker 容器只能用于基础服务的提供,比如各类数据库, WEB 服务器等类似应用。
报错日志处理:
/var/log/messge :
1 、 default='nova.virt.firewall.NoopFirewallDriver')
无法启动 nova-compute
编辑 nova.conf 注释下面这行。
#firewall_driver =nova.virt.libvirt.firewall.IptablesFirewallDriver
2 、 Dec 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 是否启动。
3 、 Dec 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()
4 、 Dec 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 服务。
5 、 Dec 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 服务。
6 、 Dec 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
经过上网搜索以后,发现问题与 libvirt 的 nwfilter 功能相关。
处理方式:
使用 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
联系方式:
QQ : 305543274
PS :如果有问题请通过百度或谷歌方式获取帮助。解决问题的直接方式永远只有 Just think and do it!
附件:http://down.51cto.com/data/2367700
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com