一个计算机技术爱好者与学习者

0%

好好学OpenStack:Ubuntu16使用Kolla安装OpenStack

1. 前言

完成了《Ubuntu16手动安装OpenStack——XXX》系列,看上去,我们已经总结出了一套不错的文档。遵照文档,理论上就能成功安装更多的机器。但是,设想是美好的,而在实际安装过程中,又出现很多莫名其妙的报错。有些错误可以解决,很好;有些错误解决不了,那么整个环境就废了,需要重装系统。而且,整个安装流程非常复杂,难以保证每一步都不出错。

于是,郝同学决定寻找更加通用、更加方便的方法。树添同学给出建议:能不能使用docker来进行部署?经过讨论和搜索资料,发现这条道路确实可行,而且有OpenStack官方文档。

本文,就来研究一下使用Kolla安装OpenStack Queens版本的方法,架构采用最简单的all-in-one。

2. Kolla简介

Kolla是OpenStack社区“Big Tent”开发模式下的项目,该项目由思科于2014年9月提出。Kolla的优势和使用场景体现在如下几个方面:

  • 原子性升级或者回退OpenStack部署。
  • 基于组件升级OpenStack。
  • 基于组件回退OpenStack。

Kolla为OpenStack的部署提供了有效、快捷、方便、易于维护、方便版本更新与回退的方案。

具体而言,Kolla的最终目标是为OpenStack的每一个服务都创建一个对应的Docker镜像,通过Docker镜像将升级的粒度减小到服务级别,从而在升级时对OpenStack的影响降到最小,并且一旦升级失败,也很容易回滚。升级只需要三步:拉取新版本的容器镜像,停止老版本的容器服务,启动新版本的容器。回滚也不需要重新安装包,直接启动老版本的容器服务就行,非常方便。

Kolla可以使用Ansible、Kubernetes或者Mesos来部署OpenStack环境,Kolla负责容器化OpenStack各个服务;后者则负责部署这些容器,搭建出一个可用的OpenStack环境。来实现基于Docker容器的OpenStack服务全生命周期管理,如安装、升级、回滚、迁移等。在部署Docker容器时,默认的网络配置都是Host模式。因为Kolla的Docker镜像粒度很小,它针对每个OpenStack服务都有特定的镜像,所以我们也可以通过Docker命令来操作某个具体的OpenStack服务。

Kolla项目及其相关的其他项目如下:

  • Kolla项目,负责docker build OpenStack每个服务,如nova-compute容器等;
  • Kolla-Ansible项目,使用Ansible部署这些容器,搭建OpenStack环境;
  • Kolla-Kubernetes项目,使用Kubernetes部署这些容器,搭建OpenStack环境;
  • Kolla-Mesos项目,使用Mesos部署这些容器,搭建OpenStack环境。

上述Kolla简介摘自微信分享DockOne微信分享(一二八):容器化部署OpenStack的正确姿势

3. 环境

VirtualBox虚拟机一台,系统为ubuntu-16.04.4-server-amd64,4核8G内存40G存储,主机名为controller,eth0的IP为192.168.56.110,eth1为nat上网网卡,eth2为neutron服务提供网络。

4. 网络设置

1、切换到root用户
sudo -i

2、vim /etc/network/interfaces,设置网卡为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.56.110
netmask 255.255.255.0

auto eth1
iface eth1 inet dhcp

auto eth2
iface eth2 inet manual
up ifconfig $IFACE 0.0.0.0 up
up ifconfig $IFACE promisc

3、启用网卡
ifup eth2

5. 安装配置

主要参考OpenStack, Ansible, and Kolla on Ubuntu 16.04kolla queens on centos7.4Kolla-Ansible’s documentation!

5.1. 安装依赖

1、安装并升级pip

1
2
3
apt-get update
apt-get install python-pip
pip install --upgrade pip

2、安装依赖
apt-get -y install python-dev libffi-dev gcc libssl-dev python-selinux

3、安装ansible
apt-get -y install ansible

4、vim /etc/ansible/ansible.cfg,添加如下:

1
2
3
4
5
line 10, add
[defaults]
host_key_checking=False
pipelining=True
forks=100

5.2. 安装docker

1、安装docker
curl -SSL https://get.docker.io | bash

2、为docker和kolla创建配置文件

1
2
mkdir -p /etc/systemd/system/docker.service.d
vim /etc/systemd/system/docker.service.d/kolla.conf

修改为:

1
2
[Service]
MountFlags=shared

3、重启docker

1
2
systemctl daemon-reload
systemctl restart docker

4、查看docker信息
docker info
报错:

1
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.

5、重启docker
systemctl restart docker
报错:

1
2
Failed to restart docker.service: Unit docker.service is not loaded properly: Invalid argument.
See system logs and 'systemctl status docker.service' for details.

6、手动启动docker
/usr/bin/dockerd
报错:

1
2
3
INFO[0000] libcontainerd: new containerd process, pid: 7629 
WARN[0000] containerd: low RLIMIT_NOFILE changing to max current=1024 max=1048576
FATA[0001] Error starting daemon: error initializing graphdriver: "/var/lib/docker" contains several valid graphdrivers: aufs, overlay2; Please cleanup or explicitly choose storage driver (-s <DRIVER>)

7、查看docker的aufs挂载情况并取消挂载

1
2
cat /proc/mounts | grep "docker"
umount /var/lib/docker/aufs

8、删除/var/lib/docker/目录下的文件并重启docker

1
2
rm -rf /var/lib/docker/*
systemctl start docker

9、再次查看docker信息
docker info

5.3. 加速镜像拉取

参考Docker入门中的镜像加速器一节。

5.4. 安装Kolla-ansible

1、安装kolla-ansible
pip install kolla-ansible

报错:ImportError: cannot import name main,参考升级pip后出现ImportError: cannot import name main,编辑/usr/bin/pip文件,如下修改:

1
2
3
4
# line 9, change
from pip import __main__
if __name__ == '__main__':
sys.exit(__main__._main())

报红:oslo-config 6.4.0 has requirement PyYAML>=3.12, but you’ll have pyyaml 3.11 which is incompatible.忽略。

2、拷贝globals.yml和passwords.yml到/etc/kolla目录
cp -r /usr/local/share/kolla-ansible/etc_examples/kolla /etc/

3、拷贝all-in-one和multinode清单文件到当前目录
cp /usr/local/share/kolla-ansible/ansible/inventory/* .

4、生成kolla密码
kolla-genpwd
我们部署中使用的密码存储在/etc/kolla/passwords.yml文件中。此文件中的所有密码都是空白的,必须手动填写或运行随机密码生成器。

5.5. 配置globals.yml

1、查看globals.yml配置
grep -vE '^$|^#' /etc/kolla/globals.yml

2、vim /etc/kolla/globals.yml,如下修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# line 15,uncomment
kolla_base_distro: "centos"
# line 18,uncomment
kolla_install_type: "binary"
# line 21,uncomment and change
openstack_release: "queens"
# line 31,change
kolla_internal_vip_address: "192.168.56.120"
# line 85,uncomment and change
network_interface: "eth0"
# line 100,uncomment and change
neutron_external_interface: "eth2"
# line 331,uncomment
designate_backend: "bind9"
designate_ns_record: "sample.openstack.org"
# line 340,uncomment and change
nova_compute_virt_type: "qemu"
# other
tempest_image_id:
tempest_flavor_ref_id:
tempest_public_network_id:
tempest_floating_network_name:

kolla_internal_vip_address为192.168.56.120,它是一个和OpenStack宿主机内网连接网络(eth0 192.168.56.110)同一个网段的未使用IP。network_interface为eth0,意思是openstack内部网络使用eth0网卡。neutron_external_interface为eth2,意思是openstack的虚拟机外部网络使用eth2网卡。因为是在虚拟机中安装openstack,所以nova_compute_virt_type设置为qemu。

5.6. 部署

1、初始化
kolla-ansible -i ./all-in-one bootstrap-servers
报错:

查找资料,猜测是ansible版本问题。
(1)ansible --version,查看ansible版本为2.0.0.2,确实非常低。
(2)apt install ansible,提示已经是最新版本。
(3)更新apt库,然后重装ansible

1
2
3
4
apt-get install software-properties-common
apt-add-repository ppa:ansible/ansible
apt-get update
apt-get install ansible

然后,重新编辑/etc/ansible/ansible.cfg,再次执行初始化命令,问题解决。时间比较久,请耐心等待。

2、预检查
kolla-ansible -i ./all-in-one prechecks

3、拉取镜像
kolla-ansible -i ./all-in-one pull
这一步的时间特别久,挺耐心等待。如果拉取失败,就多尝试几次。

4、查看镜像
docker images

5、部署
kolla-ansible -i ./all-in-one deploy

6. 测试使用openstack

1、安装openstack客户端
pip install python-openstackclient python-glanceclient python-neutronclient --ignore-installed

2、生成admin-openrc.sh等
kolla-ansible post-deploy

3、使admin环境生效
source /etc/kolla/admin-openrc.sh

4、查看计算服务
openstack compute service list

7. 初始化配置

1、执行init-runonce脚本
. /usr/local/share/kolla-ansible/init-runonce

执行初始化之前,可以参考openstack 之 Kolla部署指南,设置一下外部网络。这样,就可以从路由器给虚拟机分配IP,安装完虚拟机就可以宿主机互相ping通。比如:

1
2
3
EXT_NET_CIDR='192.168.56.0/24'
EXT_NET_RANGE='start=192.168.56.200,end=192.168.56.240'
EXT_NET_GATEWAY='192.168.56.1'

这里配置的网络范围,对应globals.yml中配置的neutron_external_interface,也就是eth2网卡。

2、根据提示,创建实例

1
2
3
4
5
6
openstack server create \
--image cirros \
--flavor m1.tiny \
--key-name mykey \
--nic net-id=e52fe099-c798-4ffd-8c3c-06de424a9de7 \
demo1

3、访问horizon服务
curl 192.168.56.120 -L

在浏览器访问 http://192.168.56.120 ,使用admin账号登录,密码在passwords.yml文件中查看。
less /etc/kolla/passwords.yml | grep keystone_admin_password

8. 后记

至此,使用kolla安装openstack成功。但是,我们还不知道实例能否正常使用。关于实例的访问和网络配置,放在下一篇文章中研究。

9. 书签

Kolla’s documentation!

Kolla让OpenStack部署更贴心

Kolla安装Ocata单节点

kolla部署openstack ocata版

Install and configure OpenStack Ocata with Kolla as a standalone

Kolla OpenStack系统视频课程