ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南 1. 为什么选择Kolla-ansible来部署单节点OpenStack如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里折腾几天下来可能连Dashboard都打不开。Kolla-ansible的核心价值就是把OpenStack及其所有依赖数据库、消息队列、Web服务等全部打包成Docker容器然后用Ansible这个自动化运维工具像搭积木一样把整个云平台“一键”部署起来。对于单节点all-in-one部署Kolla-ansible的优势尤其明显。它屏蔽了分布式架构的复杂性让你在一台物理机或虚拟机上就能获得一个功能完整的OpenStack环境。这非常适合几种场景一是个人学习和功能验证你可以快速搭建一个沙箱测试新版本特性或演练操作流程二是开发测试为基于OpenStack的二次开发提供一个本地的、可快速重建的基线环境三是PoC概念验证在资源有限的情况下向团队或客户演示OpenStack的核心能力。很多人会问OpenStack能不能直接装在裸机上当然可以这就是所谓的“裸机部署”Bare Metal。但裸机部署通常指的是通过Ironic服务来管理物理服务器而不是指安装方式。我们这里讨论的“部署方式”无论是Kolla-ansible还是其他工具最终都可以部署在物理机或虚拟机上。Kolla-ansible的容器化方式恰恰让它在物理机和虚拟机上的表现几乎一致因为所有服务都运行在容器里与底层系统的耦合度很低环境一致性极好。所以当你决定用Kolla-ansible走单节点路线时你选择的是一条快速、标准化、易于维护和销毁重来的捷径。接下来我会带你走通这条捷径并分享几个我踩过坑之后才明白的关键细节。2. 部署前的硬核准备不只是跑通安装脚本很多人部署失败问题往往出在准备阶段。以为照着官方Wiki的步骤复制粘贴命令就能成功结果在后续步骤中遇到各种诡异的错误。单节点部署虽然简化了网络和主机规划但对目标机器本身的要求却一点也不能马虎。2.1 系统与资源给足马力才能跑得稳首先操作系统。CentOS 7、Ubuntu 20.04/22.04、Rocky Linux 8/9是经过广泛验证的稳定选择。我个人的偏好是Ubuntu 22.04 LTS它的软件源比较新对Docker和Python的支持也更友好。这里有一个关键点务必使用一个纯净的最小化安装Minimal Install系统。避免系统自带的老旧Python、Docker或防火墙规则干扰部署。其次硬件资源。这是最容易低估的部分。官方文档可能说“至少8GB内存”但那是绝对的最低限度跑起来会非常卡顿几乎无法进行任何有意义的操作。根据我的经验一个能流畅进行基本操作创建虚拟机、挂载卷等的单节点环境需要以下配置CPU: 至少4核建议8核或以上。虚拟化支持Intel VT-x / AMD-V必须开启这是Nova计算服务创建虚拟机的基石。内存: 绝对不要低于16GB。我推荐32GB。因为除了OpenStack服务本身你创建的虚拟机也要占用内存。如果只有8GB可能刚部署完服务还没完全启动内存就耗尽了。磁盘: 至少100GB的可用空间。重点在于Kolla-ansible默认会将Docker的镜像和容器数据存储在/var/lib/docker路径下而OpenStack的Glance镜像、Cinder卷后端如果使用LVM也会消耗大量空间。因此确保根分区/或/var分区有充足空间。更好的做法是为/var/lib/docker单独挂载一块大容量磁盘。2.2 网络配置单节点的“虚拟网络实验室”单节点的网络配置是另一个核心。你的机器至少需要两块网卡NIC或者一块物理网卡支持VLAN子接口。这是为了区分“管理网络”和“供应商网络”。管理网络 (Management Network): 用于部署机与OpenStack服务容器之间的通信以及你通过SSH管理部署机本身的流量。通常使用第一个网卡如eth0或ens192配置一个固定的IP地址比如192.168.1.100。供应商网络 (Provider Network): 这是未来OpenStack虚拟机连接外网的桥梁。它需要桥接到物理网络。通常使用第二个网卡如eth1或ens224。关键操作是清空这个网卡的IP配置并将其加入一个Linux网桥通常是br-ex。这样所有从OpenStack虚拟机发出的流量都会通过这个网桥走到物理网卡再通往外部网络。一个常见的配置示例如下以Ubuntu 22.04为例使用netplan# /etc/netplan/00-installer-config.yaml network: version: 2 ethernets: ens192: # 管理网卡 addresses: - 192.168.1.100/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: [8.8.8.8, 114.114.114.114] ens224: # 供应商网卡不配置IP dhcp4: no dhcp6: no bridges: br-ex: # 外部网桥 interfaces: [ens224] # 将供应商网卡加入网桥 addresses: [] dhcp4: no dhcp6: no parameters: stp: false forward-delay: 0配置后执行sudo netplan apply生效。使用ip addr命令检查应该看到ens224没有IP而br-ex网桥存在且包含了ens224。2.3 基础服务与依赖安装避开版本陷阱在安装Kolla-ansible之前需要先装好Docker、Python和Ansible。这里处处是坑。Docker: 千万不要用系统自带的docker.io包版本太旧。一定要从Docker官方仓库安装。同时必须安装docker-compose插件旧版是独立工具docker-compose新版Docker已集成为插件因为Kolla用其管理容器生命周期。# 添加Docker官方GPG密钥和仓库 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null sudo apt update # 安装Docker引擎和compose插件 sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # 启动并设置开机自启 sudo systemctl enable --now docker # 将当前用户加入docker组避免每次都要sudo sudo usermod -aG docker $USER # **重要**注销并重新登录使组权限生效Python与Ansible: Kolla-ansible通常需要Python 3.8。Ubuntu 22.04自带的Python 3.10没问题。我们需要用pip安装特定版本的ansible和kolla-ansible。强烈建议使用Python虚拟环境venv避免污染系统Python环境。sudo apt install python3-venv python3-pip git # 创建虚拟环境 python3 -m venv /path/to/your/venv (例如: ~/kolla-venv) # 激活虚拟环境 source ~/kolla-venv/bin/activate # 升级pip pip install --upgrade pip # 安装指定版本的ansible和kolla-ansible。版本匹配至关重要 # 以OpenStack Yoga版本为例常用组合如下 pip install ansible6,9 kolla-ansible14.0.0 # 请根据你要部署的OpenStack版本查阅官方文档确认兼容版本注意Ansible 9.x版本有重大变更可能与老版本的Kolla-ansible不兼容。务必查看你选择的Kolla-ansible版本对应OpenStack版本的官方文档确认其支持的Ansible范围。盲目安装最新版是失败的主要根源之一。3. 配置与部署从模板到运行的云平台环境准备好后就进入了配置和部署的核心环节。这一步是将通用模板适配到你具体硬件环境的过程。3.1 初始化配置目录与全局参数首先从Kolla-ansible的安装位置复制配置文件模板到你的工作目录。# 假设你在虚拟环境中并且kolla-ansible已安装 mkdir -p ~/kolla-config cd ~/kolla-config # 复制全局配置模板和密码生成模板 cp /usr/local/share/kolla-ansible/etc_examples/kolla/globals.yml . cp /usr/local/share/kolla-ansible/etc_examples/kolla/passwords.yml .passwords.yml文件包含了所有服务的初始密码Kolla-ansible在首次部署前会自动生成随机密码填充它。我们主要修改globals.yml。3.2 关键配置项解读让配置贴合你的环境打开globals.yml你需要修改以下几个关键部分# 1. 指定OpenStack发行版版本例如 Yoga、Zed、Antelope等。 # 必须与你安装的kolla-ansible版本匹配。 kolla_base_distro: centos kolla_install_type: binary openstack_release: yoga # 示例版本请按需修改 # 2. 网络配置这是单节点配置的核心 network_interface: ens192 # 你的管理网卡名称 neutron_external_interface: br-ex # 你之前创建的供应商网络网桥名称 kolla_internal_vip_address: 192.168.1.200 # 内部VIP地址需要在管理网段内且未被占用 # 3. 启用或禁用组件 # 单节点下通常启用核心服务即可禁用一些分布式或高级组件以节省资源。 enable_cinder: yes # 块存储服务建议开启 enable_cinder_backend_lvm: no # 单节点测试可以不用LVM后端用更简单的local后端或直接禁用 enable_heat: no # 编排服务学习阶段可先关闭 enable_barbican: no # 密钥管理非必需可关闭 enable_octavia: no # 负载均衡服务单节点复杂建议关闭 # 4. 自定义Docker配置非常重要 # 如果你的根分区空间不大必须修改Docker数据目录 docker_storage_driver: overlay2 #docker_devices: # 如果有单独磁盘给Docker可以指定 # - /dev/sdb #docker_data_root: /data/docker # 将Docker数据目录指向一个空间充足的分区kolla_internal_vip_address是一个虚拟IPOpenStack的某些高可用服务会通过这个IP对外提供服务。在单节点部署中它仍然需要配置并且会绑定到你的管理网卡上。3.3 生成密码与执行部署配置好globals.yml后首先生成密码文件并开始部署。# 生成随机密码到passwords.yml kolla-genpwd # 接下来是Ansible的准备工作检查库存(inventory)。Kolla提供了单节点和多节点的库存文件模板。 cp /usr/local/share/kolla-ansible/ansible/inventory/all-in-one . # 关键一步使用Ansible对目标节点进行预检查确保所有先决条件满足。 # 这个步骤会检查Docker、Python、内核参数、系统资源等。 kolla-ansible -i ./all-in-one prechecks如果prechecks通过你会看到一大片绿色的OK或Changed提示。如果有红色FAILED一定要根据错误信息逐一解决。常见问题包括SELinux未禁用、内核参数未设置、Docker未启动、内存不足等。预检查通过后就可以拉取庞大的Docker镜像了。# 拉取所有需要的OpenStack服务镜像这步耗时较长取决于网络。 kolla-ansible -i ./all-in-one pull最后运行部署命令这将创建并启动所有容器。# 部署并启动所有OpenStack服务容器 kolla-ansible -i ./all-in-one deploy部署过程可能需要20分钟到1小时取决于机器性能和网络速度。过程中会滚动输出各个任务的执行状态。如果中途报错不要慌张仔细阅读错误日志。常见的可修复错误包括端口冲突某个服务端口被占用、镜像拉取失败网络问题、某个容器启动超时资源不足。3.4 安装OpenStack客户端与初始化部署完成后OpenStack服务都在容器里跑起来了但我们还需要在宿主机上安装命令行客户端并生成管理员的环境变量脚本openrc文件来操作它。# 安装OpenStack客户端 pip install python-openstackclient python-glanceclient python-novaclient python-neutronclient python-cinderclient # 生成管理员权限的openrc文件 kolla-ansible post-deploy # 这个命令会在当前目录生成一个 admin-openrc.sh 文件 source admin-openrc.shsource这个脚本后你的命令行就具备了管理员权限。接下来初始化一些必要的网络和镜像。# 初始化网络供应商网络、子网等 /usr/local/share/kolla-ansible/init-runonceinit-runonce是一个脚本它会创建一个名为public1的供应商网络对应你配置的br-ex一个子网并上传一个Cirros测试镜像一个小型Linux镜像。你可以查看这个脚本的内容它是学习OpenStack CLI命令的好例子。至此打开浏览器访问你的管理网IP地址或VIP地址的80端口如http://192.168.1.100应该就能看到HorizonOpenStack Dashboard的登录界面了。用户名是admin密码在passwords.yml文件里的keystone_admin_password字段。4. 部署后关键操作与排坑指南登录Dashboard只是开始要让这个云平台真正能用还需要完成几个关键配置这也是新手最容易卡住的地方。4.1 安全组与浮动IP让虚拟机连通外网默认的安全组规则非常严格会禁止所有外部访问虚拟机的流量。你需要添加规则。在Dashboard上操作登录后进入“计算” - “安全组”。点击“default”安全组右侧的“管理规则”。添加以下规则方向入站协议ICMP端口-CIDR0.0.0.0/0允许所有Ping方向入站协议TCP端口22CIDR0.0.0.0/0允许SSH方向入站协议TCP端口1:65535CIDR你的内部网络CIDR允许内网所有TCP端口可选方向出站通常默认是允许所有无需修改。创建浮动IP池并关联虚拟机默认只有内网IP。要能从外部访问需要绑定浮动IP。进入“网络” - “浮动IP”点击“分配IP给项目”。从“池”中选择你初始化时创建的public1网络分配一个IP。创建虚拟机实例后在实例操作菜单中选择“绑定浮动IP”选择刚才分配的IP即可。4.2 镜像、规格与实例创建启动你的第一台云主机镜像init-runonce脚本已经上传了cirros镜像。对于更实用的测试我推荐下载并上传Ubuntu Cloud Image。你可以通过命令行操作# 下载Ubuntu 22.04云镜像 wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img # 上传到Glance服务并设置最小磁盘和内存要求 openstack image create --file jammy-server-cloudimg-amd64.img --disk-format qcow2 --container-format bare --public --property hw_disk_busscsi --property hw_scsi_modelvirtio-scsi --min-disk 10 --min-ram 2048 Ubuntu 22.04 Cloud规格Flavor规格定义了虚拟机的CPU、内存和磁盘大小。默认有一些规格但你可能需要自定义。在Dashboard上“计算” - “规格”点击“创建规格”。例如创建一个名为m1.tiny的规格VCPU1内存2048MB根磁盘20GB。创建实例“计算” - “实例”点击“启动实例”。填写实例名称选择刚才创建的规格和镜像。网络选择privateinit-runonce创建的内部网络。安全组选择default。点击“启动实例”。稍等片刻实例状态变为“运行中”即表示创建成功。然后为其绑定之前申请的浮动IP就可以通过SSH连接了对于Ubuntu镜像用户通常是ubuntu需要注入密钥对Cirros镜像用户是cirros密码是gocubsgo。4.3 常见故障排查当事情不按预期发展Dashboard无法访问检查kolla_internal_vip_address是否配置正确以及宿主机防火墙是否放行了80端口。单节点下VIP会绑定在管理网卡上用ip addr show查看。实例创建失败状态为“错误”这是最复杂的情况。点击实例名称查看“日志”选项卡通常会有错误信息。更详细的日志需要登录到容器内部查看。# 查看Nova相关容器的日志 docker logs nova_compute docker logs nova_conductor docker logs nova_api # 或者进入容器查看实时日志 docker exec -it nova_compute tail -f /var/log/nova/nova-compute.log常见原因资源不足内存/磁盘、虚拟化未开启检查/proc/cpuinfo是否有vmx或svm标志、镜像格式问题、网络配置错误。虚拟机无法获取IP地址检查Neutron的DHCP Agent容器是否正常运行 (docker ps | grep dhcp)。检查br-ex网桥是否成功桥接了物理网卡并且物理网卡连接的上级网络如你的路由器是否允许DHCP请求通过。“No valid host was found”错误Nova调度器找不到合适的计算节点。检查Nova计算服务nova-compute容器是否健康 (docker ps | grep nova_compute)并检查计算节点的资源报告是否正常 (openstack compute service list和openstack hypervisor list)。部署和初步使用Kolla-ansible单节点OpenStack是一个系统性工程。它考验的不仅仅是对命令的熟悉程度更是对Linux系统、网络、容器和OpenStack架构的基本理解。按照上述步骤耐心解决每个阶段出现的问题你最终会获得一个宝贵的、完全由自己掌控的云平台实验环境。这个环境将成为你深入学习OpenStack、测试新功能、甚至开发相关应用的绝佳沙盒。记住第一次部署遇到问题是常态每一个错误的解决都是经验的积累。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进