资讯详情

资讯详情

OpenStack核心组件、部署与排障全解析

手上有好几本OpenStack的书一直没看完看到一堆组件名——Nova、Neutron、Cinder、Keystone——头皮发麻这篇文章就是给你准备的。我当年从“会用命令行”到“敢动手搭环境”再到“能在生产环境里排查问题”一路踩了不少坑这里把OpenStack最核心的知识点、组件间的关系、部署思路和常见故障一次性梳理清楚。不管是准备面试、做课程设计还是公司内部要搭一套私有云这篇文章都能帮你省下大量翻文档的时间。1. 先搞明白OpenStack到底是个什么东西1.1 它不是“一个软件”而是一套“积木式”框架很多人第一次接触OpenStack以为下载一个安装包就能跑起来结果发现要装一堆东西立刻懵了。这个认知得先纠正OpenStack是一个开源的云计算管理平台本质上是把一堆开源组件按标准接口拼装起来对外提供基础设施即服务IaaS的能力就像乐高积木——有标准接口不限定必须按某一种方式拼你可以根据业务需求自由组合。每个积木块负责一块具体职能Nova管计算Neutron管网络Cinder管块存储Swift管对象存储Keystone管认证Glance管镜像Heat管编排Horizon提供网页控制台。它们之间通过RESTful API通信各组件能跑在同一台机器上All-in-One部署用于学习和开发也能分布在几十台物理机上生产环境典型方式。这种“积木式”设计带来的直接好处是扩展性极强。计算资源不够加计算节点就行存储性能不够换更快的后端就行网络性能有瓶颈调整Neutron的agent部署方式就行——谁出问题就动谁不需要“伤筋动骨”。1.2 它和VMware、Kubernetes的区别在哪搞混OpenStack和VMware、Kubernetes之间的关系是新手最常见的问题。简单说VMware vSphere是商业虚拟化平台主打稳定和易用界面友好、文档齐全、技术支持到位但闭源、价格不菲。OpenStack是开源IaaS平台灵活性高、无厂商锁定但要自己维护——部署、调优、排障全是自己搞定人力成本高。Kubernetes是容器编排平台管的是“容器怎么调度”而OpenStack管的是“虚拟机、网络、存储怎么供给”。实际环境里三者经常配合使用OpenStack先把物理资源抽象成计算、网络、存储池Kubernetes再在上面跑容器集群。我见过不少公司用OpenStack做底座上面再跑K8s的这是目前技术栈中很常见也经得起实践考验的组合。3. 核心组件逐个拆解知道它是谁、管什么、怎么用3.1 Keystone认证鉴权服务整个平台的“门卫”Keystone在OpenStack里扮演的角色类比成公司前台的门禁系统再恰当不过。所有其他组件要对外提供服务第一步都是确认“你是谁、你能干什么”。Keystone管理三样核心东西User用户、Project项目也常称作租户或账户、Role角色。你在OpenStack里操作的一切资源都必须归属到某个Project下而你能对资源做什么操作由你的Role决定。Admin角色能管理项目、分配资源普通成员角色只能使用分配给自己的资源。它的鉴权机制基于Token本质是一个安全令牌。你向Keystone发送用户名和密码它验证通过后签发一个Token——这个Token就相当于一张临时通行证你拿它去请求Nova创建虚拟机、去请求Neutron创建网络其他组件验证Token有效后才会放行。我给个部署建议Keystone最好单独部署在控制节点上而且一定不要图省事用默认的SQLite生产环境至少用MariaDB或MySQL并配置好密码策略和Token过期时间默认是8小时安全要求高的环境可以调到4小时。曾经有团队图方便让Token永不过期结果内部泄了账号后攻击者凭一个旧Token横行无阻排查了两天才发现问题。还有一点容易被忽略Keystone不仅要管用户认证还维护一份“服务目录”Service Catalog。每个组件的API端点地址都注册在这里客户端拿到Token后还要查询服务目录才知道去哪个地址调用哪个服务的API。官方提供的OpenStack命令行工具会自动处理这个过程但你用裸RESTful API调试时这个服务目录就是你的“通讯录”。3.2 Nova计算服务管虚拟机的“总管”Nova负责虚拟机实例的整个生命周期创建、启动、关闭、迁移、删除。但它不是虚拟化软件本身——它更像一个调度与管家真正干活的虚拟化软件KVM、Xen、VMware等隐在背后。Nova内部架构挺有意思几个子服务各司其职nova-api接收外部API请求是所有操作的第一入口。nova-scheduler决定新虚拟机建在哪台物理机上。这不是随机分配而是通过加权轮询、过滤、代价计算等方式综合CPU、内存、磁盘空间、当前负载以及用户指定的镜像、规格、可用域等条件选出最合适的物理机。调度器是Nova中最考验算法功底的部分。nova-conductor一个中间协调者实例的创建、迁移等长时操作都由它协调完成。它能直接操作数据库把复杂逻辑从API节点中剥离出来避免了API节点和数据库之间过于紧密的耦合。nova-compute以Agent形式运行在每个计算节点上负责真正调起虚拟化软件创建、管理虚拟机。一个典型的虚拟机创建流程是这样的用户通过Horizon网页控制台或命令行nova boot发起请求nova-api接收后在数据库里创建一条实例记录nova-scheduler根据调度算法选出一台计算节点通知那台机器上的nova-compute去调KVM创建虚拟机。中间conductor负责协调进度最终Glance里镜像模板被加载进新虚拟机虚拟网络由Neutron完成挂接。实操中你会遇到的第一个坑往往是“选了2GB内存的规格可是节点剩余可用内存不够”。Nova的调度器默认只看宿主机整体内存的剩余量但它对内存超分Memory Overcommit策略是有配置项的。默认超分比是1.5倍意味着每个计算节点可以超额分配内存。如果你亲自维护生产环境一定要根据业务实际负载压测调这个参数不要无脑抬高否则内存竞争会导致虚拟机内部OOMOut of Memory系统威胁很大。3.3 Neutron网络服务连接算力与业务的神经系统Neutron大概是OpenStack里最复杂、也最让人头疼的组件它管的是虚拟网络。你创建一个虚拟机的瞬间Neutron在背后至少完成三件事给虚拟机分配一个IP地址在虚拟交换机上配置对应的端口再把网络流量引导到正确的物理路径上。整个过程对用户来说都是“无感”的。Neutron支持多种网络类型Flat网络所有虚拟机都在同一个二层网络中适用于实验环境、VLAN网络按二层VLAN隔离不同租户或业务每个VLAN有独立的广播域、VXLAN/GRE网络基于隧道封装实现网络隔离可以突破传统VLAN的4096个数量上限适合大规模多租户。生产环境里VXLAN往往是最优选择。原因很直白传统VLAN最多4096个多租户场景很快就用完了VXLAN理论上支持1600万个VXLAN网络标识符加上它基于Overlay封装底层的物理网络结构对客户虚拟机来看是透明的网络拓扑的变更灵活得多。Neutron内部还有几个关键角色neutron-server接收并处理网络相关的API请求同时维护数据库中的网络状态。neutron-l2-agent以linuxbridge或openvswitch代理两种形式存在跑在每个计算节点和网络节点上负责二层数据的转发创建虚拟交换机、配置VXLAN隧道等。neutron-dhcp-agent给虚拟机分配IP地址维护DHCP服务每个子网默认会有一个DHCP命名空间。neutron-l3-agent运行在网络节点上提供路由和NAT功能让虚拟机可以访问外部网络。新手最容易翻车的地方网卡物理设备选错了。多个物理网卡时必须清楚哪个用于管理网络控制节点和计算节点通信哪个用于数据网络虚拟机流量。配置错了症状很典型——虚拟机创建成功但网络不通需要排查的链条很长。还有个很常见的问题DHCP Agent没正常响应。明明Neutron配置都正确虚拟机的网络状态也是ACTIVE但进虚拟机看IP地址就是一直获取不到。这种情况优先排查是不是DHCP命名空间里的地址池用完了或者DHCP Agent状态down掉了。我当时的排查顺序是neutron agent-list看代理是否活跃再上网络节点查dnsmasq进程是否存在最后看日志按这个顺序能定位到绝大多数问题。3.4 Glance镜像服务创造虚拟机的“模板库”Glance负责管理虚拟机要用的镜像功能很简单提供镜像的注册、上传、下载、查询和删除。镜像可以理解为“虚拟机的模板”包含了一个操作系统的基本系统文件和配置。Glance支持好几种镜像格式比如raw、qcow2、iso、vhd等。其中qcow2最常用——它支持写时复制新建虚拟机时不需要完全复制整个镜像文件而是基于基础镜像创建差异数据层。这意味着创建虚拟机速度很快且占用的实际物理磁盘空间远小于镜像本身。不过要注意父镜像绝对不能移动位置或修改否则所有基于它的虚拟机都会出问题。Glance镜像来源有三种常见方式官方云镜像站点下载比如各种发行版官方提供的云镜像、自己用虚拟机手工制作然后导出、通过openstack image create命令直接从ISO安装盘构建。生产环境里最推荐自己制作——你才能保证包含了需要的驱动、软件包和性能优化参数。镜像上传时的参数磁盘格式、容器格式、是否公共可见、最小磁盘大小、最小内存大小建议一次性设置准确。特别是“最小内存”这个参数有次同事在镜像配置里漏填了结果规格很小的虚拟机直接启动失败排查了很久才定位到是镜像配置问题白白消耗了调试时间。3.5 Cinder与Swift块存储与对象存储的分工协作新手往往分不清Cinder和Swift的区别用一句话说清楚Cinder像给服务器插一块硬盘必须挂载在虚拟机操作系统上格式化后才能用一个时刻只能被一台机器使用Swift像一个网盘通过API存取文件本质上运行在HTTP协议上文件可以被多台机器同时访问。Cinder为虚拟机提供持久化块存储。默认情况下虚拟机的系统盘是临时盘——虚拟机删掉数据跟着没了。如果你要保存重要数据就得给虚拟机挂一块Cinder卷。Cinder后端存储可以是LVM本机逻辑卷、NFS网络文件系统、Ceph分布式存储集群等。生产比较推荐Ceph作为Cinder后端因为它天然有副本、无单点故障、支持快照并有完善的生态。Cinder的快照和备份功能也是亮点快照可以在线创建适合做数据库备份前的准备。但要注意快照不能替代备份它和原卷在同一个存储系统里存储系统整体挂了快照同样不可用。真正的备份必须把数据复制到独立的存储介质或异地环境中。Swift适合存什么静态文件、大规模图片、音视频素材、备份归档等对读写一致性和低时延要求不那么苛刻的数据。它通过一致性哈希算法分布式存储数据每个对象默认存储3个副本存储节点挂了不丢数据靠的是跨节点复制与分布式重建。我做了不少项目后发现很多团队在选存储方案时犹豫不决其实不然原则很清楚数据访问是“进虚拟机读写”还是“通过API直接读写”前者选Cinder或Ceph后者选Swift或者直接用云厂商的对象存储。需要被数据库直接访问的用Cinder Ceph只是上传下载、分享、备份的用Swift。3.6 Horizon与Heat让云平台更好用、更自动化Horizon是一个Web控制台把OpenStack各种组件功能用网页方式整合起来极大降低使用门槛。团队里的非运维人员管理云资源时通常不需要敲命令行点几次页面就能创建网络、租户、虚拟机了。Horizon本身不提供计算、网络等能力它只是“翻译官”——把页面操作翻译成API请求发给底层组件。Heat做的事情是编排用模板描述一组资源及其依赖关系然后一次性创建出来。比如要部署一套应用环境既有两台应用服务器、一台数据库服务器还有相应的网络和负载均衡器Heat模板用文本把这一切定义出来后续销毁重建一条命令搞定。Heat模板本身是一个YAML或JSON文件定义资源之间还有依赖关系Heat会按依赖顺序逐步创建如果某个资源创建失败它可以执行回滚操作把之前创建成功的资源一并删掉保证环境的一致性。这个能力在生产部署、测试环境快速搭建场景下价值很高。建议刚接触OpenStack时就把Heat用起来哪怕只是管理一台测试虚拟机也比手动挨个创建顺手得多。4. 安装部署与日常操作从零搭一套环境的完整流程4.1 部署工具怎么选OpenStack安装部署是劝退萌新的最大门槛能选对工具就成功了一半。开发学习环境直接用DevStack。它是一个自动化部署脚本在Ubuntu的一台干净机器上执行几条命令就能跑出一套完整的OpenStack环境来。我明确说明DevStack适合学习不适合生产。生产环境首推Kolla-Ansible。它把OpenStack各组件都做成Docker容器用Ansible编排部署。相比传统的源码或包安装方式Kolla-Ansible的优势是干净、易于升级回滚、依赖隔离——宿主机上不需要装一堆依赖包出了问题也不会影响宿主机系统。这套方案是很多公司的标准做法。Kolla-Ansible部署过程可以概括为准备一台初始化干净的机器跑Ansible称为部署节点用Kolla-Ansible生成配置然后Ansible自动在所有目标机器上拉取镜像、启动容器、完成配置编排。整个过程会有网络和Docker环境的前置要求硬件资源不达标机器会比较吃力。我个人非常推荐用Kolla-Ansible 容器化方式部署。你只需要维护好配置文件和Docker镜像版本升级组件变成替换镜像的事情比传统包管理方式省心太多。4.2 一个多节点环境的部署实操这里用一个三节点1控制节点 2计算节点环境作为例子帮你把完整流程走一遍。这种架构是OpenStack生产环境最常见的最小规模。架构规划表以最简配置为例节点角色CPU核数内存系统盘数据盘网卡控制节点48GB100GB100GB两块网卡一块管理网一块外部网计算节点1832GB100GB500GB两块网卡管理网数据网计算节点2832GB100GB500GB两块网卡管理网数据网第一步节点基础初始化。所有节点安装Ubuntu Server 22.04 LTS确保内核支持KVM执行egrep -c (vmx|svm) /proc/cpuinfo输出大于0说明支持。配置好静态IP、主机名、SSH免密登录设置时间同步NTP。第二步在部署节点安装Kolla-Ansible。用Python虚拟环境安装创建/etc/kolla目录保存配置文件在globals.yml里指定镜像版本、网卡名、虚拟化类型等关键参数。基础网络规划必须提前定好管理网络API通信、数据库连接等例如192.168.10.0/24数据网络虚拟机业务流量例如192.168.20.0/24外部网络的桥接网卡与物理机同一网段第三步生成密码文件并修改默认密钥。kolla-genpwd会生成所有服务密码生产必改成强密码别用默认值。第四步检查宿主机环境执行kolla-ansible prechecks它会检查磁盘空间、内核参数、Docker是否正常等。全部通过后执行kolla-ansible deploy -i multinode开始部署。首次部署大概需要30~60分钟取决于机器性能。过程中看到容器一个个起来到最后出现成功的图标你基本就能松一口气了。第五步生成OpenStack客户端环境文件。执行kolla-ansible post-deploy能生成/etc/kolla/admin-openrc.sh加载它就能用命令行操作OpenStack了source /etc/kolla/admin-openrc.sh openstack service list第六步上传Glance镜像创建网络和虚拟机。这一步会遇到大量细节问题建议先创建好外部网络、内部网络和路由再启动虚拟机验证连通性。这里再强调一个踩坑记录控制节点上如果忘了启用IP转发功能net.ipv4.ip_forward1那么虚拟机的流量根本出不了宿主机表现就是虚拟机本身能启动但外部网络ping不通。这个设置在/etc/sysctl.conf里改完执行sysctl -p生效。4.3 用命令行创建一个虚拟机的完整流程以命令行方式创建一台带公网IP的虚拟机完整命令序列大概是这样source /etc/kolla/admin-openrc.sh # 1. 导入镜像 openstack image create ubuntu2204 \ --file ubuntu-22.04-server-cloudimg-amd64.img \ --disk-format qcow2 --container-format bare \ --public # 2. 创建网络 openstack network create public-net --external openstack subnet create public-subnet \ --network public-net --subnet-range 192.168.100.0/24 \ --gateway 192.168.100.1 --no-dhcp openstack network create private-net openstack subnet create private-subnet \ --network private-net --subnet-range 10.10.10.0/24 \ --dns-nameserver 8.8.8.8 # 3. 创建路由使内外网连通 openstack router create demo-router openstack router set demo-router --external-gateway public-net openstack router add subnet demo-router private-subnet # 4. 创建安全组规则放行SSH和ICMP openstack security group rule create --proto tcp --dst-port 22 default openstack security group rule create --proto icmp default # 5. 创建密钥对 openstack keypair create mykey mykey.pem # 6. 创建虚拟机 openstack server create \ --flavor m1.small --image ubuntu2204 \ --nic net-idprivate-net的ID \ --key-name mykey \ demo-vm # 7. 分配浮动IP并绑定 openstack floating ip create public-net openstack server add floating ip demo-vm 浮动IP命令本身不复杂但实际执行中大概率会遇到问题openstack image create时镜像文件路径不对或格式参数错误会直接报错或创建出来的镜像启动异常。缺少安全组规则虚拟机看着“一切正常”实际所有外部访问都无法建立连接排查时特别容易忽略。外部子网如果填了--dhcp会导致IP分配混乱外部网络通常不启用DHCP。5. 日常运维与排障知识变成能力的关键5.1 日志与监控排障的基本功OpenStack每个组件都有自己的日志文件控制节点容器里通常在/var/log/kolla/服务名/目录下。排障第一原则先看日志再改配置。排查顺序建议确认问题所属组件 → 查看对应容器日志 → 定位关键错误信息 → 搜索错误码或关键词 → 核对配置。用Docker部署的优势此时就体现了——日志直接在容器内查看命令很简单docker logs 容器名 # 查看容器标准输出日志 docker logs --tail 100 容器名 # 只看最近100条监控层面OpenStack自带的Ceilometer可以采集资源使用数据社区还有Prometheus Grafana方案Grafana作为可视化看板。新团队最优先关注四个指标宿主机CPU和内存使用率、虚拟机磁盘IO延迟、网络流量丢包率、各API服务的请求延迟。这四个指标能快速暴露大多数底层问题。5.2 常见故障排查实录故障一虚拟机创建失败报No valid host found这是新手第一次搭完环境几乎必踩的坑。错误信息看似“找不到合适的主机”实际原因很多计算节点上nova-compute服务没起来、调度器认为资源不足、可用域配置不匹配、甚至镜像和规格不兼容。排查办法先检查计算节点的nova-compute容器状态和日志再用openstack host show看宿主机是否在线用openstack hypervisor stats show看资源总量检查规格参数和当前可用资源的差距解决方案通常是要么增加计算节点资源要么下调超分比或清除残留的已删除实例占位要么检查可用域匹配。故障二虚拟机启动后无法获取IP排查步骤按顺序来在控制节点执行openstack network agent list确认dhcp-agent状态是UP还是DOWN。如果代理是异常状态重启对应容器。如果代理正常检查DHCP命名空间里的地址池是否已耗尽执行ip netns exec qdhcp-网络ID ip addr查看分配情况。最后再排查是否为三层路由或安全组拦截。故障三块存储卷无法挂载常见原因是Cinder和Nova之间配置不一致。Cinder卷创建成功但虚拟机端就是看不到新磁盘。通常是Cinder配置了某个后端存储但Nova的volume_attachment配置没有同步好或存储节点的客户端工具版本不匹配。解决办法检查cinder.conf中enabled_backends和default_volume_type设置对比Nova配置中的存储驱动再检查存储节点上的multipath服务是否正常。5.3 避坑与运维经验分享别在生产环境手动改配置文件然后直接重启容器。所有变更都走Kolla-Ansible的配置管理流程改/etc/kolla/globals.yml或各服务的*.conf文件然后执行kolla-ansible reconfigure。手动改容器内的文件重启后配置会被覆盖。安全组规则一定要精细化。默认安全组意味着放行所有流量这等于裸奔所以宁可一开始拒绝所有入站流量然后按最小权限原则逐步放行。我见过不少内部系统被扫描爆破都是安全组配置过于宽松造成的。定期备份数据库和控制节点的配置文件。OpenStack没有数据库就没有“大脑”所有组件状态都记录在数据库中。官方有专门备份数据库的最佳实践可以用mysqldump定期导出至少保留7天以上的备份。升级版本前先在测试环境做一次完整演练。OpenStack版本跨度大跨版本升级比如从Ussuri升级到Wallaby可能涉及数据库结构变更和API版本跳变稍有疏漏就是服务长时间不可用。测试环境演练升级是把风险前置的最好办法。6. 如何系统提升OpenStack技能水平很多初学者学OpenStack最困惑的就是“学了一堆命令但遇到真实环境还是不会处理问题”。我建议把学习分成“三层”每个层级的侧重点完全不同第一层是操作层。目标是把OpenStack用起来会用Horizon和命令行做虚拟机、网络、存储、快照等基本操作。这个阶段买一本书照着敲命令配合DevStack环境两周左右就能过关。第二层是组件原理层。知道Keystone、Nova、Neutron等组件之间的消息流转过程能看懂日志能针对你的业务场景提出优化建议。初级运维或者“懂OpenStack的开发”达到这个水平就够了。第三层是架构与方案设计层。能根据业务规模设计OpenStack的部署拓扑控制节点数量、网络节点是否需要独立、存储池怎么划分能评估高可用方案能结合容器、SDN、分布式存储做整体方案规划。这个阶段没有捷径必须是真实项目经验积累出来的。关于官方文档的使用建议OpenStack官方文档质量整体不错每个服务都有运维手册但缺点是大而全、缺少“真知灼见”。更推荐的学习路径是先看官方文档了解API接口和核心概念再挑选一两个有代表性的实战部署案例跟着走一遍结合自己动手搭的环境积累经验最后针对实际业务做深度优化。面试或工作中被问到“你会不会OpenStack”其实真正想听的技术点无非是整体架构理解到位、核心组件职责和交互流程说得清、有Failover经验能处理常见故障、了解网络虚拟化的基本原理。把这篇文章里的知识点吃透再动手完成一套环境搭建应对面试和实际项目基本够用了。最后再分享一点个人体会学OpenStack最怕只记概念不操作。你哪怕用一台16GB内存的笔记本装个DevStack实际创建几台虚拟机把网络打通一次对知识的理解深度直接翻倍。这些知识点不是背出来的是搭环境、敲命令、排故障的过程中一点一点沉淀出来的。信息量确实大但主线抓准了先清楚每个组件管什么再完整走一遍部署和操作流程最后积累排障经验这条路走通之后你对OpenStack的理解就已经超越了大多数只看文档没动手的人。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →