前言
OpenStack 作为最主流的开源云计算平台,在企业私有云建设中占据重要地位。然而,传统的手动部署方式步骤繁琐、组件依赖复杂,稍有不慎就容易出错。kolla-ansible 是 OpenStack 社区官方推出的容器化部署工具,它将各个服务组件打包为 Docker 镜像,通过 Ansible 实现一键自动化部署,大幅降低了部署门槛。
本文档基于笔者在 Kylin Linux Advanced Server V11 (Swan25) 系统上的实际部署经验,详细记录了使用 kolla-ansible 18.0.0 部署 OpenStack Zed 版本的完整流程,包括环境准备、配置调优、麒麟系统适配、故障排查等关键环节。文档中所有命令均经过实际验证,关键配置项附带详细说明,适合有一定 Linux 和 OpenStack 基础的技术人员参考。
本文档的核心亮点:
- 国产系统适配:针对麒麟 V11 系统做了专门的适配说明,解决 kolla-ansible 默认不支持麒麟的问题
- 离线化部署:利用内网 Harbor 镜像仓库,实现 OpenStack 镜像的离线拉取,无需依赖公网 Docker Hub
- 分步骤验证:每个部署步骤都附带了验证方法和成功标志,降低排查难度
- 常见故障覆盖:汇总了部署过程中可能遇到的典型问题及解决方案
关于 Harbor 镜像仓库的说明
重要提示:本文档的部署流程中使用了内网 Harbor 镜像仓库(地址 10.44.52.169),这里做统一说明。
什么是 Harbor?
Harbor 是 VMware 开源的企业级容器镜像仓库,用于存储、管理和分发 Docker 镜像。它提供了镜像复制、访问控制、漏洞扫描等企业级特性,是私有化容器部署的首选方案。
为什么本文档使用内网 Harbor?
在 OpenStack 部署中,kolla-ansible 需要拉取数十个组件的 Docker 镜像(如 nova-api、neutron-server、keystone 等),这些镜像通常托管在 Docker Hub 上。但在实际生产环境中存在以下痛点:
因此,我们提前将 OpenStack Zed 版本所需的所有镜像上传到了内网 Harbor 仓库,所有节点通过 Harbor 拉取镜像,既保证了部署效率,也确保了版本一致性。
如何适配你的环境?
如果你在自己的环境中参照本文档部署,需要注意以下几点:
{
"insecure-registries": ["你的Harbor地址"]
}
- 直接使用 Docker Hub(需确保所有节点能访问公网),在 globals.yml 中不配置私有镜像源即可
- 使用其他容器镜像仓库(如 Nexus、Docker Registry 等),流程类似
1. 环境准备
1.1 硬件与系统配置
本次部署使用 3 台虚拟机,硬件规格与网络信息完全一致,具体参数如下:
| openstack1 | Kylin V11 2503 | Intel® Xeon® Platinum 8269CA | 16 | 32G | 10.44.59.61 | enp1s0 | enp6s0 |
| openstack2 | Kylin V11 2503 | Intel® Xeon® Platinum 8269CA | 16 | 32G | 10.44.59.62 | enp1s0 | enp6s0 |
| openstack3 | Kylin V11 2503 | Intel® Xeon® Platinum 8269CA | 16 | 32G | 10.44.59.63 | enp1s0 | enp6s0 |
1.2 前置说明
- 网卡用途:enp1s0 用于管理网络(需配置 IP),enp6s0 用于 Neutron 外部网络(无需配置 IP,后续在 globals.yml 中指定)
- 部署节点:选择 openstack1 作为部署节点,所有 ansible 命令均在此节点执行,其他节点为被控节点
- 权限要求:所有操作需使用 root 用户,避免因权限不足导致部署失败
- 版本说明:kolla-ansible 18.0.0 对应 OpenStack Zed 版本,不同版本间的兼容性请参考 OpenStack 官方文档
2. 部署前环境准备(所有节点执行,特殊标注除外)
2.1 配置主机名
操作目的:统一节点名称,便于后续免密访问和 ansible 管理。
以 openstack1 为例,其他节点需将主机名替换为对应名称(openstack2、openstack3):
# 设置主机名
hostnamectl set-hostname openstack1
# 刷新 shell 环境,使主机名生效
bash
# 验证主机名是否正确
hostname
2.2 添加节点 Host 映射
操作目的:实现节点间通过主机名互相访问,无需依赖 DNS 服务。
编辑 /etc/hosts 文件,添加以下内容:
vim /etc/hosts
添加内容:
10.44.59.61 openstack1
10.44.59.62 openstack2
10.44.59.63 openstack3
验证:在任意节点执行 ping openstack1,确保能正常连通。
2.3 配置部署节点免密登录(仅 openstack1 执行)
操作目的:避免 ansible 执行时频繁输入密码,提高部署效率。
# 生成 SSH 密钥对(一路回车,无需设置密码)
ssh-keygen
# 将公钥分发到所有节点(包括自身)
ssh-copy-id openstack1
ssh-copy-id openstack2
ssh-copy-id openstack3
验证:在 openstack1 执行 ssh openstack2,无需输入密码即可登录则配置成功。
2.4 关闭防火墙与 SELinux
操作目的:避免防火墙规则和 SELinux 安全策略阻止 OpenStack 组件间的网络通信。
# 关闭并禁用 firewalld 服务
systemctl disable –now firewalld
# 临时关闭 SELinux(立即生效,重启后失效)
setenforce 0
# 永久关闭 SELinux(修改配置文件,重启后生效)
sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
验证:执行 getenforce,输出 Disabled 则 SELinux 已关闭;执行 systemctl status firewalld,输出 inactive 则防火墙已关闭。
2.5 安装系统依赖包
操作目的:安装 OpenStack 和 Docker 运行所需的基础依赖,确保后续组件正常安装。
dnf install -y device-mapper-persistent-data lvm2 docker git python3-devel libffi-devel gcc openssl-devel python3-libselinux python3-docker wget
说明:dnf 是麒麟系统的包管理器(兼容 CentOS/RHEL 系的 yum 用法),若执行过程中出现包不存在的情况,可先执行 dnf update 更新软件源后重试。
2.6 配置 Docker(关键步骤)
操作目的:优化 Docker 镜像拉取速度、指定数据存储路径、配置日志策略,避免 Docker 默认配置导致的磁盘空间不足、日志膨胀等问题。
步骤 1:创建 Docker 配置目录
mkdir /etc/docker
步骤 2:生成 Docker 配置文件 daemon.json
tee /etc/docker/daemon.json << 'EOF'
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://docker.mirrors.ustc.edu.cn"
],
"data-root": "/data/docker",
"storage-driver": "overlay2",
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"live-restore": true,
"dns": ["8.8.8.8", "8.8.4.4"]
}
EOF
步骤 3:重启 Docker 服务并设置开机自启
systemctl restart docker.service
systemctl enable docker.service
关键配置说明:
| registry-mirrors | 国内 Docker Hub 镜像加速器,解决官方源拉取慢的问题 |
| data-root | Docker 数据存储路径,建议选择磁盘空间充足的分区(需确保 /data 目录存在,若不存在需先执行 mkdir -p /data) |
| storage-driver: overlay2 | Docker 推荐的存储驱动,性能优于旧版 devicemapper 驱动 |
| log-opts | 限制容器日志大小和保留数量,避免日志文件占满磁盘 |
| live-restore | 允许 Docker 守护进程重启时保持容器运行,减少服务中断 |
| dns | 指定容器使用的 DNS 服务器,确保容器内域名解析正常 |
验证:执行 docker info,查看 Registry Mirrors 和 Storage Driver 是否与配置一致。
3. 部署 kolla-ansible(仅在 openstack1 的 Python 虚拟环境中执行)
3.1 创建并激活 Python 虚拟环境
操作目的:创建独立的 Python 运行环境,避免与系统自带的 Python 包产生依赖冲突,确保 kolla-ansible 各组件版本兼容。
# 创建虚拟环境(.venv 为隐藏目录,位于 /root 下)
python3 -m venv .venv/kolla
# 激活虚拟环境(激活后命令行前缀会显示 "(kolla)")
source ~/.venv/kolla/bin/activate
注意:后续所有 kolla-ansible 相关命令,均需在虚拟环境中执行。若退出了虚拟环境(执行 deactivate),需重新激活后再继续操作。
3.2 安装 kolla-ansible 与核心依赖
步骤 1:配置 Python 镜像源(使用清华源,加速包下载)
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
步骤 2:更新 pip 工具
pip3 install -U pip
步骤 3:安装指定版本的 ansible-core(kolla-ansible 18.0.0 依赖 ansible-core 2.15 ~ 2.16.99 版本)
pip3 install 'ansible-core>=2.15,<2.16.99'
为什么不直接安装最新版 ansible-core? kolla-ansible 对 ansible-core 的版本有严格限制,版本不匹配可能导致部署过程中出现模块缺失或语法不兼容的错误。
步骤 4:安装 kolla-ansible 18.0.0
pip3 install kolla-ansible==18.0.0
步骤 5:安装 kolla-ansible 依赖包
kolla-ansible install-deps
验证:执行 kolla-ansible –version,输出 kolla-ansible 18.0.0 则安装成功。
3.3 下载并配置 kolla 配置文件
步骤 1:下载配置文件压缩包(地址为内网文件服务器,需确保可访问)
cd /root
wget http://10.44.52.169/others/kolla/kolla-ansible-conf.tar.gz
故障排查:若 wget 下载失败,可检查网络连通性(执行 ping 10.44.52.169),或手动下载该文件后通过 scp 上传到 /root 目录。
步骤 2:解压配置文件
tar xvf kolla-ansible-conf.tar.gz
cd kolla-ansible-conf
步骤 3:复制配置文件到 /etc/kolla 目录(kolla 默认配置目录)
mkdir /etc/kolla
cp multinode passwords.yml globals.yml /etc/kolla
3.4 关键配置文件详解(需根据实际环境修改)
3.4.1 multinode 文件 —— 主机清单
作用:定义 Ansible 管理的节点分组,决定哪些节点承担控制节点(control)角色,哪些节点承担计算节点(compute)角色。
修改说明:
- 打开文件:vim /etc/kolla/multinode
- 确保 [control]、[compute] 分组下的主机名与实际节点名称一致,示例:
[control]
openstack1
openstack2
openstack3
[compute]
openstack1
openstack2
openstack3
说明:本文档将 3 个节点同时作为控制节点和计算节点(All-in-One 多节点模式)。如果资源充足,也可以将控制节点和计算节点分离部署,例如仅 openstack1 为控制节点,openstack2 和 openstack3 为计算节点。
3.4.2 globals.yml 文件 —— 核心配置
作用:定义 OpenStack 部署的核心参数,包括镜像源、网络接口、服务开关等,是整个部署中最关键的配置文件。
必改参数(根据你的实际环境调整):
| kolla_base_distro | 基础镜像系统(麒麟系统需指定为 centos) | kolla_base_distro: centos |
| openstack_release | OpenStack 版本(需与 kolla-ansible 版本兼容) | openstack_release: zed |
| kolla_internal_vip_address | 控制节点 VIP 地址(单节点可设为控制节点 IP) | kolla_internal_vip_address: 10.44.59.66 |
| network_interface | 管理网络接口(对应本文档的 enp1s0) | network_interface: enp1s0 |
| neutron_external_interface | Neutron 外部网络接口(对应 enp6s0,无需配置 IP) | neutron_external_interface: enp6s0 |
| enable_haproxy | 是否启用 HAProxy 负载均衡(多节点建议 yes) | enable_haproxy: yes |
| enable_cinder | 是否启用 Cinder 块存储服务 | enable_cinder: yes |
| enable_cinder_backend_nfs | Cinder 后端存储类型(NFS 需提前部署好 NFS 服务) | enable_cinder_backend_nfs: yes |
| nova_compute_virt_type | Nova 虚拟化类型(物理机 KVM 环境用 kvm,虚拟机中用 qemu) | nova_compute_virt_type: kvm |
修改操作:
vim /etc/kolla/globals.yml
根据上述说明调整参数,保存退出(:wq)。
3.4.3 passwords.yml 文件 —— 密码配置
作用:存储 OpenStack 所有服务的密码(如 admin 用户密码、数据库密码、消息队列密码等),是安全管理的核心文件。
操作:通过命令自动生成随机密码(避免手动设置弱密码带来的安全风险):
kolla-genpwd
说明:生成的密码会覆盖 passwords.yml 中的默认值。后续可通过 cat /etc/kolla/passwords.yml 查看各服务密码,但建议不要手动修改,避免密码不一致导致服务认证失败。
3.5 同步所有节点的 Python 依赖(关键步骤)
操作目的:确保所有节点的 Python 依赖与部署节点保持一致,避免 ansible 执行时因依赖缺失或版本不匹配导致部署失败。
步骤 1:在部署节点(openstack1)导出依赖列表
pip3 freeze > /tmp/requirements.txt
步骤 2:将依赖列表同步到其他节点
scp /tmp/requirements.txt openstack2:/tmp
scp /tmp/requirements.txt openstack3:/tmp
步骤 3:退出虚拟环境(临时操作)
deactivate
步骤 4:所有节点执行以下命令安装依赖(包括 openstack1)
# 更新 pyopenssl(解决部分证书兼容性问题)
pip install –upgrade pyopenssl
# 安装依赖列表中的包
pip3 install -r /tmp/requirements.txt
步骤 5:重新激活部署节点的虚拟环境
source ~/.venv/kolla/bin/activate
3.6 麒麟系统适配(必做步骤)
操作目的:kolla-ansible 默认未对麒麟 Linux 做充分适配,直接部署可能遇到包管理器识别错误、服务启动失败等问题。本节通过修改 kolla-ansible 的配置文件来兼容麒麟系统。
操作步骤:
参考 Gitee 仓库的适配方案:https://gitee.com/xzyang-kylin/kolla/commit/1bd511526af71566147d649478891941370c5352,查看具体修改内容
关键路径映射(对照文档中的路径修改你本地的文件):
- 文档中的 venv 目录 → 本文档部署节点的 /root/.venv 目录
- 文档中的 ansible 目录 → 本文档部署节点的 /root/.ansible 目录
按照文档说明修改对应文件,确保麒麟系统下的包安装、服务启动流程正常
核心原理:kolla-ansible 在部署时会检查目标节点的操作系统类型,麒麟系统基于 CentOS 但部分标识不同,需要修改 kolla-ansible 中的系统识别逻辑,让 kolla-ansible 将麒麟识别为 CentOS 兼容系统,从而正确执行包安装命令。
3.7 执行 kolla-ansible 部署(分步骤执行,每步验证)
步骤 1:bootstrap-servers —— 安装节点基础依赖
cd /etc/kolla
kolla-ansible -i ./multinode bootstrap-servers
作用:在所有节点安装 OpenStack 服务运行所需的基础包(如 Python 扩展、Docker 配置等)。
成功标志:命令执行完成后,无 ERROR 日志,最后输出 PLAY RECAP 且所有节点的 ok 数正常、failed=0。
步骤 2:prechecks —— 前置检查
kolla-ansible -i ./multinode prechecks
作用:检查各节点环境是否满足部署要求,包括网络连通性、依赖包版本、Docker 运行状态、磁盘空间等。
重要提示:
- 若出现 WARNING,可根据提示判断是否需要处理(如 “内存不足” 建议扩容)
- 若出现 ERROR,必须解决后再继续,否则后续部署必然失败(如 “Docker 未启动” 需重启 Docker 服务后重新检查)
步骤 3:配置 Harbor 镜像仓库(所有节点执行)
关于 Harbor 的说明:本文档使用内网 Harbor 镜像仓库(地址 10.44.52.169)来存储和分发 OpenStack 组件镜像,避免从公网 Docker Hub 拉取镜像的缓慢和不可达问题。Harbor 是一个企业级容器镜像仓库,如果你是首次了解,建议先阅读本文档开头的 关于 Harbor 镜像仓库的说明 章节。
# 在所有节点执行以下命令(包括 openstack1、openstack2、openstack3)
curl -s http://10.44.52.169/others/harbor509 | bash
作用:执行 Harbor 初始化脚本,配置 Docker 客户端对 Harbor 仓库的访问权限,包括添加 Harbor 地址到 Docker 的信任列表、配置登录凭证等,确保后续镜像拉取正常。
步骤 4:拉取 OpenStack 镜像(部署节点执行)
bash /root/kolla-ansible-conf/pull_image_2024
作用:从 Harbor 镜像仓库批量拉取 OpenStack 所有组件镜像(如 Nova、Neutron、Cinder、Keystone 等),镜像版本与 globals.yml 中配置的 openstack_release: zed 一致。
执行说明:
- 拉取过程耗时较长(取决于网络带宽和镜像总量),需耐心等待,切勿中断命令
- 若出现 “镜像拉取失败”,先检查 Harbor 仓库连通性(执行 curl http://10.44.52.169),确认网络正常后重新执行拉取命令
验证:执行 docker images,查看是否存在以下镜像且版本为 zed:
docker images | grep -E "kolla/centos-binary-(nova|neutron|keystone|glance|cinder)"
步骤 5:deploy —— 执行部署
kolla-ansible -i ./multinode deploy
作用:通过 Ansible 自动化编排,在所有节点上完成 OpenStack 服务的配置生成、容器启动、组件关联等全流程部署。
关键注意事项:
成功标志:命令执行完成后,输出 PLAY RECAP 且所有节点 failed=0,最后提示 “Deployment completed successfully”。
步骤 6:post-deploy —— 生成客户端配置文件
kolla-ansible -i ./multinode post-deploy
作用:生成用于访问 OpenStack 服务的客户端环境变量配置文件,包含认证地址、用户名、密码等关键信息。
文件路径:生成的 admin-openrc.sh 位于 /etc/kolla/admin-openrc.sh。
配置生效:执行以下命令加载配置,之后 OpenStack 客户端命令(如 openstack server list)可直接使用:
source /etc/kolla/admin-openrc.sh
4. 部署后验证
4.1 验证 OpenStack 服务状态
4.1.1 检查容器运行状态
OpenStack 所有服务以 Docker 容器方式运行,执行以下命令检查容器是否正常启动:
docker ps | grep kolla
验证标准:
- 关键容器(如 nova-api、neutron-server、keystone、glance-api)状态为 Up(运行中),无 Exited(退出)状态
- 若某容器异常退出,查看日志定位问题:docker logs <容器ID>(容器 ID 可通过 docker ps -a 查看)
4.1.2 验证核心服务可用性
通过 OpenStack 命令行客户端逐一验证各核心服务的响应状态:
1. 验证认证服务(Keystone)
openstack token issue
成功输出:返回包含 id、expires 的令牌信息,无报错。
2. 验证计算服务(Nova)
openstack compute service list
成功输出:列出所有计算节点的 nova-compute 服务,状态为 up。
3. 验证镜像服务(Glance)
openstack image list
成功输出:列出镜像列表(可能为空),无报错即可。
4. 验证网络服务(Neutron)
openstack network list
成功输出:列出默认网络(如 public、private),无报错。
5. 验证块存储服务(Cinder)
openstack volume service list
成功输出:列出 cinder-volume 服务,状态为 up。
4.2 访问 OpenStack 控制台(Horizon)
4.2.1 登录信息
- 访问地址:http://10.44.59.66(即 globals.yml 中配置的 kolla_internal_vip_address)
- 用户名:admin(默认管理员账号)
- 密码:从 passwords.yml 中获取,执行以下命令:
grep keystone_admin_password /etc/kolla/passwords.yml
4.2.2 控制台功能验证
登录 Horizon 后,建议检查以下功能以确保部署完全正常:
5. 常见故障排查
5.1 镜像拉取失败
现象:执行 pull_image_2024 脚本时,某镜像拉取超时或报错 “no such image”。
解决方案:
5.2 容器启动失败(Exited 状态)
现象:docker ps -a 显示某容器状态为 Exited (1)。
解决方案:
- 若日志显示 “配置文件缺失”,重新执行 kolla-ansible deploy 生成配置文件
- 若日志显示 “端口被占用”,执行 netstat -tuln | grep <端口号> 找到占用服务,停止后重启容器:docker restart <容器ID>
- 若日志显示 “数据库连接失败”,检查 MariaDB 容器状态:docker ps | grep mariadb,必要时重启数据库容器
5.3 Horizon 登录失败
现象:访问控制台输入密码后,提示 “认证失败” 或 “无法连接到认证服务”。
解决方案:
5.4 部署过程中报 “操作系统不支持” 错误
现象:执行 bootstrap-servers 或 deploy 时,提示 “Unsupported OS” 或 “Unknown distribution”。
解决方案:回到 3.6 麒麟系统适配 章节,检查 kolla-ansible 的系统识别配置文件是否已正确修改,确保麒麟系统能被识别为 CentOS 兼容系统。
6. 附录
6.1 关键文件路径速查
| /etc/kolla/globals.yml | OpenStack 核心配置文件 |
| /etc/kolla/passwords.yml | 所有服务密码存储文件 |
| /etc/kolla/multinode | Ansible 主机清单文件 |
| /var/log/kolla/ | OpenStack 服务日志目录 |
| /etc/kolla/admin-openrc.sh | OpenStack 客户端环境变量配置文件 |
6.2 常用命令速查
| source ~/.venv/kolla/bin/activate | 激活 Python 虚拟环境 |
| kolla-ansible -i ./multinode deploy | 执行 OpenStack 部署 |
| docker ps | grep kolla | 查看 OpenStack 容器运行状态 |
| openstack server list | 查看计算实例列表 |
| openstack network list | 查看网络列表 |
| kolla-ansible destroy –yes-i-really-really-mean-it | 卸载 OpenStack(谨慎使用,不可逆) |
6.3 版本对应关系
| 18.0.0 | Zed | 2.15 ~ 2.16.99 |
| 17.0.0 | Yoga | 2.14 ~ 2.15.99 |
| 16.0.0 | Xena | 2.12 ~ 2.13.99 |
总结
本文档完整记录了在麒麟 Linux V11 系统上使用 kolla-ansible 部署 OpenStack Zed 版本的全过程,核心要点回顾:
希望本文档能帮助你在国产系统上顺利完成 OpenStack 部署。如果在部署过程中遇到本文档未覆盖的问题,欢迎在评论区留言交流。


