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

0%

好好学OpenStack:Kolla安装OpenStack多节点

1. 前言

《Ubuntu16使用Kolla安装OpenStack》一文中,使用kolla安装了单节点的openstack。

在实际的部署中,当然要安装多节点的openstack,本文就来研究一下在多个节点上使用kolla安装部署openstack的方法。

2. 环境

VirtualBox虚拟机三台,系统为ubuntu-16.04.4-server-amd64,分别作为控制节点、网络节点和计算节点,用户名为voidking/root,密码为voidking。
控制节点4核8G内存40G存储,主机名为controller,eth0的IP为192.168.56.110,eth1为nat上网网卡,eth2为neutron服务网络。
网络节点2核4G内存40G存储,主机名为network,eth0的IP为192.168.56.111,eth1为nat上网网卡,eth2为neutron服务网络。
计算节点2核4G内存40G存储,主机名为compute,eth0的IP为192.168.56.112,eth1为nat上网网卡,eth2为neutron服务网络。

3. 准备

3.1. 网络设置

在控制节点上,执行以下操作:

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

4、修改/etc/hosts,添加:

1
2
3
192.168.56.110  controller
192.168.56.111 network
192.168.56.112 compute

网络节点和计算节点参考控制节点配置即可。
需要注意的是,hosts文件在OpenStack安装完成后会被ansible修改,建议保留ansible创建的那一份,原因参考《OpenStack计算节点的奇葩问题》

3.2. python

在三台机器上安装python
sudo apt -y install python-simplejson
不安装的话,在使用ansible的时候会报错/bin/sh: 1: /usr/bin/python: not found。

3.3. 安装docker

1、在三台机器上安装docker
curl -SSL https://get.docker.io | bash

或者:
apt install docker.io

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

如果报错的话,参考《Ubuntu16使用Kolla安装OpenStack》解决。

3.4. 加速镜像拉取

使用 Docker 的时候,需要经常从官方获取镜像,但是由于显而易见的网络原因,拉取镜像的过程非常耗时,严重影响使用 Docker 的体验。因此DaoCloud推出了加速器工具解决这个难题,通过智能路由和缓存机制,极大提升了国内网络访问 Docker Hub 的速度,目前已经拥有了广泛的用户群体,并得到了 Docker 官方的大力推荐。

1、访问DaoCloud官网,注册一个账号。

2、访问配置 Docker 加速器,可以获得一个专属加速地址(每次访问都会获得不同的地址)。

3、参考Docker 加速器,创建或修改 /etc/docker/daemon.json,内容为:

1
2
3
4
5
6
{
"registry-mirrors": [
"http://2fd0f33c.m.daocloud.io"
],
"insecure-registries": []
}

4、重启docker

1
2
systemctl daemon-reload
systemctl restart docker

PS:也可以使用阿里云的镜像加速器

3.5. 密钥登录

1、在控制节点生成密钥
ssh-keygen,连续回车即可。

2、将公钥写入三台机器

1
2
3
ssh-copy-id -i .ssh/id_rsa.pub -p 22 voidking@192.168.56.110
ssh-copy-id -i .ssh/id_rsa.pub -p 22 voidking@192.168.56.111
ssh-copy-id -i .ssh/id_rsa.pub -p 22 voidking@192.168.56.112

3、在三台机器把voidking用户添加进sudo免密,方便以后的操作
sudo vim /etc/sudoers,添加

1
voidking ALL = NOPASSWD: ALL

4. 控制节点

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

4.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

1
2
3
4
apt-get install software-properties-common
apt-add-repository ppa:ansible/ansible
apt-get update
apt-get 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

4.2. 安装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、配置multinode文件
vim multinode,如下修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# line 3, change
[control]
192.168.56.110 ansible_ssh_user=voidking ansible_ssh_pass=voidking ansible_sudo=voidking ansible_sudo_pass=voidking ansible_become_user=root ansible_become_pass=voidking ansible_become=true
# line 12, change
[network]
192.168.56.111 ansible_ssh_user=voidking ansible_ssh_pass=voidking ansible_sudo=voidking ansible_sudo_pass=voidking ansible_become_user=root ansible_become_pass=voidking ansible_become=true
# line 17, change
[inner-compute]
192.168.56.112 ansible_ssh_user=voidking ansible_ssh_pass=voidking ansible_sudo=voidking ansible_sudo_pass=voidking ansible_become_user=root ansible_become_pass=voidking ansible_become=true
# line 21, change
[external-compute]
192.168.56.112 ansible_ssh_user=voidking ansible_ssh_pass=voidking ansible_sudo=voidking ansible_sudo_pass=voidking ansible_become_user=root ansible_become_pass=voidking ansible_become=true
# line 28, comment
[monitoring]
#monitoring01
# line 36, comment
[storage]
#storage01

6、测试连通
ansible -i multinode -m ping all
报错:ERROR! to use the ‘ssh’ connection type with passwords, you must install the sshpass program
安装sshpass:apt install sshpass
然后重新测试连通。

4.3. 配置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。

PS:实际上,kolla_internal_vip_address最好设置为192.168.56.110,原因参考《OpenStack计算节点的奇葩问题》

4.4. 部署

1、初始化
kolla-ansible -i ./multinode bootstrap-servers
时间很久,请耐心等待。

2、预检查
kolla-ansible -i ./multinode prechecks

3、拉取镜像
kolla-ansible -i ./multinode pull
这一步的时间特别久,挺耐心等待。如果拉取失败,就多尝试几次。
这里郝同学取巧一下,直接把《Ubuntu16使用Kolla安装OpenStack》一文中的images拷贝到控制节点、网络节点和计算节点。

(1)打包所有images
docker save $(docker images | grep -v REPOSITORY | awk 'BEGIN{OFS=":";ORS=" "}{print $1,$2}') -o kolla.tar

(2)导入所有images
docker load -i kolla.tar

4、查看镜像
docker images

5、部署
kolla-ansible -i ./multinode deploy

5. 测试使用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

5、查看网络服务
openstack network agent list

6. 初始化配置

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=25e6c0ef-6a0a-481c-a08a-46f7ef67ad3e \
demo1

3、给demo1实例分配浮动IP

1
2
3
4
source /etc/kolla/admin-openrc.sh
openstack network list
openstack floating ip create public1
openstack server add floating ip demo1 10.0.2.157

4、查看demo1
openstack server list

5、访问horizon服务
curl 192.168.56.120 -L

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

至此,使用kolla安装部署多节点openstack成功。

7. 网络配置

7.1. 网络节点

关于网络的配置,主要参考Kolla配置实例网络

1、在网络节点编辑/etc/network/interfaces,添加:

1
2
3
4
auto br-ex
iface br-ex inet static
address 10.0.2.1
netmask 255.255.255.0

2、启用br-ex
ifup br-ex

3、添加路由

1
2
3
ip netns
ip netns exec qrouter-9dbabbdd-cc45-42c3-b9e0-9dbbc03e66f1 ip add
route add -net 10.0.0.0/24 gw 10.0.2.153 dev br-ex

重启后路由失效,如果想要永久生效,那就在/etc/network/interfaces文件的尾部添加:

1
up route add -net 10.0.0.0/24 gw 10.0.2.153 dev br-ex

4、在网络节点连通demo1

1
2
ping 10.0.2.157 -c3
ping 10.0.0.3 -c3

5、设置demo1上网

1
2
3
4
iptables -I INPUT -i eth2 -j ACCEPT
iptables -I INPUT -i br-ex -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.0.2.0/24 -o eth1 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth1 -j MASQUERADE

设置永久生效参考《Linux配置SNAT上网》

7.2. 控制节点

1、添加路由
route add -net 10.0.2.0/24 gw 192.168.56.110 dev eth0
同样的,想要路由永久生效,也要添加到interfaces文件的尾部。

2、在控制节点连通demo1
ping 10.0.2.157 -c3

3、连接demo1
ssh cirros@10.0.2.157

4、测试外网连通
ping 8.8.8.8 -c3

8. 清除OpenStack

安装OpenStack,会对宿主机的网络有很大的影响。安装完成后,如果网络瘫痪,不要怕,还有补救措施:清除已经安装部署的OpenStack环境,然后重新配置,重新部署。
清除OpenStack的命令如下:
kolla-ansible destroy -i ./multinode  --yes-i-really-really-mean-it

9. 后记

本文的网络设置不合理,但是也能正常使用。因为已经安装部署完成,所以就不再更改了,在此做一下补充说明。
本文中eth0作为管理网卡,eth1作为上网网卡,eth0作为OpenStack宿主机间的内网网卡,eth2作为OpenStack的虚拟机外网网卡。这里eth0复用了,既作为管理网卡,又作为OpenStack内网网卡。更好的做法是,再添加一块网卡作为OpenStack的内网网卡,使每个网卡只有一个职责。

在物理机中安装OpenStack的话,可以参考《Ubuntu16手动安装OpenStack——neutron篇》。控制节点一个网卡,用来上网和管理;网络节点三个网卡,一张用来上网和管理,一张用来OpenStack宿主机内网连接,一张用来OpenStack虚拟机外网连接;计算节点两个网卡,一张用来上网和管理,一张用来OpenStack宿主机内网连接。

还有,在物理机安装OpenStack时,要关闭其他虚拟化工具,比如VirtualBox或者VMware,否则会无法创建实例,查看日志tail -n 20 /var/lib/docker/volumes/kolla_logs/_data/nova/nova-compute.log,出现KVM Error – ioctl(KVM_CREATE_VM) failed: 16 Device or Resource busy问题。

10. 书签

Kolla’s documentation!

Kolla让OpenStack部署更贴心

Kolla安装Ocata单节点

kolla部署openstack ocata版

Install and configure OpenStack Ocata with Kolla as a standalone

Kolla OpenStack系统视频课程

利用kolla快速搭建openstack-pike多节点