https://docs.openstack.org/project-deploy-guide/kolla-ansible/2023.1/quickstart.html
kolla 的使命是为 openstack 云平台提供⽣产级别的、开箱即⽤的交付能⼒。kolla 的基本思想是⼀切皆容器,将所有服务基于 Docker 运 ⾏,并且保证⼀个容器只跑⼀个服务(进程),做到最⼩粒度的运⾏ docker。 kolla 要实现 openetack 部署总体上分为两步,第⼀步是制作 docker 镜像,第⼆步是编排部署。因此,kolla 项⽬⼜被分为两个⼩项⽬: kolla、kolla-ansible 。
kolla 的优势主要得益于容器技术:
这篇文章不是小白手册,不会教您如何使用KVM,设置网络,挂载硬盘,创建LVM等运维手段,需要您有一定的功底。底子太薄了,我就是写10万字也讲不完。
sudo apt update
sudo apt -y install qemu-system qemu-kvm virt-manager bridge-utils vlan
此时我们借助virt-manager,如果你不安装桌面,则无法使用virt-manager。
点击virt-manager图标或者执行virt-manager命令打开面板
双击QEMU/KVM字样,点击network创建网络
网桥1:名称manager,设备名virbr1, 10.0.0.0/24,
网桥2:名称external,设备名virbr2,192.168.0.0/24
kolla安装需要两个网口,我们使用virt-manager创建两个nat网桥来给kolla使用。
安装OS的时候需要将管理面和外网面两个网卡加入虚拟机。管理面可以设置ip,但是外网面网卡不能设置ip,否则虚拟机无法访问外网。官方文档原文是这样描述的:This interface should be active without IP address. If not, instances won’t be able to access to the external networks.
Debian篇
# 设置主机名
hostnamectl set-hostname --static kolla-aio
# 修改root密码
sudo passwd root
新密码:123456
# 修改ip
# 可以图形化修改,以下是命令行修改ip
ip -a # 查看网络接口名
# 查看网络配置
cat /etc/network/interfaces
---------------------------------------
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug eth0
iface eth0 inet dhcp
# 如果你有公网ip,这里也可以设置静态公网ip
---------------------------------------
# 关闭防火墙
ufw disable
# 防止Debian休眠
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
# 更新系统包
apt -y update && apt -y full-upgrade
apt -y install ssh vim git
# 官方文档要求下载的包
apt -y install git python3-dev libffi-dev gcc libssl-dev
apt -y install python3-venv
# 实际安装过程中发现,kolla的官方文档中少了一个包:python3-dbus,我们安装一下
apt -y install python3-dbus
# 允许ssh使用root密码认证登陆
vim /etc/ssh/sshd_config
PermitRootLogin yes
# 重启ssh
systemctl restart ssh
systemctl enable ssh
# Debian安装桌面
tasksel
# 然后选择gnome安装
为虚拟机添加两块磁盘
Debian
# 节点上添加两个磁盘设备,创建VG
apt -y install lvm2
pvcreate /dev/vdb /dev/vdc
vgcreate cinder-volumes /dev/vdb /dev/vdc
使用kolla-ansible部署openstack前,尽量保证各个节点的操作系统纯净,不要私自安装docker,不要私自修改GPG key。否则会导致kolla-ansible无法运行,最终只能逼着你去重装系统。
kolla-ansible会自动帮我们安装全套的运行环境,包括docker!!!
Debian
docker SDK的作用就是,ansible通过每台节点上的docker SDK来操作各个节点上的docker引擎,进而操作镜像和容器。所以每台机器上都要有安装这个docker SDK。
本来kolla-ansible会自动安装这个Docker SDK,但是我实际安装时发现网络不佳,导致Kolla-ansible经常跑失败。所以提前通过清华源安装好docker SDK后,就能保证kolla-ansible的100%成功。
以下操作每台机器都执行
# 安装sshpass
apt -y install sshpass # ansible依赖sshpass
# 安装python pip和venv
apt -y install python3-pip python3-venv pipx
# 下载Docker SDK.如果这一步报错,可能是网络不良,重试几次就行了。
# 其实这一步是在kolla-ansible -i ./multinode bootstrap-servers中ansible的一个step
# 如果我们提前做了,后面就不会因为网络不良而报错
# 注意这里将docker模块安装在系统的pip里作为系统命令,不可将它安装在虚拟环境中,否则openstack缺少包。
pipx install docker --include-deps -i https://pypi.tuna.tsinghua.edu.cn/simple
# pipx install dbus-python --include-deps -i https://pypi.tuna.tsinghua.edu.cn/simple
Debian和Rocky一致。
我们计划将manager节点上进行kolla部署,以下操作只在10.0.0.201上执行。
# 生成虚拟环境
python3 -m venv ~/venv3
source ~/venv3/bin/activate
pip install -U pip wheel setuptools docker -i https://pypi.tuna.tsinghua.edu.cn/simple
# 安装ansible
pip install 'ansible>=6,<8' -i https://pypi.tuna.tsinghua.edu.cn/simple
# 新增一个配置文件,让ansible不要检查known host key
vim ~/ansible.cfg
----------------------------------
[defaults]
host_key_checking=False
pipelining=True
forks=100
# 从github上下载kolla-ansible
pip install git+https://opendev.org/openstack/kolla-ansible@stable/2023.1
# 安装Ansible Galaxy依赖
cd ~ # 这一步cd为了让当前目录有ansible.cfg
kolla-ansible install-deps
# 配置ansible inventory
cd ~
cp ~/venv3/share/kolla-ansible/ansible/inventory/* ~/
ls ~
# 会出现两个文件:all-in-one 、 multinode
# all in one是把所有openstack部署在一个节点上。如果采用all-in-one,则不需要修改。
# 如果是三节点部署的同志,参考下面配置。
# 本文是单节点部署,跳过下面的配置 !直接进行下一章节:测试ansible和各个节点的连通性
vim ~/multinode
----------------------------------------
# 文件开头新增这3行,自行修改密码
manager ansible_host=172.0.1.11 ansible_user=root ansible_password=123456 ansible_python_interpreter=/usr/bin/python3
compute1 ansible_host=172.0.1.12 ansible_user=root ansible_password=123456 ansible_python_interpreter=/usr/bin/python3
storage1 ansible_host=172.0.1.13 ansible_user=root ansible_password=123456 ansible_python_interpreter=/usr/bin/python3
# 修改这几个组,其他的保留不变
[control]
manager
[network]
control
compute1
storage1
[compute]
compute1
[monitoring]
manager
[storage]
storage1
[deployment]
localhost ansible_connection=local become=true
其实通过查看原始的multinode文件,你可以发现,kolla将你所有的节点划分成了5种类型,即control类节点、network类节点、compute类、monitoring类节点、storage类节点。
这5个节点组是其他组的子组。
比方说文件下方有很多组件,比如loadbalance、trove等,都是[xxx:children]的形式,这个意思就是自由的组合这5个组。
假如我是生产环境的负责人,我手上有100台服务器,那么我会先计划将这100台机器分成5个类型。然后考虑openstack中哪些组件部署在哪种类型的节点上。
如nova是openstack的计算组件,我想把它安装在control和compute类型的机器上,我就会写
[nova:children]
control
compute
如horizon或者skyline是openstack的面板组件,我就会把这些组件安装在monitoring显示类型的节点上。
[horizon:children]
monitoring
# 单节点
ansible -i all-in-one all -m ping
------------------------------------------
localhost | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
# 多节点
ansible -i multinode all -m ping
-------------------------------------------
localhost | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
manager | SUCCESS => {
"changed": false,
"ping": "pong"
}
compute1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
storage1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
# 创建kolla配置文件
mkdir -p /etc/kolla
chown -R $USER:$USER /etc/kolla
cp -r ~/venv3/share/kolla-ansible/etc_examples/kolla/* /etc/kolla
ls /etc/kolla
# 两个文件globals.yml passwords.yml
# 生成密码
kolla-genpwd
# 生成的密码会自动写入/etc/kolla/passwords.yml
# Debian编写配置模板
# 如果没有配置cinder-volumes
cat << EOF > /etc/kolla/globals.yml
---
kolla_base_distro: "debian"
kolla_internal_vip_address: "10.0.0.10" # 找一个网段内没有占用的ip
network_interface: "virbr1" # 内部openstack管理网段
neutron_external_interface: "virbr2" # 外部网络网卡设备
enable_haproxy: "yes"
nova_compute_virt_type: "qemu" #使⽤虚拟机部署时,该配置项必须改为qemu,默认值为kvm
EOF
# 如果配置了cinder-volumes,则需要激活cinder依赖lvm
cat << EOF > /etc/kolla/globals.yml
---
kolla_base_distro: "debian"
kolla_internal_vip_address: "10.0.0.10" # 找一个网段内没有占用的ip
network_interface: "virbr1" # 内部openstack管理网段
neutron_external_interface: "virbr2" # 外部网络网卡设备
enable_haproxy: "yes"
enable_cinder: "yes" # 这是启动cinder块存储并使用我们的VG,如果刚才你没有创建cinder-volumes,这里要配置成no
enable_cinder_backend_lvm: "yes"
nova_compute_virt_type: "qemu" #使⽤虚拟机部署时,该配置项必须改为qemu,默认值为kvm
EOF
# 以上算作一行命令,从cat到EOF。复制时一起复制
什么是VIP:我们能看到global.yml配置中有个kolla_internal_vip_address,这个VIP是所有组件endpoint使用的ip。说白了,openstack的每个组件交付形式都是对外提供一个URL,而所有组件URL的ip就是VIP。
官方文档也是要求这个VIP必须有
# 环境安装,这一步会自动安装docker
# 单节点 all-inone用这个
kolla-ansible -i ./all-in-one bootstrap-servers
# 如果你是多节点部署,用下面这个
kolla-ansible -i ./multinode bootstrap-servers
# 参数预检查
kolla-ansible -i ./all-in-one prechecks # 单节点
kolla-ansible -i ./multinode prechecks # 多节点
# 下载openstack各个组件容器镜像
kolla-ansible -i ./all-in-one pull # 单节点
kolla-ansible -i ./multinode pull # 多节点
# 部署
kolla-ansible -i ./all-in-one deploy
kolla-ansible -i ./multinode deploy
# 遇到报错,销毁已安装的环境
kolla-ansible -i ./multinode destroy --yes-i-really-really-mean-it
如果precheck时发生了报错: “msg”: “Hostname has to resolve uniquely to the IP address of api_interface” ,那说明/etc/hosts文件中同一个主机名解析出两个ip,需要注释掉系统自带的那个,保留ansible生成的域名解析。
下图是manager节点上的容器镜像
# CLI 客户端安装
pip install python-openstackclient -i https://pypi.tuna.tsinghua.edu.cn/simple
# 生成RC文件
kolla-ansible post-deploy
. /etc/kolla/admin-openrc.sh
# 查看已经启动的服务
openstack service list
+----------------------------------+-------------+----------------+
| ID | Name | Type |
+----------------------------------+-------------+----------------+
| 052da6e26e3b40169d7a98c25c3a3524 | heat | orchestration |
| 1021eeae32df41998452e5f568f9b37c | neutron | network |
| 121644d1ca2b4dcea4bf7307b67266f8 | heat-cfn | cloudformation |
| 349006301f34441dbcbd608e67f22595 | keystone | identity |
| 80f2041571584e7f9732bdf09439e7ec | placement | placement |
| 9350811e7bc0471ca193389095e8010a | nova | compute |
| a2a2040a434b4bd0bb596b8f261cb2af | nova_legacy | compute_legacy |
| adde91660a0f4a59b3cb0107008ffe48 | glance | image |
| f2246af5f4bc41e786c4f602d774e54d | cinderv3 | volumev3 |
+----------------------------------+-------------+----------------+
# 查看endpoint
openstack endpoint list
+----------------------------------+-----------+--------------+----------------+---------+-----------+-----------------------------------------+
| ID | Region | Service Name | Service Type | Enabled | Interface | URL |
+----------------------------------+-----------+--------------+----------------+---------+-----------+-----------------------------------------+
| 05ad7101f81443cfa8662501ebc6ac0b | RegionOne | cinderv3 | volumev3 | True | public | http://10.0.0.250:8776/v3/%(tenant_id)s |
| 09032bbcbe624484921942216030a0e8 | RegionOne | cinderv3 | volumev3 | True | internal | http://10.0.0.250:8776/v3/%(tenant_id)s |
| 0a142961c46a461ab97d76af86dc1d98 | RegionOne | glance | image | True | internal | http://10.0.0.250:9292 |
| 26d3381fe2e34cf09bd6f16cff1df777 | RegionOne | placement | placement | True | internal | http://10.0.0.250:8780 |
| 27131aea054544a296adffd746f4b8ec | RegionOne | nova | compute | True | internal | http://10.0.0.250:8774/v2.1 |
| 2be216627f994de9af3cdb194e04b99d | RegionOne | heat | orchestration | True | public | http://10.0.0.250:8004/v1/%(tenant_id)s |
| 30f4be49399e40a7a27188e04e0cc7e7 | RegionOne | heat | orchestration | True | internal | http://10.0.0.250:8004/v1/%(tenant_id)s |
| 361582326057467297a0602f851d3efa | RegionOne | glance | image | True | public | http://10.0.0.250:9292 |
| 363cef91256c492bb48bbc00035e17d6 | RegionOne | heat-cfn | cloudformation | True | public | http://10.0.0.250:8000/v1 |
| 3969900770c24ad8b8a01686359bba42 | RegionOne | neutron | network | True | internal | http://10.0.0.250:9696 |
| 62b1eb1b01ad4381b4ed27f45bf59fa3 | RegionOne | heat-cfn | cloudformation | True | internal | http://10.0.0.250:8000/v1 |
| 653db0f9fb1c41cfbda84ba1d4b05e2a | RegionOne | nova_legacy | compute_legacy | True | public | http://10.0.0.250:8774/v2/%(tenant_id)s |
| 73215e690046464ab291c52aade9fe52 | RegionOne | nova | compute | True | public | http://10.0.0.250:8774/v2.1 |
| 894360b84d18496ba6da655fc07d77e7 | RegionOne | placement | placement | True | public | http://10.0.0.250:8780 |
| 9bb87213428c46e89842d1ba3a69cfc6 | RegionOne | keystone | identity | True | admin | http://10.0.0.250:35357 |
| ae6ba80db41c4c41a523249cce2a08db | RegionOne | keystone | identity | True | internal | http://10.0.0.250:5000 |
| b1aba9e7b93a42b18610e0c069573db5 | RegionOne | neutron | network | True | public | http://10.0.0.250:9696 |
| c544455e03f045f9bcfc5a2cf3143e79 | RegionOne | keystone | identity | True | public | http://10.0.0.250:5000 |
| cbf4436955134a7493545fa4391b25ce | RegionOne | nova_legacy | compute_legacy | True | internal | http://10.0.0.250:8774/v2/%(tenant_id)s |
+----------------------------------+-----------+--------------+----------------+---------+-----------+-----------------------------------------+
openstack的Dashboard组件有两个,horizon(已经存在于多个版本中)和skyline(正在测试,没有官方容器)
kolla安装过程中会自动帮我们安装一个全功能的horizon组件。
登录网址:http://vip/auth/login/?next=/
比如本案例中就是http://10.0.0.250/auth/login/?next=/
但是我们还缺admin的密码。
. /etc/kolla/admin-openrc.sh
env|grep OS_
OS_ENDPOINT_TYPE=internalURL
OS_REGION_NAME=RegionOne
OS_INTERFACE=internal
OS_AUTH_PLUGIN=password
OS_AUTH_URL=http://10.0.0.250:35357/v3
OS_PROJECT_DOMAIN_NAME=Default
OS_TENANT_NAME=admin
OS_USERNAME=admin
OS_USER_DOMAIN_NAME=Default
OS_PROJECT_NAME=admin
OS_PASSWORD=TdHUeHzlu1SVgZuMkKmBFDWZudyOMxcadJwmFNch # 这就是admin的密码
OS_IDENTITY_API_VERSION=3
如果需要openstack中的server能访问外网,首先external的那个物理网口要能访问外网。并且配置一个public网络连接这个物理网卡。
创建一个名为public的外部网络命令:
openstack network create --external --provider-network-type flat --provider-physical-network external public
openstack subnet create --network public --subnet-range <CIDR> --gateway <gateway_ip> --dns-nameserver <dns_server_ip> public-subnet
这里的CIDR要和物理网段保持一致,否则上游路由器无法分配ip给虚拟机。这个由路由器分配的ip就是浮动ip。
我创建了cirros虚拟机,创建了public和私有网络,并用路由器链接,安全组开到最大,但是从宿主机依然ping不通openstack里的虚拟机。最后我发现,宿主机上的br-ex并没有桥接上eth1,所以从宿主机没有办法ping通。如果桥接成功的话,在eth1中会显示master br-ex字样,但是没有。所以通过kolla安装的openstack并不具备外网能力,还需要你手动折腾一下,但是它是容器化,折腾起来很难。所以如果生成环境的话不建议使用kolla。
5年前,学openstack的人都用devstack部署环境,但是网速慢,安装不了。
现在有个工具叫packstack,通过向目标节点分发响应文件,部署openstack二进制文件,性能更强,而且只需要一个网卡eth0即可,并不需要eth1。部署速度很快,只需要配置yum国内源即可。既可用于开发学习环境,也可以用于生成环境。
packstack的B站学习视频:https://www.bilibili.com/video/BV1hx4y1N7qt?p=1&vd_source=31ed87f0229b79fe4f684ad9ecff317e
有时间我会出一期博客,介绍使用packstack。
~/venv3/share/kolla-ansible/init-runonce