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。如果使用OVS+GRE/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 cirros@192.168.100.100。如果网络和安全组规则都正确,你应该能成功登录。
- 找到你下载的私钥文件
4. 通过命令行(CLI)创建实例
对于自动化脚本或更喜欢命令行的用户,OpenStack Client (openstackclient) 是更强大的工具。
4.1 环境准备与认证
首先,你需要通过环境变量或clouds.yaml文件完成认证。
# 方法一:导入管理员openrc文件(假设在控制节点) source /root/admin-openrc.sh # 方法二:使用环境变量 export OS_USERNAME=admin export OS_PASSWORD=your_admin_password export OS_PROJECT_NAME=admin export OS_USER_DOMAIN_NAME=Default export OS_PROJECT_DOMAIN_NAME=Default export OS_AUTH_URL=http://controller:5000/v3 export OS_IDENTITY_API_VERSION=34.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-id=1a2b3c4d-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 cirros@172.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流表
在Neutron+OVS的方案中,实例的网卡(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失败的错误。
- 查看Nova各组件日志(
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设备(通常名如tap<port_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_ID=your_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作为云操作系统基石的核心能力。