OpenStack Train版部署实战:从零创建第一台虚拟机实例
1. 项目概述从平台搭建到实例落地折腾了这么久从控制节点、计算节点、网络节点的配置到Keystone、Glance、Nova、Neutron、Cinder、Horizon等核心组件的逐一部署我们终于走到了OpenStack Train版部署中最激动人心的一步创建并启动第一台虚拟机实例。这就像是组装一台复杂的机器拧紧了最后一颗螺丝现在要按下启动按钮看看它能否真正运转起来。创建实例在OpenStack的语境下远不止是点击几下按钮那么简单。它是对前面所有部署工作的一次综合性验收。你的镜像服务Glance是否正常计算资源调度Nova是否畅通网络配置Neutron是否就绪块存储Cinder能否挂载身份认证Keystone有无问题所有环节都会在这一步串联起来。很多朋友在部署时一路顺风却卡在创建实例这里要么状态一直是“调度中”要么直接报错“No valid host was found”其根本原因往往在于前期某个服务的配置细节有疏漏在创建实例这个“集成测试”环节才暴露出来。本文将带你手把手完成在OpenStack Train环境中创建实例的全过程。我们会从最基础的准备工作——创建虚拟网络、上传镜像、配置安全组和密钥对——开始然后通过Horizon仪表板和命令行两种方式创建实例并深入每一步背后的原理和可能遇到的“坑”。最后我会分享几个实战中排查创建失败问题的核心思路这些都是从一次次部署和排错中积累下来的经验希望能帮你顺利点亮第一台云主机。2. 创建实例前的核心准备工作在点击“启动实例”按钮之前我们必须把“原材料”和“基础设施”准备好。这个过程相当于传统物理服务器上架前需要准备好系统安装盘镜像、规划好IP地址和网络网络、设置好防火墙规则安全组以及准备好远程登录的钥匙密钥对。2.1 镜像Image的上传与管理镜像是虚拟机的模板包含了操作系统和预装的软件。OpenStack通过Glance服务管理镜像。操作步骤登录Horizon控制台使用管理员或具有相应权限的用户登录。进入镜像管理在左侧导航栏选择“项目” - “计算” - “镜像”。创建镜像点击“创建镜像”按钮。填写镜像信息名称为镜像起个名字如cirros-0.6.2。描述可选如“小型测试用Linux镜像”。镜像源选择“镜像文件”。镜像文件点击“选择文件”上传你下载好的镜像文件。对于测试强烈推荐cirros-0.6.2-x86_64-disk.img它只有十几MB启动飞快。格式通常选择“QCOW2”QEMU模拟器格式它支持快照和动态扩容是OpenStack的推荐格式。如果上传的是RAW格式则选择“RAW”。架构根据镜像选择如x86_64。最小磁盘GB启动实例所需的最小磁盘空间。对于cirros填1即可。最小内存MB启动实例所需的最小内存。对于cirros填64即可。公开如果希望所有项目都能使用勾选此项。通常测试镜像可以设为公开。点击“创建镜像”。上传完成后镜像状态会变为“活跃”。注意上传较大的镜像如几个GB的完整Linux发行版可能需要较长时间。务必确保Glance服务的存储后端通常是文件系统或对象存储有足够空间。上传过程中不要刷新或关闭页面。2.2 网络Network的规划与创建网络是实例的通信血脉。OpenStack通过Neutron服务管理网络。我们需要至少创建一个供实例使用的“项目网络”。操作步骤创建提供商网络简单桥接模式进入网络管理选择“项目” - “网络” - “网络”。创建网络点击“创建网络”。会依次配置“网络”、“子网”、“子网详情”三个标签页。配置网络网络名称如private-net。项目通常为当前项目无需更改。提供商网络类型根据你的底层配置选择。如果物理网卡直接桥接选Flat或VLAN。如果使用OVSGRE/VXLAN隧道选VXLAN或GRE。这里以最简单的Flat为例。物理网络填写你在ml2_conf.ini中配置的flat_networks名称例如physnet1。共享和外部网络暂时都不勾选。这是内部网络。配置子网子网名称如private-subnet。网络地址填写规划好的CIDR地址块例如192.168.100.0/24。IP版本选择IPv4。网关IP指定子网的网关地址例如192.168.100.1。可以不填系统会默认使用网段的第一个地址.1。配置子网详情DHCP启用DHCP务必勾选这样实例才能自动获取IP。分配池定义DHCP分配的IP范围例如起始192.168.100.100 结束192.168.100.200。范围外的IP可以用于手动指定。DNS服务器可以填写公共DNS如8.8.8.8。点击“创建”。网络创建成功后Neutron会自动创建一个同名的路由器接口如果使用了dnsmasq并连接。2.3 安全组Security Group的配置安全组是实例级别的虚拟防火墙控制进出实例的流量。默认的安全组规则非常严格通常需要添加规则以允许SSH、Ping等。操作步骤进入安全组管理选择“项目” - “网络” - “安全组”。你会看到一个名为default的默认安全组。管理默认安全组规则点击default安全组对应的“管理规则”。添加入站规则添加规则-规则选择SSH。这会自动填充协议TCP和端口22。源地址保持0.0.0.0/0允许任何IP或根据情况限制CIDR。再次添加规则-规则选择ICMP。这允许Ping操作对于网络调试非常有用。如果需要Web访问再添加HTTP(端口80) 和HTTPS(端口443) 规则。点击“添加”确认每条规则。创建实例时选择这个配置好的default安全组即可。2.4 密钥对Key Pair的生成与注入对于Linux实例推荐使用SSH密钥对进行免密登录这比密码登录更安全。密钥对由公钥和私钥组成公钥注入实例私钥保存在本地。操作步骤在Horizon中创建进入密钥对管理选择“项目” - “计算” - “密钥对”。创建密钥对点击“创建密钥对”。填写名称如my-first-key。密钥对类型选择SSH密钥。点击“创建密钥对”。浏览器会自动下载一个名为my-first-key.pem的私钥文件。务必妥善保管此文件OpenStack不保存私钥丢失后将无法登录使用此密钥对的实例。创建实例时选择这个密钥对Nova会在实例初始化时将公钥写入实例的~/.ssh/authorized_keys文件。3. 通过Horizon仪表板创建实例图形化方式图形化界面是最直观的方式适合新手和日常管理。3.1 详细步骤分解导航并启动登录Horizon选择“项目” - “计算” - “实例”。点击“启动实例”按钮。详情标签页实例名称起个名字如test-vm-1。可用域如果你配置了多个可用域可以选择一个。通常留默认的nova。数量要创建多少个相同配置的实例填1。实例引导源选择“引导源”为“镜像”然后从列表中选择我们上传的cirros镜像。实例类型选择硬件配置模板Flavor。对于cirros选择最小的m1.tiny(1核512MB内存1GB磁盘)即可。如果没有需要管理员在“管理员”-“计算”-“实例类型”中创建。网络标签页将左边“可用网络”中的private-net添加到右边“已选网络”中。网络端口通常不用管系统会自动分配。安全组标签页确保右边“已选安全组”中包含我们配置了规则的default安全组。密钥对标签页从列表中选择我们创建的my-first-key。这是关键一步否则无法SSH登录。配置标签页可以注入自定义脚本或配置文件初次创建可跳过。服务器组、调度提示、元数据、文件注入等标签页高级功能初次创建均可跳过。点击“启动实例”。实例状态会经历“调度中” - “构建中” - “活跃”。如果长时间卡在“调度中”或“构建中”或者变为“错误”就需要排查了。3.2 创建后的关键检查点实例状态变为“活跃”后工作还没完获取控制台日志点击实例名称在“控制台”标签页可以查看实例的启动日志。这对于排查系统启动问题至关重要。查看控制台在“控制台”标签页可以直接打开一个VNC或SPICE控制台像操作虚拟机一样操作它。对于cirros默认用户名是cirros密码是gocubsgo。检查网络在实例详情页的“概览”部分查看分配的IP地址如192.168.100.100。尝试从同一网络内的其他机器Ping这个地址。SSH登录测试找到你下载的私钥文件my-first-key.pem。修改其权限为仅当前用户可读chmod 400 my-first-key.pem。使用私钥登录ssh -i my-first-key.pem cirros192.168.100.100。如果网络和安全组规则都正确你应该能成功登录。4. 通过命令行CLI创建实例对于自动化脚本或更喜欢命令行的用户OpenStack Client (openstackclient) 是更强大的工具。4.1 环境准备与认证首先你需要通过环境变量或clouds.yaml文件完成认证。# 方法一导入管理员openrc文件假设在控制节点 source /root/admin-openrc.sh # 方法二使用环境变量 export OS_USERNAMEadmin export OS_PASSWORDyour_admin_password export OS_PROJECT_NAMEadmin export OS_USER_DOMAIN_NAMEDefault export OS_PROJECT_DOMAIN_NAMEDefault export OS_AUTH_URLhttp://controller:5000/v3 export OS_IDENTITY_API_VERSION34.2 分步命令实操假设我们已经有了镜像cirros-0.6.2、网络private-net、安全组default和密钥对my-first-key。# 1. 列出资源确认ID openstack image list openstack network list openstack security group list openstack keypair list # 假设我们得到以下ID你的实际ID会不同 # 镜像ID: 6b582b6a-7d2d-4a5c-b6c7-1234567890ab # 网络ID: 1a2b3c4d-5e6f-7g8h-9i0j-1234567890kl # 安全组ID: 01234567-89ab-cdef-0123-456789abcdef # 密钥对名: my-first-key (密钥对通过名称引用) # 2. 确定实例类型Flavor openstack flavor list # 选择 m1.tiny假设其ID为 1 # 3. 启动实例 openstack server create \ --image 6b582b6a-7d2d-4a5c-b6c7-1234567890ab \ --flavor 1 \ --nic net-id1a2b3c4d-5e6f-7g8h-9i0j-1234567890kl \ --security-group 01234567-89ab-cdef-0123-456789abcdef \ --key-name my-first-key \ test-vm-1-cli # 4. 查看实例状态 openstack server list # 状态应为 ACTIVE # 5. 查看实例详情和IP地址 openstack server show test-vm-1-cli # 6. 获取控制台URL用于VNC访问 openstack console url show test-vm-1-cli # 7. 登录实例需要先确保网络连通和安全组规则允许 # 获取浮动IP并关联如果需要从外部网络访问 # 首先创建一个浮动IP openstack floating ip create public # 假设分配的浮动IP是 172.24.4.100 openstack server add floating ip test-vm-1-cli 172.24.4.100 # 现在可以通过 ssh -i my-first-key.pem cirros172.24.4.100 登录通过命令行操作所有步骤清晰可记录非常适合集成到自动化部署流程中。5. 实例创建深度原理与流程解析当你点击“启动”时OpenStack内部发生了一系列复杂的交互。理解这个过程对排错至关重要。5.1 Nova调度Scheduler的工作机制你的创建请求首先到达Nova-API。API服务将请求放入消息队列RabbitMQ。Nova-Conductor服务拾取请求进行一些数据库操作和验证。然后Nova-Scheduler服务登场。它从消息队列中获取请求并根据配置的过滤器Filter和权重计算器Weigher从所有可用的计算节点Nova-Compute中选出一个最合适的。常见过滤器包括ComputeFilter排除掉状态不是up的计算节点。RamFilter和DiskFilter排除内存或磁盘空间不足的节点。ImagePropertiesFilter根据镜像元数据如架构、Hypervisor类型过滤。AvailabilityZoneFilter根据可用域过滤。如果所有节点都被过滤掉你就会看到经典的No valid host was found错误。调度成功后请求会被发送到选中的计算节点的Nova-Compute服务。5.2 计算节点上的实例生成计算节点的nova-compute服务接收到请求后是真正的“造物主”下载镜像通过Glance客户端从Glance服务下载指定的镜像到本地缓存目录如/var/lib/nova/instances/_base。创建实例目录在实例目录如/var/lib/nova/instances/instance_uuid下为实例创建专属空间。准备虚拟磁盘通常以镜像为后端backing file使用QCOW2格式创建一个新的写时复制Copy-on-Write磁盘文件作为实例的系统盘。这保证了快速创建和节省空间。生成元数据Nova会为实例生成配置驱动Config Drive或通过元数据服务Metadata Service提供实例的元数据包括主机名、网络配置、注入的公钥等。调用Libvirt启动nova-compute通过Libvirt API生成一个包含CPU、内存、磁盘、网络接口定义的XML文件并命令Libvirt底层管理KVM/QEMU根据此XML定义启动虚拟机。网络连接Libvirt会根据XML中的网络定义创建虚拟网卡TAP设备并将其连接到Neutron在计算节点上创建的虚拟交换机如OVS网桥br-int。至此实例获得网络连通性。5.3 网络虚拟化的关键一步OVS流表在NeutronOVS的方案中实例的网卡TAP设备连接到集成网桥br-int。br-int上的流量会通过“隧道”或“物理网卡”流向外部。这是通过OVS的流表规则实现的。当实例启动后Neutron的代理如ovs-agent会计算并下发流表规则到br-int和隧道网桥br-tun如果使用VXLAN/GRE确保实例的流量能被正确打上标签、转发到正确的网络。如果流表规则没有正确下发实例就可能出现“有IP但无法通信”的问题。6. 实例创建失败常见问题与深度排查指南创建实例失败是OpenStack学习者的“必修课”。下面是我总结的几个最常见的问题场景和排查路径。6.1 错误状态“调度中”超时或“错误”状态可能原因及排查Nova-Scheduler服务异常检查服务状态在控制节点systemctl status openstack-nova-scheduler。查看日志tail -f /var/log/nova/nova-scheduler.log。看是否有明显的错误信息或者过滤你的实例ID查看相关日志grep instance_id /var/log/nova/nova-scheduler.log。计算节点资源不足或不可用检查计算节点服务在计算节点systemctl status openstack-nova-compute确保它是活跃的。检查计算节点状态在控制节点openstack compute service list。确保所有计算节点的nova-compute服务状态是up。检查资源在控制节点openstack hypervisor stats show查看总体资源openstack hypervisor list和openstack hypervisor show id查看具体节点的资源使用情况。确认有足够的空闲内存和磁盘。镜像问题镜像状态openstack image list确保镜像状态是active。镜像格式确认镜像格式是QCOW2或RAW并且是支持的架构。有些镜像可能需要特定的Hypervisor类型。消息队列或数据库连接问题查看Nova各组件日志nova-api,nova-conductor,nova-scheduler看是否有连接RabbitMQ或MySQL失败的错误。6.2 错误状态构建中失败控制台日志显示启动错误可能原因及排查Libvirt/KVM问题计算节点日志首要查看计算节点上的/var/log/nova/nova-compute.log过滤你的实例ID。Libvirt日志查看/var/log/libvirt/libvirtd.log。常见的错误包括权限问题/var/lib/nova/instances/目录权限不是nova:nova、SElinux阻止在调试时可临时设置为permissive模式测试、CPU特性不支持如尝试在无虚拟化支持的CPU上启动KVM。磁盘空间不足检查计算节点的根分区和/var/lib/nova所在分区的空间df -h。网络配置问题导致元数据获取失败实例启动时如果通过DHCP获取IP并需要访问元数据服务169.254.169.254网络不通会导致cloud-init执行失败实例可能无法完成初始化如注入密钥对。检查计算节点上br-int的流表以及网络节点如果独立部署上相关服务dhcp-agent,l3-agent,metadata-agent的状态和日志。6.3 实例状态为“活跃”但无法Ping通或SSH登录这是网络层的问题。检查安全组规则确认实例关联的安全组已经添加了ICMP和SSH的入站规则。检查实例IP确认实例获取到的IP地址是否在预期的子网内。检查计算节点网络ovs-vsctl show查看OVS网桥拓扑确认实例的TAP设备通常名如tapport_id) 是否正确连接到br-int。ip netns查看网络命名空间如果使用Linux Bridge或某些OVS配置会有。对于VXLAN网络可能需要进入qrouter-或qdhcp-命名空间去Ping实例IP。在计算节点上尝试arping -I br-int instance_ip看是否能收到实例的ARP回复。如果能说明二层是通的问题可能在三层路由或安全组。检查DHCP服务查看网络节点或计算节点如果DHCP Agent部署在上面的/var/log/neutron/dhcp-agent.log看是否有为你的实例分配IP的日志。检查路由和浮动IP如果使用外部网络需要检查路由器命名空间qrouter-id内的路由表和iptables规则以及浮动IP的绑定情况。openstack router show router_name和openstack floating ip list是常用命令。6.4 一个高效的排查命令清单当实例创建失败时可以按顺序执行以下命令快速定位问题# 1. 全局概览 openstack server list --long # 查看实例详细状态和错误信息如果有 openstack compute service list # 查看所有计算服务状态 openstack hypervisor list # 查看计算节点状态 # 2. 聚焦到特定实例 INSTANCE_IDyour_instance_id_here openstack server show $INSTANCE_ID # 查看实例详情关注 OS-EXT-STS:task_state 和 fault 字段 nova console-log $INSTANCE_ID # 获取控制台日志看系统启动到哪一步报错 # 3. 深入日志在控制节点和疑似被调度的计算节点上 # 控制节点 sudo tail -100f /var/log/nova/nova-scheduler.log | grep $INSTANCE_ID sudo tail -100f /var/log/nova/nova-conductor.log | grep $INSTANCE_ID sudo tail -100f /var/log/nova/nova-api.log | grep $INSTANCE_ID # 计算节点需要登录到实例所在的计算节点 sudo tail -100f /var/log/nova/nova-compute.log | grep $INSTANCE_ID sudo tail -100f /var/log/libvirt/libvirtd.log # 查看libvirt相关错误 sudo virsh list --all # 查看libvirt管理的虚拟机列表确认实例是否存在 sudo virsh dumpxml $INSTANCE_ID # 查看虚拟机的libvirt XML定义如果存在 # 4. 网络排查在计算节点 sudo ovs-vsctl show # 查看OVS连接 sudo ip netns list # 查看网络命名空间 # 如果知道端口ID可以查看具体端口 PORT_ID$(openstack port list --server $INSTANCE_ID -c ID -f value) sudo ovs-vsctl find Interface external_ids{neutron:port_id$PORT_ID}创建实例是OpenStack部署的里程碑也是检验前期工作成败的试金石。它串联起了IaaS的各个核心组件。遇到问题时不要慌张按照“服务状态 - 资源检查 - 组件日志 - 网络连通性”的层次由表及里地进行排查。每一次成功的实例启动都会让你对这套庞大而精妙的系统有更深的理解。当你能够稳定、批量地创建出功能完整的虚拟机时你就真正掌握了OpenStack作为云操作系统基石的核心能力。