ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

使用Kolla-ansible快速部署OpenStack单节点私有云环境

2026/8/23 20:52:34 拓冰建站 浏览量
使用Kolla-ansible快速部署OpenStack单节点私有云环境 1. 项目概述与核心价值最近在社区里看到不少朋友对私有云平台搭建感兴趣尤其是想在自己的开发机或者一台性能还不错的服务器上快速体验一个完整的OpenStack环境。直接上手多节点部署光是网络规划和硬件准备就能劝退一大波人。所以今天我想详细聊聊用Kolla-ansible部署OpenStack all-in-one单节点版本这件事。这可以说是目前个人学习、功能验证或者小规模开发测试环境下门槛最低、效率最高的OpenStack部署方案了。简单来说Kolla-ansible是OpenStack官方孵化的一个项目它把OpenStack的各个服务组件都打包成了Docker容器然后用Ansible这个自动化工具来编排和管理这些容器的部署、配置和生命周期。而“all-in-one”单节点模式顾名思义就是把控制节点、计算节点、网络节点等所有OpenStack服务全部塞到一台物理机或虚拟机里。你不需要纠结复杂的网络拓扑也不用准备多台机器一台配置过得去的机器就能跑起来。对于想快速理解OpenStack架构、测试新功能、或者为CI/CD流水线准备一个临时云环境的开发者来说这简直是福音。我自己的开发测试环境就常年跑着一个all-in-one的OpenStack随时可以拉起虚拟机做各种实验非常方便。2. 环境准备与前置条件解析2.1 硬件与操作系统要求部署前硬件是基础。虽然说是单节点但OpenStack本身是个资源消耗大户别指望用一台2核4G的机器就能流畅运行。根据我的经验一个能提供基本可用体验的all-in-one环境建议满足以下配置CPU: 至少4核物理核心支持硬件虚拟化Intel VT-x或AMD-V。这是为了后续在OpenStack里创建虚拟机Nova计算服务所必须的。你可以通过命令egrep -c ‘(vmx|svm)’ /proc/cpuinfo来检查输出大于0即表示支持。内存: 最低16GB推荐32GB或以上。因为除了宿主机操作系统所有OpenStack服务都以容器形式运行再加上你可能要启动的测试虚拟机内存是消耗最快的资源。我曾在16GB的机器上部署跑起来后基本没剩多少余量启动一个最小规格的虚拟机都吃力。磁盘: 至少100GB可用空间推荐使用SSD。磁盘空间主要用于存放Docker镜像、容器数据卷、以及将来虚拟机的镜像和卷。如果使用Cinder块存储服务还需要额外的空间。机械硬盘的性能会成为整个系统的瓶颈尤其是在创建虚拟机镜像时。网络: 至少一块物理网卡。虽然all-in-one简化了网络但为了虚拟机能够访问外网这块网卡最好能直接连接到有互联网访问权限的网络中。操作系统方面目前Kolla-ansible主要支持CentOS 7、CentOS 8 Stream、Ubuntu 20.04/22.04等。我个人更倾向于使用CentOS 7或Ubuntu 22.04 LTS因为社区在这两个系统上的实践最丰富遇到问题也最容易找到解决方案。本文将以Ubuntu 22.04 LTS为例进行说明。2.2 关键软件依赖安装操作系统安装完毕后我们需要先搭建好Kolla-ansible的运行舞台。这里有几个核心依赖必须处理好。首先是Python环境。Kolla-ansible本身是Python写的而且它通过Ansible与Docker交互。Ubuntu 22.04默认的Python 3.10版本就可以。我们需要安装pipPython包管理工具和virtualenv虚拟环境工具。使用虚拟环境是一个好习惯它能将项目依赖与系统Python环境隔离避免版本冲突。sudo apt update sudo apt install python3-pip python3-venv -y接下来是Ansible。Kolla-ansible对Ansible版本有要求通常需要较新的版本。我们通过pip在虚拟环境里安装。python3 -m venv /path/to/your/venv # 例如: ~/kolla-venv source /path/to/your/venv/bin/activate pip install -U pip pip install ‘ansible6,9’然后是Docker。这是Kolla的基石所有服务都运行在容器中。我们需要安装Docker CE社区版并启动服务。sudo apt install apt-transport-https ca-certificates curl software-properties-common -y curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo “deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/docker-archive-keyring.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 sudo apt install docker-ce docker-ce-cli containerd.io -y sudo systemctl enable --now docker注意务必把当前用户加入到docker组否则后续执行Ansible剧本时会因为没有权限操作Docker而失败。执行sudo usermod -aG docker $USER后需要退出当前终端会话并重新登录这个组权限变更才会生效。这是一个非常常见的踩坑点。最后安装Kolla-ansible本身。同样在激活的虚拟环境中使用pip安装。pip install kolla-ansible安装完成后Kolla-ansible提供了一些配置文件样例我们需要把它们复制到工作目录。通常我们会建立一个专门的目录如/etc/kolla来存放所有配置。sudo mkdir -p /etc/kolla sudo chown $USER:$USER /etc/kolla cp -r /path/to/your/venv/share/kolla-ansible/etc_examples/kolla/* /etc/kolla/ cp /path/to/your/venv/share/kolla-ansible/ansible/inventory/* .这里复制了两个关键东西一个是/etc/kolla/下的各种配置文件模板globals.yml,passwords.yml等另一个是Ansible的库存inventory文件样例。对于all-in-one我们主要使用all-in-one这个库存文件。3. 核心配置详解与定制化3.1 库存文件与网络规划库存文件inventory告诉Ansible要在哪些机器上部署什么服务。对于all-in-one文件非常简单。打开我们复制过来的all-in-one文件内容大致如下[control] localhost ansible_connectionlocal [network] localhost ansible_connectionlocal [compute] localhost ansible_connectionlocal [monitoring] localhost ansible_connectionlocal [storage] localhost ansible_connectionlocal [deployment] localhost ansible_connectionlocal所有主机组都指向了localhost并且指定了ansible_connectionlocal这意味着Ansible将在本地执行所有任务不需要SSH到其他机器。检查一下这个文件确保没有错误即可。网络规划是OpenStack部署中最复杂的一环好在all-in-one模式极大地简化了它。Kolla默认提供几种网络模型对于单节点我们通常选择最简单的neutron选项并搭配linuxbridge或openvswitch作为虚拟网络后端。在初始学习阶段我推荐使用linuxbridge它更简单对宿主机的网络配置侵入性小。我们需要关心的主要是三个网络管理网络OpenStack各服务内部通信的网络比如Nova和Glance的API调用。在all-in-one中通常使用宿主机的某个网卡比如eth0或者直接使用localhost的地址。业务网络Tenant Network虚拟机之间以及虚拟机与外部通信的网络。我们需要为这个网络指定一个物理接口。例如你的宿主机有一块叫ens33的网卡连接着可以上网的交换机那么就把这个网卡作为业务网络的出口。外部网络External Network在OpenStack里创建的一个虚拟网络用于为虚拟机提供浮动IPFloating IP使其能够被外部访问。这个网络需要与宿主机的业务网络物理接口桥接。3.2 全局配置文件精讲核心的配置都在/etc/kolla/globals.yml这个文件里。我们需要根据自己环境修改它。下面我挑一些最关键、最容易出错的配置项来说。kolla_base_distro: 指定基础操作系统镜像类型根据你的宿主机选择。对于Ubuntu填”ubuntu”。kolla_install_type: 安装类型我们选择”source”或”binary”。”binary”会从Docker Hub拉取预编译的镜像更快更稳定适合生产和个人使用。”source”则会从源码构建镜像耗时极长主要用于开发调试。openstack_release: 指定要部署的OpenStack版本比如”zed”,”yoga”,”xena”等。务必选择一个与你的Kolla-ansible版本兼容的稳定版本。可以通过kolla-ansible --version查看支持的版本。kolla_internal_vip_address: 内部虚拟IP地址。在单节点中可以设置为宿主机的一个未被使用的IP例如”192.168.100.100”。这个VIP会被用于访问OpenStack的API端点如Horizon dashboard。network_interface: 这是管理网络的物理接口名称。填写你的宿主机上用于内部通信的网卡名例如”eth0″或”ens33″。你可以用ip addr命令查看。neutron_external_interface: 这是业务网络/外部网络的物理接口名称。这是最关键的一项配置填写你希望虚拟机用来连接外网的那块物理网卡名。例如”eth1″。如果只有一块网卡也可以和network_interface填同一个但这样管理流量和业务流量会混在一起。neutron_plugin_agent: 网络插件代理我们选择”linuxbridge”。enable_cinder: 是否启用块存储服务。对于all-in-one学习环境可以设为”no”以简化部署。如果需要测试卷功能可以设为”yes”并配置cinder_volume_group。enable_heat: 是否启用编排服务。初期可以设为”no”。enable_swift: 是否启用对象存储服务。初期可以设为”no”。一个针对Ubuntu 22.04、单网卡(ens33)的简化配置示例如下kolla_base_distro: “ubuntu” kolla_install_type: “binary” openstack_release: “yoga” kolla_internal_vip_address: “192.168.100.100” network_interface: “ens33” neutron_external_interface: “ens33” neutron_plugin_agent: “linuxbridge” enable_cinder: “no” enable_heat: “no” enable_swift: “no”3.3 密码文件生成与安全/etc/kolla/passwords.yml文件存储了所有OpenStack服务的密码。Kolla-ansible提供了一个工具来生成随机的强密码。kolla-ansible -i ./all-in-one passwords这个命令会读取globals.yml然后在passwords.yml中为所有需要密码的服务生成随机密码。务必妥善保管这个文件它是你OpenStack环境的钥匙。你也可以手动编辑这个文件使用自己设定的密码但必须保证所有密码都已设置且符合复杂度要求。实操心得在生成密码后我习惯将passwords.yml备份到安全的地方。同时在globals.yml中可以设置keystone_admin_password来指定OpenStack管理员admin的密码这样登录Horizon控制台时就不用去翻密码文件了。4. 部署执行与深度操作解析4.1 完整部署流程与命令详解配置完成后就可以开始部署了。部署过程主要分为三个大的步骤每一步都有其明确的目的。第一步引导服务器Bootstrap这个步骤检查目标服务器的环境安装一些必要的依赖包比如Docker Python客户端、一些系统工具等。kolla-ansible -i ./all-in-one bootstrap-servers如果这一步失败通常是因为网络问题无法下载包或者权限问题当前用户不在docker组。根据错误信息仔细排查。第二步进行部署前检查Prechecks这是极其重要的一步。它会全面检查你的配置是否合理包括磁盘空间、内存大小、内核参数、SELinux状态、网络接口配置等。它会提前发现很多潜在问题。kolla-ansible -i ./all-in-one prechecks请务必仔细阅读prechecks的输出任何FAILED或WARNING都需要处理。常见的警告包括内核参数net.ipv4.ip_forward未开启、bridge-nf-call-iptables未设置等。你可以根据提示编辑/etc/sysctl.conf文件并执行sudo sysctl -p来应用修改。第三步拉取镜像并部署Deploy这是最耗时的一步。Kolla-ansible会根据配置从Docker仓库拉取所有必要的OpenStack服务镜像然后创建并启动容器。kolla-ansible -i ./all-in-one deploy这个过程视网络速度和机器性能可能需要30分钟到数小时。你可以观察输出它会显示当前正在执行的任务。如果中途失败错误信息通常会非常详细指出是哪个服务的哪个环节出了问题。第四步生成管理员账户的OpenRC文件部署成功后OpenStack服务都跑起来了但我们还需要一个凭证文件来通过命令行CLI操作它。kolla-ansible -i ./all-in-one post-deploy这个命令会在当前目录生成一个admin-openrc.sh文件。执行source admin-openrc.sh就会将管理员的环境变量如用户名、密码、认证地址等注入当前shell之后你就可以使用openstack、nova、neutron等命令了。4.2 验证部署与初步访问部署完成后如何验证一切正常检查容器状态docker ps | grep -v pause你应该能看到几十个状态为Up的容器分别对应nova-api、neutron-server、glance-api、keystone、horizon等。如果有大量Exited状态的容器说明部署有问题。访问Horizon控制台 在浏览器中输入你配置的VIP地址例如http://192.168.100.100。使用用户名admin和你设定的密码或在passwords.yml中keystone_admin_password对应的密码登录。如果能成功登录并看到仪表盘说明核心服务基本正常。使用命令行验证source admin-openrc.sh openstack token issue这条命令会获取一个Keystone令牌。如果成功返回令牌信息说明身份认证服务Keystone工作正常。openstack image list openstack network list openstack flavor list这些命令分别查看镜像、网络和虚拟机规格。初始状态下镜像和网络列表应该是空的规格列表会有一些默认项。4.3 创建第一个虚拟机实例现在让我们创建一个虚拟机来检验整个IaaS流程是否打通。这需要几个步骤1. 创建虚拟网络我们需要创建一个供虚拟机连接的网络。这里我们创建一个名为test-net的提供商网络provider network它直接映射到我们之前配置的neutron_external_interface物理网卡上。openstack network create --share --external --provider-physical-network physnet1 --provider-network-type flat test-net openstack subnet create --network test-net --subnet-range 192.168.1.0/24 --gateway 192.168.1.1 --allocation-pool start192.168.1.100,end192.168.1.200 test-subnet请将192.168.1.0/24替换成你物理网络实际使用的网段。physnet1是Kolla默认的映射名称对应globals.yml中的neutron_external_interface。2. 下载一个测试镜像OpenStack使用镜像来创建虚拟机。我们下载一个小的Cirros镜像进行测试。wget http://download.cirros-cloud.net/0.5.2/cirros-0.5.2-x86_64-disk.img openstack image create --file cirros-0.5.2-x86_64-disk.img --disk-format qcow2 --container-format bare --public cirros3. 创建安全组规则默认的安全组禁止所有入站流量。我们添加一条规则允许ICMPping和SSH。openstack security group rule create --proto icmp default openstack security group rule create --proto tcp --dst-port 22 default4. 启动虚拟机openstack server create --flavor m1.tiny --image cirros --network test-net test-vm-1使用openstack server list查看虚拟机状态直到它变为ACTIVE。然后使用openstack server show test-vm-1查看其详细信息获取分配到的IP地址通常是192.168.1.100这个池子里的一个。尝试从宿主机ping这个IP如果通恭喜你一个完整的OpenStack all-in-one环境已经成功运行5. 运维、问题排查与进阶技巧5.1 日常运维命令部署不是终点日常维护同样重要。启动/停止/重启所有OpenStack服务kolla-ansible -i ./all-in-one stop kolla-ansible -i ./all-in-one start kolla-ansible -i ./all-in-one restart查看特定服务的日志docker logs kolla_nova_api # 查看nova-api容器的日志 docker logs -f kolla_neutron_server # 实时跟踪neutron-server日志进入容器内部调试docker exec -it kolla_keystone bash升级OpenStack版本 升级是一个谨慎的过程。需要修改globals.yml中的openstack_release然后拉取新版本镜像并重新部署。kolla-ansible -i ./all-in-one pull # 拉取新镜像 kolla-ansible -i ./all-in-one deploy # 重新部署Ansible会执行滚动升级务必在测试环境充分验证升级流程后再在生产环境操作5.2 常见问题与排查实录即使按照步骤操作也难免会遇到问题。这里记录几个我踩过的坑和排查思路。问题1部署过程中在TASK [common : Ensure container images are present]卡住或失败。可能原因网络问题导致无法从Docker Hub拉取镜像或者globals.yml中指定的openstack_release版本与Kolla-ansible版本不兼容。排查手动尝试拉取一个镜像docker pull kolla/centos-source-keystone:yoga请替换你的发行版和版本。如果很慢或失败考虑配置国内镜像加速器。检查kolla-ansible --version和globals.yml中的openstack_release是否匹配官方支持矩阵。问题2Horizon控制台可以登录但创建虚拟机失败状态一直为ERROR。可能原因计算服务Nova问题网络服务Neutron问题镜像问题。排查docker logs kolla_nova_compute查看计算节点日志看是否有资源不足如内存、libvirt错误等信息。docker logs kolla_nova_conductor查看调度日志。docker logs kolla_neutron_linuxbridge_agent查看网络代理日志检查网桥是否创建成功。使用brctl show命令查看宿主机上的网桥。检查虚拟机镜像的格式和元数据是否正确。问题3虚拟机启动后无法获取IP地址或无法ping通网关。可能原因DHCP服务Neutron DHCP Agent未正常工作安全组或网络策略阻止物理网络接口未正确桥接。排查docker logs kolla_neutron_dhcp_agent查看DHCP代理日志。在宿主机上检查由Neutron创建的网桥通常名为brqXXXXXX是否已经正确添加了物理接口neutron_external_interface指定的那个和虚拟机的tap设备。使用brctl show bridge_name查看。进入虚拟机内部可以通过VNC或控制台手动检查网卡配置和DHCP请求过程。问题4执行source admin-openrc.sh后OpenStack CLI命令仍然报认证错误。可能原因Keystone服务异常VIP地址不可达环境变量中的密码错误。排查docker logs kolla_keystone查看Keystone日志。检查admin-openrc.sh文件中的OS_AUTH_URL是否指向正确的VIP地址和端口通常是http://vip:5000/v3。确认OS_PASSWORD是否正确可以对照/etc/kolla/passwords.yml中的keystone_admin_password。5.3 性能调优与资源管理All-in-one部署在一台机器上资源争用是常态。几个优化方向Docker存储驱动默认的overlay2驱动性能不错确保/var/lib/docker目录位于SSD上。可以定期清理无用的镜像和容器释放空间docker system prune -a。宿主机内核参数确保/etc/sysctl.conf中已按prechecks的提示优化了网络相关参数如net.ipv4.ip_forward1,net.bridge.bridge-nf-call-iptables1等。OpenStack服务配置对于学习环境可以禁用一些不常用的服务来节省资源比如TelemetryCeilometer、Aodh告警等。在globals.yml中将enable_开头的对应项设为”no”。虚拟机规格管理合理定义Flavor。默认的m1.tiny1核512MB内存可能太小导致Cirros镜像都启动困难。可以创建更适合自己主机资源的规格。监控部署简单的监控如cAdvisorPrometheusGrafana监控宿主机的CPU、内存、磁盘IO以及Docker容器的资源使用情况便于及时发现瓶颈。5.4 从单节点扩展到多节点的思考虽然本文主题是all-in-one但了解如何扩展是很有必要的。Kolla-ansible的多节点部署库存文件multinode将主机分到了control,network,compute,storage等不同组。扩展的核心步骤是准备多台满足要求的服务器并做好主机名解析、SSH免密互通。根据规划修改multinode库存文件将各主机IP填入对应的组。在globals.yml中更精细地配置不同角色的网络接口。例如控制节点和网络节点可能需要多个网卡分别对接管理网络、业务网络、存储网络等。重新运行bootstrap-servers,prechecks,deploy。从单节点到多节点最大的挑战从“如何跑起来”变成了“如何规划网络和存储”。需要预先设计好清晰的物理网络拓扑和存储后端如Ceph集群这部分内容足以另开一篇长文来讨论。但有了all-in-one的扎实实践你对各组件的交互方式已经有了直观感受再去理解多节点部署就会容易得多。