目录

使用Kolla部署OpenStack Stein版本

开源版本的OpenStack+Ceph的组合已经日趋稳定,所以搭建一朵私有云环境的难度在逐步降低。当然OpenStack安装问题其实一直没有得到有效的解决,学习曲线非常陡峭。本文主要介绍基于Kolla项目使用容器化快速部署OpenStack方法,该部署方法已经在内部环境得到了多次验证,安装简便容易维护。

1、云平台规划

在实际环境中,我们在一台2U的超微四子星服务器上进行了部署。由于是内部使用的研发环境,为了节约成本,我们并没有部署高可靠方案,而是采用了一台作为控制节点+计算节点+存储节点,另外三台作为计算节点+存储节点的方式进行部署。

由于OpenStack最新的Ussari在使用Kolla部署时,不再支持CentOS 7版本,所以这里我们选定了上一个稳定版本Stein版本进行部署。

硬件配置

硬件名称配置规格备注
CPUIntel(R) Xeon(R) CPU E5-2630 v4 @ 2.20GHz x 2共40线程
内存DDR4 2400 MHz 64GB
硬盘板载64 GB x 1
240 GB Intel SSD x 1
1.2 TB SAS x 5
经过测试,由于板载64GB空间过小,在控制节点需要损失一块SAS盘空间用于root分区挂载
网卡千兆 x 4
万兆 x 4
IPMI x 1

分区规划

磁盘规划备注
64G系统盘不要使用LVM分区
SSD 240GCeph Journal
1块盘
SAS 1.2 TCeph OSD5块盘

网络规划

交换机配置

  • 我们默认采用了VLAN模式,所以无须在交换机上进行Trunk配置

网络规划

网卡网络类型VLAN ID网段说明网关备注
管理网络3192.168.10.0/24OpenStack管理192.168.10.1192.168.10.201 - 204
存储网络10.0.100.0/24Ceph网络无需网关10.0.100.201 - 204
External网络3192.168.10.0/24External网络192.168.10.1可分配地址192.168.10.100 - 192.168.10.200
Tunnel网络172.16.100.0/24VxLAN通讯网络
172.16.100.201 - 204
consoleIPMI4192.168.10.0/24与管理网地址一一对应, 192.168.10.201

网卡配置

主机名em1(管理网地址)em2(存储网)em3(External网络)em4(Tunnel网络)备注
control201192.168.10.20110.0.100.201
DEVICE=INTERFACE_NAME
TYPE=Ethernet
ONBOOT=“yes”
BOOTPROTO=“none”
172.16.100.201
compute202192.168.10.20210.0.100.202
DEVICE=INTERFACE_NAME
TYPE=Ethernet
ONBOOT=“yes”
BOOTPROTO=“none”
172.16.100.202
compute203192.168.10.20310.0.100.203
DEVICE=INTERFACE_NAME
TYPE=Ethernet
ONBOOT=“yes”
BOOTPROTO=“none”
172.16.100.203
compute204192.168.10.20410.10.20.204
DEVICE=INTERFACE_NAME
TYPE=Ethernet
ONBOOT=“yes”
BOOTPROTO=“none”
172.16.100.203

OpenStack规划

安装组件

Ceph采用单独安装方式,这目前也是Kolla项目主推的方式,在U版本中已经彻底不支持通过Kolla安装Ceph了。我们主要安装OpenStack核心模块,另外安装的是日志收集ELK的相关模块,便于运维。

  • Horizon
  • Nova
  • Keystone
  • Cinder
  • Glance
  • Neutron
  • Heat

2、部署准备

部署架构图

/images/pasted-60.png

服务器前期准备

  • BIOS配置:在BIOS中打开VT,并且正确配置IPMI地址,方便远程管理
  • RAID配置:所有磁盘需要配置成NON-RAID模式
  • 操作系统安装:
    • 使用CentOS 7光盘进行最小化安装
    • 不要使用LVM分区
    • 配置主机名
    • 配置第一块网卡,并配置自动启动

网卡配置

em1

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
cat << EOF > /etc/sysconfig/network-scripts/ifcfg-em1
TYPE=Ethernet
BOOTPROTO=static
NAME=em1
DEVICE=em1
ONBOOT=yes
IPADDR=192.168.10.201
NETMASK=255.255.255.0
GATEWAY=192.168.10.1
DNS1=114.114.114.114
EOF

em2

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
cat << EOF > /etc/sysconfig/network-scripts/ifcfg-em2
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
NAME=em2
DEVICE=em2
ONBOOT=yes
IPADDR=10.0.100.201
NETMASK=255.255.255.0
EOF

em3

1
2
3
4
5
6
7
8
9
cat << EOF > /etc/sysconfig/network-scripts/ifcfg-em3
TYPE=Ethernet
BOOTPROTO=static
NAME=em3
DEVICE=em3
ONBOOT=yes
IPADDR=172.16.100.201
NETMASK=255.255.255.0
EOF

em4

1
2
3
4
5
6
7
cat << EOF > /etc/sysconfig/network-scripts/ifcfg-em4
TYPE=Ethernet
BOOTPROTO=none
NAME=em4
DEVICE=em4
ONBOOT=yes
EOF

3、安装步骤

3.1 准备部署节点

该节点承担了后续所有的部署流程,该节点可以作为OpenStack控制节点复用,包括运行OpenStack Kolla和Ceph Deploy。

注意:节点之间可以通过密码或者密钥方式进行访问,附录中提供了自动上传密钥的方式,建议在正式安装前配置完成,这里不提供自动化配置方法。

下载初始化脚本

目前已经将常用的操作写成了Ansible脚本。

1
2
3
4
5
yum install -y git
git clone https://github.com/xiaoquqi/my_ansible_playbooks

cd my_ansible_playbooks
prepare_on_centos7.sh

修改hosts.ini文件

修改hosts.ini文件来初始化所有节点

1
2
3
4
5
## my_ansible_playbooks/hosts.ini
compute201 ansible_host=192.168.10.201 ip=192.168.10.201 ansible_user=root
compute202 ansible_host=192.168.10.202 ip=192.168.10.202 ansible_user=root
compute203 ansible_host=192.168.10.202 ip=192.168.10.203 ansible_user=root
compute204 ansible_host=192.168.10.202 ip=192.168.10.204 ansible_user=root

初始化节点

该步骤主要包含了,更新软件,修改主机名,增加/etc/hosts等操作。

1
2
3
4
5
6
7
./run_ansible.sh playbooks/bootstrap_centos7.yml
./run_ansible.sh playbooks/change_hostname.yml
./run_ansible.sh playbooks/update_etc_hosts.yml
./run_ansible.sh playbooks/install_docker.yml

## 安装pip和系统环境下的python docker模块,否则在precheck的时候会发现没有安装docker模块
./run_ansible.sh playbooks/install_pip2_package.yml

安装Ceph Deploy

1
2
yum install -y python3-pip
pip3 install pecan werkzeug
1
2
3
4
5
6
7
8
9
cat << EOF > /etc/yum.repos.d/ceph.repo
[ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-octopus/el7/noarch/
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
EOF
1
2
yum makecache
yum install -y ceph-deploy

安装Kolla

由于Python Warning的提示信息导致在安装时出现如下错误,需要增加忽略Python Warning的环境变量,具体修复信息如下:https://bugs.launchpad.net/kolla-ansible/+bug/1888657

目前通过pip方式还没有8.2.1这个release,所以kolla的安装从源代码中进行。

1
2
3
4
5
6
7
Ansible 2.2.0.0 used in Stein kolla-toolbox requires paramiko (no version
constraints), which installs latest cryptography package. It results in
Python deprecation warning about Python 2:

/usr/lib64/python2.7/site-packages/cryptography/__init__.py:39: CryptographyDeprecationWarning: Python 2 is no longer supported by the Python core team. Support for it is now deprecated in cryptography, and will be removed in a future release.

This warning breaks kolla_toolbox module.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
sudo yum -y install python-devel libffi-devel gcc openssl-devel libselinux-python

git clone https://github.com/openstack/kolla-ansible --branch stable/stein
cd kolla-ansible
pip install . --ignore-installed PyYAML

## 虚拟环境还需要再安装一次ansible,否则kolla-ansible会提示
## ERROR: kolla_ansible has to be available in the Ansible PYTHONPATH.
## Please install both in the same (virtual) environment.
pip install 'ansible<2.10'

mkdir -p /etc/kolla
cp -r $VENV_HOME/share/kolla-ansible/etc_examples/kolla/* /etc/kolla

mkdir -p /root/kolla
cp $VENV_HOME/share/kolla-ansible/ansible/inventory/* /root/kolla

生成密码,如果需要指定密码,可以到/etc/kolla/password.yml中修改。

1
kolla-genpwd

3.2 部署Ceph

部署

之前有一篇软文详细介绍了使用Ceph Deploy部署Ceph的方法,这里不再赘述,下面直接给出部署命令,这里我们只部署块服务。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
mkdir -p /root/ceph
cd /root/ceph

export CEPH_DEPLOY_REPO_URL=https://mirrors.aliyun.com/ceph/rpm-octopus/el7
export CEPH_DEPLOY_GPG_URL=https://mirrors.aliyun.com/ceph/keys/release.asc

## 如果阿里源无法使用,可以使用163源,并且可以通过指定rpm-octopus,指定安装的Ceph版本
##export CEPH_DEPLOY_REPO_URL=https://mirrors.163.com/ceph/rpm-octopus/el7
##export CEPH_DEPLOY_GPG_URL=https://mirrors.163.com/ceph/keys/release.asc

## 集群初始化,这一步会生成初始化的ceph.conf,可以配置网络等信息
##
## 如果cluster-network和public-network需要分开,可以这样定义:
## ceph-deploy new --cluster-network 172.31.6.0/24 --public-network 192.168.4.0/24 node1 node2 node3

ceph-deploy new --public-network 10.0.100.0/24 compute201
ceph-deploy install compute201 compute202 compute203 compute204

## 初始化monitor,并收集keys
ceph-deploy mon create-initial
ceph-deploy admin compute201 compute202 compute203 compute204

ceph-deploy mgr create compute201

## 需要根据实际情况修改,这里模拟的是将RocksDB存放至单独的SSD磁盘,目前文档中并没有特别指出这部分的分配比例,所以DB和WAL都是分配10G,写入的基本顺序为WAL -> DB -> DATA

pvcreate /dev/vdb
vgcreate ceph-pool /dev/vdb

## 每个OSD分配
lvcreate -n osd0.wal -L 10G ceph-pool
lvcreate -n osd0.db -L 10G ceph-pool
ceph-deploy osd create --data /dev/vdd --block-db ceph-pool/osd0.db --block-wal ceph-pool/osd0.wal compute201

## 检查集群状态
ceph -s

生成配置文件

为Glance/Nova/Cinder创建资源池并生成鉴权文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
ceph osd pool create images 128
ceph auth get-or-create client.glance mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=images' -o /etc/ceph/ceph.client.glance.keyring

ceph osd pool create volumes 128
ceph auth get-or-create client.cinder mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=volumes, allow rx pool=images' -o /etc/ceph/ceph.client.cinder.keyring

ceph osd pool create backups 128
ceph auth get-or-create client.cinder-backup mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=backups' -o /etc/ceph/ceph.client.cinder-backup.keyring

ceph osd pool create vms 128
ceph auth get-or-create client.nova mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=vms, allow rx pool=images' -o /etc/ceph/ceph.client.nova.keyring

注意:

3.3 OpenStack部署

kolla配置文件

/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
23
24
25
kolla_base_distro: "centos"
kolla_install_type: "source"
openstack_release: "stein"
kolla_internal_vip_address: "192.168.10.123"

docker_registry: registry.cn-beijing.aliyuncs.com
docker_namespace: "openstack-dockers"

network_interface: "eth0"
storage_interface: "eth1"
tunnel_interface: "eth3"
neutron_external_interface: "eth2"

openstack_logging_debug: "True"
enable_haproxy: "no"
enable_ceph: "no"
enable_cinder: "yes"
enable_cinder_backup: "yes"
enable_fluentd: "no"
enable_openstack_core: "yes"
glance_backend_ceph: "yes"
glance_backend_file: "no"
glance_enable_rolling_upgrade: "no"
cinder_backend_ceph: "yes"
nova_backend_ceph: "yes"
multinode
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
[control]
compute201 ansible_host=192.168.10.123 ip=192.168.10.123 ansible_user=root

[network]
compute201 ansible_host=192.168.10.123 ip=192.168.10.123 ansible_user=root
compute202 ansible_host=192.168.10.160 ip=192.168.10.160 ansible_user=root

[compute]
compute201 ansible_host=192.168.10.123 ip=192.168.10.123 ansible_user=root
compute202 ansible_host=192.168.10.160 ip=192.168.10.160 ansible_user=root

[monitoring]
compute201 ansible_host=192.168.10.123 ip=192.168.10.123 ansible_user=root

[storage]
compute201 ansible_host=192.168.10.123 ip=192.168.10.123 ansible_user=root
compute202 ansible_host=192.168.10.160 ip=192.168.10.160 ansible_user=root

定制服务配置文件

Ceph Glance
1
2
3
4
5
6
7
8
9
mkdir -p /etc/kolla/config/glance
tee /etc/kolla/config/glance/glance-api.conf << EOF
[glance_store]
stores = rbd
default_store = rbd
rbd_store_pool = images
rbd_store_user = glance
rbd_store_ceph_conf = /etc/ceph/ceph.conf
EOF
1
2
cp /etc/ceph/ceph.conf /etc/kolla/config/glance/ceph.conf
cp /etc/ceph/ceph.client.glance.keyring /etc/kolla/config/glance/ceph.client.glance.keyring
Ceph Cinder

cinder_rbd_secret_uuid是在passwords.yml中生成的。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
mkdir -p /etc/kolla/config/cinder
mkdir -p /etc/kolla/config/cinder/cinder-volume
mkdir -p /etc/kolla/config/cinder/cinder-backup

export cinder_rbd_secret_uuid=$(grep cinder_rbd_secret_uuid /etc/kolla/passwords.yml | awk '{print $2}')

tee /etc/kolla/config/cinder/cinder-volume.conf << EOF
[DEFAULT]
enabled_backends=rbd-1

[rbd-1]
rbd_ceph_conf=/etc/ceph/ceph.conf
rbd_user=cinder
backend_host=rbd:volumes
rbd_pool=volumes
volume_backend_name=rbd-1
volume_driver=cinder.volume.drivers.rbd.RBDDriver
rbd_secret_uuid = $cinder_rbd_secret_uuid
EOF
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
tee /etc/kolla/config/cinder/cinder-backup.conf << EOF
[DEFAULT]
backup_ceph_conf=/etc/ceph/ceph.conf
backup_ceph_user=cinder-backup
backup_ceph_chunk_size = 134217728
backup_ceph_pool=backups
backup_driver = cinder.backup.drivers.ceph.CephBackupDriver
backup_ceph_stripe_unit = 0
backup_ceph_stripe_count = 0
restore_discard_excess_bytes = true
EOF

所有文件必须命名为ceph.client*

1
2
3
4
cp /etc/ceph/ceph.conf /etc/kolla/config/cinder/ceph.conf
cp /etc/ceph/ceph.client.cinder.keyring /etc/kolla/config/cinder/cinder-volume/ceph.client.cinder.keyring
cp /etc/ceph/ceph.client.cinder.keyring /etc/kolla/config/cinder/cinder-backup/ceph.client.cinder.keyring
cp /etc/ceph/ceph.client.cinder-backup.keyring /etc/kolla/config/cinder/cinder-backup/ceph.client.cinder-backup.keyring
Ceph Nova
1
2
3
4
5
6
7
8
9
mkdir -p /etc/kolla/config/nova

tee /etc/kolla/config/nova/nova-compute.conf << EOF
[libvirt]
images_rbd_pool=vms
images_type=rbd
images_rbd_ceph_conf=/etc/ceph/ceph.conf
rbd_user=nova
EOF
1
2
3
cp /etc/ceph/ceph.conf /etc/kolla/config/nova/ceph.conf
cp /etc/ceph/ceph.client.nova.keyring /etc/kolla/config/nova/ceph.client.nova.keyring
cp /etc/ceph/ceph.client.cinder.keyring /etc/kolla/config/nova/ceph.client.cinder.keyring

检查

1
2
3
4
5
6
7
## 初始化节点,与上述我们自己的初始化有重复之处
kolla-ansible -i multinode bootstrap-servers

kolla-ansible -i multinode prechecks

## 拉取所有镜像
kolla-ansible -i multinode pull

部署

1
2
kolla-ansible -i multinode deploy
kolla-ansible -i multinode post-deploy

附录

节点互信

节点之间互信建议采用key方式,这里并没有实现完全自动化手段,需要首先在控制节点上生成公钥和私钥。

1
ssh-keygen

然后将~/.ssh/id_rsa.pub文件拷贝至可以正常访问两台节点的环境中的playbooks/keys目录下,再更新所有节点。

1
./run_ansible.sh playbooks/update_authorized_keys.yml

部署出错如何调试

如果在部署中出现任何错误,可以添加更多的Verbose来判断具体问题,有可能是kolla自身bug,也有可能是配置的问题,具体可以根据详细输出进行判断。

1
kolla-ansible -vvv -i multinode deploy