环境信息

参考:https://docs.openstack.org/kolla-ansible/latest/user/quickstart.html

kolla安装节点要求:

  • 2 network interfaces
  • 8GB main memory
  • 40GB disk space

本次部署train版openstack,kolla的安装,要求目标机器是两块网卡,在vmware workstation新增一块网卡:

  • ens33,NAT模式,管理网络,租户网络与该网络复用,正常配置静态IP即可。
  • ens37,桥接模式,无需配置IP地址,这个其实是让neutron的br-ex 绑定使用,虚拟机通过这块网卡访问外网。

节点规划

  • 3个控制节点(网络节点与控制节点合并),1计算节点+1个存储节点(cinder lvm)
  • 第一个控制节点也作为kolla-ansible部署节点
  • 控制节点和计算节点2块网卡,存储节点1块网卡,网卡1NAT模式作为管理网络,网卡2桥接模式,作为外部网络。
  • 操作系统使用CentOS7.8 minimal,所有节点CPU内存配置为2C4G。

节点及IP规划

节点名称

IP地址

角色

control01

ens33:192.168.93.61

ens37:

控制节点

control02

ens33:192.168.93.62

ens37:

控制节点

control03

ens33:192.168.93.63

ens37:

控制节点

compute01

ens33:192.168.93.64

ens37:

计算节点

storage01

ens33:192.168.93.65

存储节点

ens37网卡配置参考:https://docs.openstack.org/install-guide/environment-networking-controller.html

cat > /etc/sysconfig/network-scripts/ifcfg-ens37 <<EOF
NAME=ens37
DEVICE=ens37
TYPE=Ethernet
ONBOOT="yes"
BOOTPROTO="none"
EOF

#重新加载en37网卡设备
nmcli con reload && nmcli con up ens37

如果启用cinder还需要在storage01节点额外添加一块磁盘,这里以/dev/sdb为例,在storage01节点执行

pvcreate /dev/sdb
vgcreate cinder-volumes /dev/sdb

注意卷组名称为cinder-volumes,默认与globals.yml一致。

[root@kolla ~]# cat /etc/kolla/globals.yml | grep cinder_volume_group
#cinder_volume_group: "cinder-volumes"

基本配置

无特殊说明,以下所有操作在kolla ansible部署节点执行,即control01节点。

安装依赖

yum install -y python-devel libffi-devel gcc openssl-devel libselinux-python

安装 Ansible

yum install -y ansible

配置阿里云pip源

mkdir ~/.pip
cat > ~/.pip/pip.conf << EOF 
[global]
trusted-host=mirrors.aliyun.com
index-url=https://mirrors.aliyun.com/pypi/simple/
EOF

安装 kolla-ansible

kolla版本与openstack版本对应关系:https://releases.openstack.org/teams/kolla.html

yum install -y epel-release
yum install -y python-pip
pip install -U pip
pip install kolla-ansible==9.1.0 --ignore-installed PyYAML

复制 kolla-ansible配置

mkdir -p /etc/kolla
chown $USER:$USER /etc/kolla

##Copy globals.yml and passwords.yml
cp -r /usr/share/kolla-ansible/etc_examples/kolla/* /etc/kolla

##Copy all-in-one and multinode inventory files
cp /usr/share/kolla-ansible/ansible/inventory/* .

修改ansible配置文件

cat << EOF | sed -i '/^\[defaults\]$/ r /dev/stdin' /etc/ansible/ansible.cfg
host_key_checking=False
pipelining=True
forks=100
EOF

修改multinode inventory文件,其他默认即可

$ cat multinode
[control]
# These hostname must be resolvable from your deployment host
control01
control02
control03

[network]
control01
control02
control03

[compute]
compute01

[monitoring]
control01

[storage]
storage01
...

配置ssh免密

ssh-keygen
ssh-copy-id 192.168.93.61
ssh-copy-id 192.168.93.62
ssh-copy-id 192.168.93.63
ssh-copy-id 192.168.93.64
ssh-copy-id 192.168.93.65

配置主机名(所有节点)

hostnamectl set-hostname control01
hostnamectl set-hostname control02
hostnamectl set-hostname control03
hostnamectl set-hostname compute01
hostnamectl set-hostname storage01

配置主机名解析(预配置时kolla会配置主机名解析,这里只在部署节点操作)

cat > /etc/hosts <<EOF
192.168.93.61 control01
192.168.93.62 control02
192.168.93.63 control03
192.168.93.64 compute01
192.168.93.65 storage01
EOF

检查inventory配置是否正确,执行:

ansible -i multinode all -m ping

生成kolla密码

kolla-genpwd

修改keystone_admin_password可以修改为自定义,在登录dashboard会用到

sed -i 's#keystone_admin_password:.*#keystone_admin_password: kolla#g' /etc/kolla/passwords.yml 

$ cat /etc/kolla/passwords.yml | grep keystone_admin_password
keystone_admin_password: kolla

修改全局配置文件globals.yml

cp /etc/kolla/globals.yml{,.bak}
cat >> /etc/kolla/globals.yml <<EOF

#version
kolla_base_distro: "centos"
kolla_install_type: "binary"
openstack_release: "train"

#vip
kolla_internal_vip_address: "192.168.93.200"

#docker registry
docker_registry: "registry.cn-shenzhen.aliyuncs.com"
docker_namespace: "kollaimage"

#network
network_interface: "ens33"
neutron_external_interface: "ens37"
neutron_plugin_agent: "openvswitch"
enable_neutron_provider_networks: "yes"

#storage
enable_cinder: "yes"
enable_cinder_backend_lvm: "yes"
EOF

参数说明:

  • kolla_base_distro: kolla镜像基于不同linux发型版构建,主机使用centos这里对应使用centos类型的docker镜像即可。
  • kolla_install_type: kolla镜像基于binary二进制和source源码两种类型构建,实际部署使用binary即可。
  • openstack_release: openstack版本可自定义,会从dockerhub拉取对应版本的镜像
  • kolla_internal_vip_address: 单节点部署kolla也会启用haproxy和keepalived,方便后续扩容为高可用集群,该地址是ens33网卡网络中的一个可用IP。
  • docker_registry: 默认从dockerhub拉取镜像,这里使用阿里云镜像仓库,也可以本地搭建仓库,提前推送镜像上去。但该仓库目前只有train和ussuri版本的镜像,如何自己推送镜像参考该博客的其他文章。
  • docker_namespace: 阿里云kolla镜像仓库所在的命名空间,dockerhub官网默认是kolla。
  • network_interface: 管理网络的网卡
  • neutron_external_interface: 外部网络的网卡
  • neutron_plugin_agent: 默认启用openvswitch
  • enable_neutron_provider_networks: 启用外部网络
  • enable_cinder: 启用cinder
  • enable_cinder_backend_lvm: 指定cinder后端存储为lvm

修改docker官方yum源为阿里云yum源,另外配置docker镜像加速,指定使用阿里云镜像加速。

sed -i 's/^docker_yum_url/#&/' /usr/share/kolla-ansible/ansible/roles/baremetal/defaults/main.yml
sed -i 's/^docker_custom_config/#&/' /usr/share/kolla-ansible/ansible/roles/baremetal/defaults/main.yml

cat >> /usr/share/kolla-ansible/ansible/roles/baremetal/defaults/main.yml <<EOF
docker_yum_url: "https://mirrors.aliyun.com/docker-ce/linux/{{ ansible_distribution | lower }}"
docker_custom_config: {"registry-mirrors": ["https://uyah70su.mirror.aliyuncs.com"]}
EOF

部署openstack

在运行bootstrap-servers时会执行easy_install pip命令安装pip,如果网络较慢可能任务一直卡在这里,可以提前在所有节点手动安装pip(可选)。

mkdir ~/.pip
cat > ~/.pip/pip.conf << EOF 
[global]
trusted-host=mirrors.aliyun.com
index-url=https://mirrors.aliyun.com/pypi/simple/
EOF

yum install -y epel-release
yum install -y python-pip
pip install -U pip

开始部署openstack

kolla-ansible -i ./multinode bootstrap-servers

#部署检查
kolla-ansible -i ./multinode prechecks

#拉取镜像
kolla-ansible -i ./multinode pull

#执行部署
kolla-ansible -i ./multinode deploy

#生成认证文件
kolla-ansible post-deploy
cat /etc/kolla/admin-openrc.sh

安装OpenStack客户端

yum安装openstack客户端

#启用openstack存储库
yum install -y centos-release-openstack-train

#安装openstack客户端
yum install -y python-openstackclient

#启用selinux,安装openstack-selinux软件包以自动管理OpenStack服务的安全策略
yum install -y openstack-selinux

#报错处理
pip uninstall urllib3
yum install -y python2-urllib3

kolla ansible提供了一个快速创建cirros demo实例的脚本/usr/share/kolla-ansible/init-runonce。

脚本需要cirros镜像,如果网络较慢可以使用浏览器下载放在/opt/cache/files目录下:

wget https://github.com/cirros-dev/cirros/releases/download/0.4.0/cirros-0.4.0-x86_64-disk.img
mkdir -p /opt/cache/files/
mv cirros-0.4.0-x86_64-disk.img /opt/cache/files/

定义init-runonce示例脚本外部网络配置:

#定义init-runonce示例脚本外部网络配置
export EXT_NET_CIDR='192.168.1.0/24'
export EXT_NET_RANGE='start=192.168.1.200,end=192.168.1.250'
export EXT_NET_GATEWAY='192.168.1.1'

#执行脚本,上传镜像到glance,创建内部网络、外部网络、flavor、ssh key,并运行一个实例
source /etc/kolla/admin-openrc.sh 
/usr/share/kolla-ansible/init-runonce

参数说明:

  • EXT_NET_CIDR 指定外部网络,由于使用桥接模式,直接桥接到了电脑的无线网卡,所以这里网络就是无线网卡的网段。
  • EXT_NET_RANGE 指定从外部网络取出一个地址范围,作为外部网络的地址池
  • EXT_NET_GATEWAY 外部网络网关,这里与wifi网络使用的网关一致

根据最终提示运行实例

openstack server create \
    --image cirros \
    --flavor m1.tiny \
    --key-name mykey \
    --network demo-net \
    demo1

也可以使用docker容器作为客户端

docker run -d --name client \
  --restart always \
  -v /etc/kolla/admin-openrc.sh:/admin-openrc.sh:ro \
  -v /usr/share/kolla-ansible/init-runonce:/init-runonce:rw \
  registry.cn-shenzhen.aliyuncs.com/kollaimage/centos-binary-openstack-base:train sleep infinity

docker exec -it client bash
source /admin-openrc.sh
openstack service list

访问horizon

在3个control节点查找vip地址

[root@control03 ~]# ip a | grep ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 192.168.93.63/24 brd 192.168.93.255 scope global noprefixroute ens33
    inet 192.168.93.200/32 scope global ens33

浏览器访问:http://192.168.93.200,用户名密码在admin-openrc.sh中可以找到,这里默认是admin/kolla

cat /admin-openrc.sh

查看网络拓扑

openstack高可用集群 上册 openstack集群部署_openstack高可用集群 上册

为实例分配浮动IP

openstack高可用集群 上册 openstack集群部署_docker_02


连接到实例,验证访问外网,cirros镜像默认账号密码为cirros/gocubsgo

[root@control01 ~]# ssh cirros@192.168.1.224
cirros@192.168.1.224's password:
$
$
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast qlen 1000
    link/ether fa:16:3e:e4:16:00 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.74/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fee4:1600/64 scope link
       valid_lft forever preferred_lft forever
$
$ ping -c 4 www.openstack.org
PING www.openstack.org (104.20.110.33): 56 data bytes
64 bytes from 104.20.110.33: seq=1 ttl=53 time=178.064 ms
64 bytes from 104.20.110.33: seq=2 ttl=53 time=177.797 ms
64 bytes from 104.20.110.33: seq=3 ttl=53 time=178.392 ms

--- www.openstack.org ping statistics ---
4 packets transmitted, 3 packets received, 25% packet loss
round-trip min/avg/max = 177.797/178.084/178.392 ms