openstack nova集成docker
[attach]309[/attach]
docker已经可以作为compute driver来使用,脱离了原来HEAT的模式,可以做到真正地使用nova来启动容器.这里记录一下openstack Kilo + docker 1.8的集成过程.所有组件环境基于centos7.
架构图如下:
[attach]310[/attach]
在compute node节点上安装docker,强烈建议安装docker-engine 1.8,需要linux3.1的kernal版本,拥有较高的生产稳定性,并且有启动用户组,旧版的docker-io是没有用户组,集成的时候docker.sock的权限每次都是手工修改很不方便.安装docker
# curl -sSL https://get.docker.com/ | sh # usermod -aG docker nova # systemctl enable docker.service # systemctl start docker.service
直接从github上clone安装安装novadocker
# pip install -e git+https://github.com/stackforge/nova-docker#egg=novadocker # cp -R src/etc/nova/rootwrap.d /etc/nova/ # chmod -R root.nova /etc/nova/rootwrap.d # cd src/novadocker/ # python setup.py install
配置nova调用docker驱动
# vi /etc/nova/nova.conf compute_driver = novadocker.virt.docker.DockerDriver
配置glance支持容器格式
# vi /etc/glance/glance-api.conf (修改后重启glance-api服务) container_formats = ami,ari,aki,bare,ovf,docker
由于novadocker开发的版本是基于nova比较新的版本,在现在发行的版本中使用会有一个BUG,下面是修复记录. 1.重启openstack-nova-compute服务时提示没有找到oslo_log模块Fix bug设置
# pip install oslo.log2.重启openstack-nova-compute服务时提示没有找到hv_type模块
通过代码定位发现目前的版本中模块是nova.compute.hvtype 修改/usr/lib/python2.7/site-packages/novadocker/virt/docker/driver.py 把from nova.compute import hv_type 改为 from nova.compute import hvtype3.直接导入driver测试提示报错,CONF没有’my_ip’这个opt配置
通过代码排查发现目前的openstack是使用oslo.config这个模块包来做cfg的导入和导出 但是在novadocker整个项目里面使用的oslo_config这个独立的模块 修改driver.py, client.py, hostinfo.py, vifs.py模块 from oslo_config import cfg 改为 from oslo.config import cfg4.直接导入driver测试提示继续报错,没有找到hvtype.DOCKER属性
修改 /usr/lib/python2.7/site-packages/nova/compute/hvtype.py 在# specific ‘baremetal’ & ‘fake’ then added in.下面增加 DOCKER=’docker’此时启动openstack-nova-compute已经正常
glance导入docker镜像
# docker pull hipache # docker save hipache | glance image-create --is-public=True --container-format=docker --disk-format=raw --name hipache需要注意的是glance导入后的名字一定要和docker images下显示的名字一模一样,否则创建时会提示无法找到镜像
启动容器实例
nova boot --image hipache --flavor 1 --nic net-id=342a0eef-e03d-4fd8-af3c-1ed485bee989 docker[attach]311[/attach] 1.此时启动容器实例报错失败,从nova-compute.log的日志看异常信息是”attach vif error”,具体是无法使用nova-rootwrap来提权进入namespace创建实例的网络接口
google找到的这个BUG的解决是禁用compute节点的selinux2.继续下一个BUG,日志抛出一个Python异常是没有找到hardware.InstanceInfo模块
进入目录/usr/lib/python2.7/site-packages/nova/virt 查看hardware.py的代码的确没有找到这个类或者函数,在github上找到nova项目的最新代码可以看到是有的.[attach]312[/attach] 把这个类的代码复制到本地的hardware.py里面 3.重启启动一个实例后,异常继续保持 [attach]313[/attach]
异常提示InstanceInfo没有getitem这个内置方法 根据driver.py里面的调用可以发现get_info调用的时候是hardware.InstanceInfo是返回一个字典 删除刚才在hardware.py复制的代码,重写InstanceInfo
def InstanceInfo(state=None, max_mem_kb=0, mem_kb=0, num_cpu=0,cpu_time_ns=0, id=None): Info={} Info['state'] = state Info['max_mem_kb'] = max_mem_kb Info['self.mem_kb'] = mem_kb Info['num_cpu'] = num_cpu Info['cpu_time_ns'] = cpu_time_ns Info['id'] = id return Info
此时启动实例正常无报错
[root@openstack-k ~]# nova list +--------------------------------------+---------+--------+------------+-------------+-------------------------------------------+ | ID | Name | Status | Task State | Power State | Networks | +--------------------------------------+---------+--------+------------+-------------+-------------------------------------------+ | c9d7ef23-f0fe-488d-88b1-3b5650901820 | hipache | ACTIVE | - | Running | admin_private=192.168.0.101, 172.24.4.228 | +--------------------------------------+---------+--------+------------+-------------+-------------------------------------------+ [root@openstack-k ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 14583d5d6308 hipache "supervisord -n" 5 hours ago Up 5 hours nova-c9d7ef23-f0fe-488d-88b1-3b5650901820 [root@openstack-k ~]#参考连接:
https://wiki.openstack.org/wiki/Docker http://docs.docker.com/installation/centos/ https://bugs.launchpad.net/nova-docker/+bug/1480246 https://github.com/openstack/nova/ https://github.com/stackforge/nova-docker原文链接:原文地址