用kolla-ansible部署all-in-one openstack Zed版本

目录

  • kolla介绍
    • 官方文档
    • 简介
    • kolla 的优势
    • kolla 的缺点
  • 安装前的环境配置
    • 材料准备
    • 宿主机安装KVM
  • 创建两个NAT虚拟网桥
    • 虚拟机OS安装完成后的系统配置更改
    • 节点配置VG(Volume Group)
  • 不要自己擅自安装docker!
  • kolla安装openstack
    • 安装Docker SDK
    • 安装配置Ansible
    • 下载kolla-ansible stable版本,并安装Galaxy依赖。
    • 配置inventory文件
    • 测试ansible和各个节点的连通性
    • 配置kolla文件
  • 开始安装
  • openstack CLI和RC文件安装
  • Dashboard登录
  • 外网配置
    • kolla坑死人的地方,我看好packstack
  • 产生一个案例(可以不做)

kolla介绍

官方文档

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 的优势

kolla 的优势主要得益于容器技术:

  1. 得益于成熟的部署⼯具 ansible 和 docker,部署快速且稳定。
  2. ⼀个容器只跑⼀个服务,所以能将 openstack 服务控制到很⼩的粒度。
  3. 可以以组件为单位进⾏升级和回滚,例如升级 nova 组件,使⽤ kolla-ansible -i /path/to/inventory -t nova 命令即可。
  4. kolla 采⽤⼀切皆容器的基本思想,所以只需操作系统与 docker 兼容,从⽽规避了很多安装包依赖冲突的问题。
  5. ⽬前 kolla 项⽬在社区内的热度相对较⾼,社区⽀持更好。

kolla 的缺点

  1. 完全依赖于 docker ,docker 的不稳定性会给整个环境带来巨⼤的灾难,不过⽬前 docker 已经问题很少了。
  2. 使⽤ kolla 部署好云平台后,给开发的 debug 和运维的故障排查会带来更多的复杂度,这个问题也可能通过写⼀个简单的 client 解决。

安装前的环境配置

这篇文章不是小白手册,不会教您如何使用KVM,设置网络,挂载硬盘,创建LVM等运维手段,需要您有一定的功底。底子太薄了,我就是写10万字也讲不完。

材料准备

  1. 家用电脑一台,cpu四核及以上,内存8GB及以上,磁盘200GB以上。
  2. 一个网口即可,可以访问外网。
  3. 下载Debian12系统ISO:http://cdimage.debian.org/cdimage/archive/12.1.0/amd64/iso-dvd/debian-12.1.0-amd64-DVD-1.iso

宿主机安装KVM

sudo apt update
sudo apt -y install qemu-system qemu-kvm virt-manager bridge-utils vlan

创建两个NAT虚拟网桥

此时我们借助virt-manager,如果你不安装桌面,则无法使用virt-manager。
点击virt-manager图标或者执行virt-manager命令打开面板
双击QEMU/KVM字样,点击network创建网络
用kolla-ansible部署all-in-one openstack Zed版本_第1张图片

网桥1:名称manager,设备名virbr1, 10.0.0.0/24,
用kolla-ansible部署all-in-one openstack Zed版本_第2张图片

网桥2:名称external,设备名virbr2,192.168.0.0/24
用kolla-ansible部署all-in-one openstack Zed版本_第3张图片
用kolla-ansible部署all-in-one openstack Zed版本_第4张图片

虚拟机OS安装完成后的系统配置更改

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安装

用kolla-ansible部署all-in-one openstack Zed版本_第5张图片

节点配置VG(Volume Group)

为虚拟机添加两块磁盘
Debian

# 节点上添加两个磁盘设备,创建VG
apt -y install lvm2
pvcreate /dev/vdb /dev/vdc
vgcreate cinder-volumes /dev/vdb /dev/vdc

不要自己擅自安装docker!

使用kolla-ansible部署openstack前,尽量保证各个节点的操作系统纯净,不要私自安装docker,不要私自修改GPG key。否则会导致kolla-ansible无法运行,最终只能逼着你去重装系统。
kolla-ansible会自动帮我们安装全套的运行环境,包括docker!!!

kolla安装openstack

安装Docker SDK

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

安装配置Ansible

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

下载kolla-ansible stable版本,并安装Galaxy依赖。

# 从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

配置inventory文件

# 配置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和各个节点的连通性

# 单节点
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文件

# 创建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必须有
用kolla-ansible部署all-in-one openstack Zed版本_第6张图片

openstack的各个组件依赖VIP才能相互通信
用kolla-ansible部署all-in-one openstack Zed版本_第7张图片

开始安装

# 环境安装,这一步会自动安装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节点上的容器镜像
用kolla-ansible部署all-in-one openstack Zed版本_第8张图片

openstack CLI和RC文件安装

# 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 |
+----------------------------------+-----------+--------------+----------------+---------+-----------+-----------------------------------------+

Dashboard登录

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

登录成功
用kolla-ansible部署all-in-one openstack Zed版本_第9张图片

外网配置

如果需要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。

kolla坑死人的地方,我看好packstack

我创建了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

你可能感兴趣的:(openstack云计算,ansible配置管理,docker,运维,容器)