OpenStack容器化部署实战:基于kolla-ansible的生产级私有云搭建指南

OpenStack容器化部署实战:基于kolla-ansible的生产级私有云搭建指南
1. 项目概述当OpenStack遇上容器化如果你在运维或者云平台领域摸爬滚打过几年一定对OpenStack这个名字又爱又恨。爱的是它开源、灵活能让你从硬件层面开始构建一个功能完整的私有云恨的是它的部署和维护那真是一言难尽。传统的基于源码或软件包的部署方式依赖关系复杂升级过程堪比“走钢丝”一个服务的配置文件出错可能就得折腾大半天。我自己就经历过为了升级一个Nova版本排查到凌晨三点的“美好”回忆。所以当容器化技术席卷而来时很多OpenStack运维都在想能不能把Keystone、Nova、Neutron这些服务也打包成容器用Docker和Kubernetes那套声明式、可重复的方式来管理这个想法催生了Kolla项目。而kolla-ansible正是这个想法落地后目前在生产环境中最成熟、应用最广泛的实践工具。简单来说它是一套用Ansible自动化工具来部署和管理由Kolla项目构建的OpenStack Docker容器镜像的方案。它的核心使命很明确为运营OpenStack云提供生产就绪的容器和部署工具。对于刚接触的同行你可以把它理解为一个“OpenStack容器化部署的全家桶”。你不需要再去一个个源码编译、处理pip依赖冲突、手动配置各个服务的ini文件。kolla-ansible已经帮你把这一切都标准化、模板化了。你准备好满足要求的服务器物理机或虚拟机写好一个全局的配置文件然后运行几条ansible-playbook命令一个高可用的OpenStack集群就能自动构建起来。这对于想要快速搭建POC环境、进行版本升级测试甚至是构建生产级私有云平台的团队来说吸引力是巨大的。2. 核心架构与设计哲学拆解要玩转kolla-ansible不能只停留在“跑通命令”的层面理解其背后的设计思路才能在遇到问题时心中有数进行定制化调整。2.1 “固执己见”的默认配置官方文档里有一句话非常关键“Kolla is highly opinionated out of the box, but allows for complete customization.”翻译过来就是它开箱即用带有强烈的“固执己见”的默认配置但也允许完全的自定义。这是什么意思举个例子在传统部署中你可能会纠结MariaDB用哪个版本、RabbitMQ的集群模式怎么配、Neutron用OVS还是Linux Bridge。kolla-ansible帮你做了选择数据库用MariaDB Galera集群实现高可用消息队列用RabbitMQ镜像队列网络默认用Open vSwitchOVS。并且它已经为这些组件以及所有OpenStack服务从Aodh到Watcher列表非常全准备好了经过充分测试的Docker镜像。这种“固执己见”极大地降低了入门门槛和选择成本。你不需要成为每一个组件的专家就能获得一个经过社区验证的、相对最优的默认生产配置。这对于大多数标准场景是完全够用的。2.2 Ansible与Docker的分工协作kolla-ansible的架构清晰地划分了职责Kolla项目负责构建所有服务的Docker镜像。它定义了每个服务的Dockerfile、启动脚本、依赖包等。你可以把它想象成一个高度自动化的镜像工厂。kolla-ansible项目负责部署和编排这些镜像。它利用Ansible的幂等性idempotent特性通过一系列Playbook和Role在目标主机上执行诸如拉取镜像、生成配置文件、创建并启动容器、配置服务间网络等操作。这种分离带来了巨大好处。当需要升级OpenStack版本时你通常只需要更新Kolla的镜像版本标签然后重新运行kolla-ansible的部署命令。Ansible Playbook会对比当前状态与目标状态只进行必要的变更如重启容器实现了平滑升级。这比传统方式动辄需要手动迁移数据库、更新大量配置文件要安全可靠得多。2.3 全容器化的服务与基础设施kolla-ansible不仅容器化了OpenStack服务还把周边的基础设施组件也一并打包了。这形成了一个完全自包含的、与环境隔离的部署单元。我们来看看它涵盖的范围核心OpenStack服务从计算Nova、网络Neutron、存储Cinder, Swift、镜像Glance、身份Keystone到高级服务如编排Heat、容器编排Magnum、负载均衡Octavia、监控Ceilometer等一应俱全。支撑性基础设施数据库MariaDB Galera集群确保数据高可用。消息队列RabbitMQ服务间通信的骨干。缓存Memcached用于会话和令牌缓存。高可用与负载均衡HAProxy Keepalived为API端点提供虚拟IP和负载均衡。网络Open vSwitch作为Neutron的默认后端。键值存储Etcd用于某些需要分布式协调的服务。可观测性栈可选但强烈推荐日志Fluentd日志收集- OpenSearch存储- OpenSearch Dashboards可视化。这替代了传统的ELK/EFK栈提供了集中的日志管理能力。监控Collectd指标收集- Prometheus存储与告警- Grafana可视化。这让你可以像监控Kubernetes集群一样监控你的OpenStack集群。这种“全家桶”式设计意味着你用一套工具就能建立起一个功能完备、自带监控日志的云平台极大地简化了技术栈的复杂度。3. 部署前准备与环境规划实战纸上谈兵终觉浅我们直接进入实战环节。假设我们要部署一个高可用的生产环境至少3控制节点若干计算节点以下是详细的准备步骤和避坑指南。3.1 硬件与操作系统要求kolla-ansible对硬件有一定要求特别是控制节点。控制节点建议至少4核CPU16GB内存100GB磁盘。内存尤其重要因为多个核心服务容器数据库、消息队列、多个API服务会同时运行。计算节点根据虚拟机负载规划通常需要更多CPU和内存。磁盘要预留足够空间给实例镜像和卷。网络至少需要两个网络平面管理网络用于Ansible SSH、容器间通信、服务API访问。需要可靠且低延迟。租户网络/外部网络用于虚拟机实例之间的通信以及访问外网。生产环境通常还会分离存储网络如Cinder存储流量。操作系统CentOS 7/8 Stream、Rocky Linux 8/9、Ubuntu 20.04/22.04是经过充分测试的。我个人强烈推荐Rocky Linux 8或9它是CentOS的继承者社区活跃与RHEL生态兼容性好。注意在所有节点上务必禁用防火墙firewalld/ufw和SELinux或者为Docker和Kolla相关进程配置正确的策略。在初期部署和测试阶段直接禁用是最简单避免网络问题的办法。生产环境如需开启需额外仔细配置。3.2 部署节点Deploy Node配置部署节点是一台用于执行Ansible命令的“指挥中心”它可以是一台独立的机器也可以是控制节点之一。在这台机器上我们需要安装kolla-ansible。# 1. 安装基础依赖和Python虚拟环境 sudo yum install -y python3-devel libffi-devel gcc openssl-devel python3-pip git sudo pip3 install -U pip sudo pip3 install virtualenv # 2. 创建并激活虚拟环境强烈建议避免污染系统Python环境 mkdir ~/kolla-venv python3 -m venv ~/kolla-venv source ~/kolla-venv/bin/activate # 3. 安装Ansible和kolla-ansible # 首先升级pip至最新版 pip install -U pip # 安装指定版本的ansible和kolla-ansible例如针对OpenStack Yoga版本 pip install ansible4,9 kolla-ansible14.0.0 # 请根据所需OpenStack版本查阅官方文档确认对应版本 # 4. 复制配置文件到/etc/kolla目录 sudo mkdir -p /etc/kolla sudo cp -r ~/kolla-venv/share/kolla-ansible/etc_examples/kolla/* /etc/kolla/ # 复制Ansible清单文件示例 sudo cp ~/kolla-venv/share/kolla-ansible/ansible/inventory/* /etc/kolla-ansible/3.3 全局配置文件解析与定制kolla-ansible的核心配置是两个文件/etc/kolla/globals.yml和/etc/kolla-ansible/inventory/multinode或你自定义的清单文件。1. 清单文件 (inventory)multinode文件是一个Ansible库存文件定义了哪些主机扮演什么角色。# /etc/kolla-ansible/inventory/multinode 示例部分 [control] # 指定3个控制节点主机名需能在网络中解析或直接使用IP control01 ansible_host192.168.1.101 control02 ansible_host192.168.1.102 control03 ansible_host192.168.1.103 [network] # 网络节点可以与控制节点复用 control01 control02 control03 [compute] # 计算节点 compute01 ansible_host192.168.1.201 compute02 ansible_host192.168.1.202 [monitoring] # 监控节点通常放在控制节点上 control01 [storage] # 存储节点如果部署Cinder LVM后端等 # storage01 ansible_host192.168.1.301 # 下面的分组定义了上面主机的子集用于特定任务 [control:children] control [network:children] network [compute:children] compute [monitoring:children] monitoring [storage:children] storage2. 全局配置文件 (globals.yml)这个文件是灵魂你需要仔细修改。以下是一些关键配置及其含义# /etc/kolla/globals.yml 关键配置示例 # 1. 基础配置 kolla_base_distro: centos # 或 rocky, ubuntu kolla_install_type: binary # 使用预编译的二进制包比source更快更稳定 openstack_release: yoga # 指定要部署的OpenStack版本如wallaby, xena, yoga, zed # 2. 网络配置 - 这是最容易出错的地方 network_interface: eth1 # 节点上用于管理网络的物理网卡Ansible SSH容器管理流量 neutron_external_interface: eth2 # 节点上用于外部/租户网络的物理网卡虚拟机浮动IP等 kolla_internal_vip_address: 192.168.1.100 # 高可用虚拟IP必须在管理网段内且未被占用 # 3. 启用或禁用服务 # 根据你的需求启用或禁用某些服务以简化部署或启用高级功能 enable_cinder: yes # 启用块存储 enable_cinder_backup: no # 禁用Cinder备份除非需要 enable_heat: yes # 启用编排服务 enable_magnum: no # 禁用容器编排服务除非需要Kubernetes as a Service enable_octavia: yes # 启用负载均衡服务 enable_grafana: yes # 启用监控可视化强烈建议 enable_prometheus: yes # 启用监控指标收集 enable_central_logging: yes # 启用集中式日志Fluentd-OpenSearch # 4. 自定义镜像仓库如果从本地或私有仓库拉取 # docker_registry: registry.example.com:5000 # docker_namespace: kolla # 5. 安全与密码 # 初始部署后kolla-ansible会生成所有服务的密码存放在 /etc/kolla/passwords.yml # 你可以预先生成或让工具自动生成。生产环境建议预生成并妥善保管。 # 运行 kolla-genpwd 可以生成密码文件。实操心得在第一次部署时我建议先在一个All-in-One (AIO)单节点环境上测试。你可以创建一个虚拟机至少8GB内存50GB磁盘在清单文件中只定义一个节点并在globals.yml中设置enable_heat、enable_magnum等为no以最小化资源占用。这能帮你快速熟悉整个流程验证网络和基础配置是否正确。4. 完整部署流程与核心环节详解环境准备好后我们就可以开始部署了。整个过程是幂等的意味着你可以安全地重复运行Ansible只会应用必要的更改。4.1 第一步环境预检与依赖部署在运行主部署命令前有两个关键的准备步骤# 1. 生成密码文件如果尚未生成 sudo kolla-genpwd # 2. 运行预检查Bootstrap-servers # 这个步骤会在所有目标节点上安装基础依赖如Docker、Python客户端、常用工具并配置系统参数。 # 使用 -i 指定你的清单文件 cd /etc/kolla-ansible sudo kolla-ansible -i ./inventory/multinode bootstrap-serversbootstrap-servers会做很多事情安装Docker CE、配置Docker镜像加速器、安装python3-docker客户端、调整内核参数如net.ipv4.ip_forward、提高进程和文件描述符限制等。务必仔细查看这个步骤的输出确保所有节点都成功完成没有报错。4.2 第二步拉取容器镜像这是一个比较耗时的步骤因为它会从Docker Hub或你配置的私有仓库拉取所有需要的镜像镜像总大小可能超过10GB。sudo kolla-ansible -i ./inventory/multinode pull避坑技巧如果网络条件不好这个步骤可能会失败或极慢。有几种解决方案配置国内镜像加速器在所有节点的/etc/docker/daemon.json中配置阿里云、腾讯云等镜像加速器。搭建本地镜像仓库在一台有良好网络的主机上先pull所有镜像然后推送到内部的Harbor或Docker Registry最后修改globals.yml中的docker_registry指向这个内部仓库。这是生产环境的推荐做法。使用离线镜像包社区有时会提供特定版本的离线镜像tarball。4.3 第三步核心部署这是最关键的一步Ansible将根据配置在所有节点上创建并启动容器配置服务初始化数据库。sudo kolla-ansible -i ./inventory/multinode deploy这个过程会持续较长时间从几十分钟到数小时取决于节点数量和网络速度。Ansible会按角色顺序执行任务先部署基础设施MariaDB, RabbitMQ, Memcached然后是核心OpenStack服务Keystone, Glance, Nova, Neutron等最后是附加服务。在此期间你需要密切关注输出如果出现FAILED状态不要惊慌。先看错误信息。常见的初期错误包括网络问题容器间无法通信检查network_interface配置是否正确防火墙是否已关闭。镜像缺失某个镜像拉取失败检查pull步骤是否完全成功。端口冲突某个端口已被占用检查主机上是否有其他服务如原生MySQL在运行。使用docker ps和docker logs container_name命令在出问题的节点上查看容器状态和日志是定位问题最快的方法。4.4 第四步生成管理员账户与验证部署完成后需要生成OpenStack的管理员权限文件openrc以便使用命令行工具。sudo kolla-ansible -i ./inventory/multinode post-deploy # 这个命令会生成 /etc/kolla/admin-openrc.sh 文件 source /etc/kolla/admin-openrc.sh现在你可以使用OpenStack客户端命令进行验证了# 1. 检查Keystone服务列表身份认证 openstack service list # 应该能看到identity, compute, network, image等服务端点。 # 2. 检查Nova计算服务状态 openstack compute service list # 所有计算节点的nova-compute服务状态应为 up。 # 3. 检查Neutron网络代理状态 openstack network agent list # 各种Neutron代理openvswitch, dhcp, l3等状态应为 up。 # 4. 上传一个测试镜像 wget -O cirros.img http://download.cirros-cloud.net/0.5.2/cirros-0.5.2-x86_64-disk.img openstack image create --file cirros.img --disk-format qcow2 --container-format bare --public Cirros 0.5.2 openstack image list如果以上命令都能成功执行并返回预期结果那么恭喜你一个基于容器的OpenStack集群已经部署成功5. 日常运维、问题排查与升级指南部署成功只是开始日常运维才是真正的考验。kolla-ansible同样为这些场景提供了工具。5.1 服务操作与日志查看所有服务都以容器形式运行因此运维操作都围绕Docker命令展开。# 查看所有容器状态在任意控制节点上 sudo docker ps -a --format table {{.Names}}\t{{.Status}}\t{{.Ports}} # 查看特定服务的容器日志例如nova-api sudo docker logs -f --tail 100 nova_api # 或者使用kolla-ansible封装的命令查看所有节点上某个服务的日志 sudo kolla-ansible -i ./inventory/multinode logs nova-api # 重启某个服务例如neutron-server sudo docker restart neutron_server # 或者使用ansible批量重启某个角色的所有服务 sudo kolla-ansible -i ./inventory/multinode reconfigure -t neutron-server # reconfigure 会重新生成配置并重启容器比单纯的 restart 更彻底。5.2 常见问题排查实录这里记录几个我踩过的坑和解决方法问题一容器启动失败报错“OCI runtime create failed: ... no such file or directory”现象部署或重启时某个容器如keystone无法启动。排查运行docker logs container_id查看具体错误。经常是容器内某个关键文件或目录挂载失败。解决检查/etc/kolla下对应服务的配置文件目录是否存在且权限正确。有时可能是宿主机上的SELinux或AppArmor策略阻止了挂载。可以尝试临时禁用SELinux (setenforce 0) 或查看/var/log/audit/audit.log获取详细拒绝信息。问题二服务间通信失败如Nova无法访问Keystone现象创建虚拟机失败日志显示“Failed to validate token”或连接被拒绝。排查在Nova API容器内尝试curlKeystone的内部端点通常是http://keystone-internal:5000。检查docker network ls和docker network inspect kolla_internal确保所有服务容器都在同一个自定义的Docker网络默认是kolla_internal中。检查HAProxy状态docker exec -it haproxy bash然后查看/var/log/haproxy.log或检查后端服务健康状态。解决最常见的原因是虚拟IPVIP配置问题或网络平面隔离。确保管理网络的交换机端口允许VIP地址的ARP通告。也可以尝试重启keepalived容器。问题三磁盘空间不足现象部署失败或容器运行异常docker info显示Docker Root Dir空间不足。解决清理无用镜像docker image prune -a删除所有未被容器使用的镜像。清理构建缓存如果使用source部署会留下大量构建缓存。迁移Docker数据目录这是根本解决方法。停止Docker服务将/var/lib/docker迁移到大容量分区或挂载点然后创建软链接或修改Docker的启动配置 (/etc/docker/daemon.json中的>