ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OpenStack Train版部署实战:从零创建第一台虚拟机实例

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服务管理镜像。

操作步骤:

  1. 登录Horizon控制台:使用管理员或具有相应权限的用户登录。
  2. 进入镜像管理:在左侧导航栏选择“项目” -> “计算” -> “镜像”。
  3. 创建镜像:点击“创建镜像”按钮。
  4. 填写镜像信息
    • 名称:为镜像起个名字,如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即可。
    • 公开:如果希望所有项目都能使用,勾选此项。通常测试镜像可以设为公开。
  5. 点击“创建镜像”。上传完成后,镜像状态会变为“活跃”。

注意:上传较大的镜像(如几个GB的完整Linux发行版)可能需要较长时间。务必确保Glance服务的存储后端(通常是文件系统或对象存储)有足够空间。上传过程中,不要刷新或关闭页面。

2.2 网络(Network)的规划与创建

网络是实例的通信血脉。OpenStack通过Neutron服务管理网络。我们需要至少创建一个供实例使用的“项目网络”。

操作步骤(创建提供商网络,简单桥接模式):

  1. 进入网络管理:选择“项目” -> “网络” -> “网络”。
  2. 创建网络:点击“创建网络”。会依次配置“网络”、“子网”、“子网详情”三个标签页。
  3. 配置网络
    • 网络名称:如private-net
    • 项目:通常为当前项目,无需更改。
    • 提供商网络类型:根据你的底层配置选择。如果物理网卡直接桥接,选FlatVLAN。如果使用OVS+GRE/VXLAN隧道,选VXLANGRE。这里以最简单的Flat为例。
    • 物理网络:填写你在ml2_conf.ini中配置的flat_networks名称,例如physnet1
    • 共享外部网络:暂时都不勾选。这是内部网络。
  4. 配置子网
    • 子网名称:如private-subnet
    • 网络地址:填写规划好的CIDR地址块,例如192.168.100.0/24
    • IP版本:选择IPv4
    • 网关IP:指定子网的网关地址,例如192.168.100.1。可以不填,系统会默认使用网段的第一个地址(.1)。
  5. 配置子网详情(DHCP)
    • 启用DHCP:务必勾选,这样实例才能自动获取IP。
    • 分配池:定义DHCP分配的IP范围,例如起始192.168.100.100, 结束192.168.100.200。范围外的IP可以用于手动指定。
    • DNS服务器:可以填写公共DNS,如8.8.8.8
  6. 点击“创建”。网络创建成功后,Neutron会自动创建一个同名的路由器接口(如果使用了dnsmasq)并连接。

2.3 安全组(Security Group)的配置

安全组是实例级别的虚拟防火墙,控制进出实例的流量。默认的安全组规则非常严格,通常需要添加规则以允许SSH、Ping等。

操作步骤:

  1. 进入安全组管理:选择“项目” -> “网络” -> “安全组”。你会看到一个名为default的默认安全组。
  2. 管理默认安全组规则:点击default安全组对应的“管理规则”。
  3. 添加入站规则
    • 添加规则->规则:选择SSH。这会自动填充协议(TCP)和端口(22)。源地址保持0.0.0.0/0(允许任何IP)或根据情况限制CIDR。
    • 再次添加规则->规则:选择ICMP。这允许Ping操作,对于网络调试非常有用。
    • 如果需要Web访问,再添加HTTP(端口80) 和HTTPS(端口443) 规则。
  4. 点击“添加”确认每条规则。创建实例时,选择这个配置好的default安全组即可。

2.4 密钥对(Key Pair)的生成与注入

对于Linux实例,推荐使用SSH密钥对进行免密登录,这比密码登录更安全。密钥对由公钥和私钥组成,公钥注入实例,私钥保存在本地。

操作步骤(在Horizon中创建):

  1. 进入密钥对管理:选择“项目” -> “计算” -> “密钥对”。
  2. 创建密钥对:点击“创建密钥对”。
  3. 填写名称:如my-first-key
  4. 密钥对类型:选择SSH密钥
  5. 点击“创建密钥对”。浏览器会自动下载一个名为my-first-key.pem的私钥文件。务必妥善保管此文件!OpenStack不保存私钥,丢失后将无法登录使用此密钥对的实例。
  6. 创建实例时,选择这个密钥对,Nova会在实例初始化时将公钥写入实例的~/.ssh/authorized_keys文件。

3. 通过Horizon仪表板创建实例(图形化方式)

图形化界面是最直观的方式,适合新手和日常管理。

3.1 详细步骤分解

  1. 导航并启动:登录Horizon,选择“项目” -> “计算” -> “实例”。点击“启动实例”按钮。
  2. 详情标签页
    • 实例名称:起个名字,如test-vm-1
    • 可用域:如果你配置了多个可用域,可以选择一个。通常留默认的nova
    • 数量:要创建多少个相同配置的实例,填1
    • 实例引导源:选择“引导源”为“镜像”,然后从列表中选择我们上传的cirros镜像。
    • 实例类型:选择硬件配置模板(Flavor)。对于cirros,选择最小的m1.tiny(1核,512MB内存,1GB磁盘)即可。如果没有,需要管理员在“管理员”->“计算”->“实例类型”中创建。
  3. 网络标签页:将左边“可用网络”中的private-net添加到右边“已选网络”中。
  4. 网络端口:通常不用管,系统会自动分配。
  5. 安全组标签页:确保右边“已选安全组”中包含我们配置了规则的default安全组。
  6. 密钥对标签页:从列表中选择我们创建的my-first-key这是关键一步,否则无法SSH登录。
  7. 配置标签页:可以注入自定义脚本或配置文件,初次创建可跳过。
  8. 服务器组调度提示元数据文件注入等标签页:高级功能,初次创建均可跳过。
  9. 点击“启动实例”。实例状态会经历“调度中” -> “构建中” -> “活跃”。如果长时间卡在“调度中”或“构建中”,或者变为“错误”,就需要排查了。

3.2 创建后的关键检查点

实例状态变为“活跃”后,工作还没完:

  1. 获取控制台日志:点击实例名称,在“控制台”标签页可以查看实例的启动日志。这对于排查系统启动问题至关重要。
  2. 查看控制台:在“控制台”标签页可以直接打开一个VNC或SPICE控制台,像操作虚拟机一样操作它。对于cirros,默认用户名是cirros,密码是gocubsgo
  3. 检查网络:在实例详情页的“概览”部分,查看分配的IP地址(如192.168.100.100)。尝试从同一网络内的其他机器Ping这个地址。
  4. 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=3

4.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的计算节点。
  • RamFilterDiskFilter:排除内存或磁盘空间不足的节点。
  • ImagePropertiesFilter:根据镜像元数据(如架构、Hypervisor类型)过滤。
  • AvailabilityZoneFilter:根据可用域过滤。

如果所有节点都被过滤掉,你就会看到经典的No valid host was found错误。调度成功后,请求会被发送到选中的计算节点的Nova-Compute服务。

5.2 计算节点上的实例生成

计算节点的nova-compute服务接收到请求后,是真正的“造物主”:

  1. 下载镜像:通过Glance客户端,从Glance服务下载指定的镜像到本地缓存目录(如/var/lib/nova/instances/_base)。
  2. 创建实例目录:在实例目录(如/var/lib/nova/instances/<instance_uuid>)下为实例创建专属空间。
  3. 准备虚拟磁盘:通常以镜像为后端(backing file),使用QCOW2格式创建一个新的写时复制(Copy-on-Write)磁盘文件,作为实例的系统盘。这保证了快速创建和节省空间。
  4. 生成元数据:Nova会为实例生成配置驱动(Config Drive)或通过元数据服务(Metadata Service)提供实例的元数据,包括主机名、网络配置、注入的公钥等。
  5. 调用Libvirt启动nova-compute通过Libvirt API,生成一个包含CPU、内存、磁盘、网络接口定义的XML文件,并命令Libvirt(底层管理KVM/QEMU)根据此XML定义启动虚拟机。
  6. 网络连接:Libvirt会根据XML中的网络定义,创建虚拟网卡(TAP设备),并将其连接到Neutron在计算节点上创建的虚拟交换机(如OVS网桥br-int)。至此,实例获得网络连通性。

5.3 网络虚拟化的关键一步:OVS流表

在Neutron+OVS的方案中,实例的网卡(TAP设备)连接到集成网桥br-intbr-int上的流量会通过“隧道”或“物理网卡”流向外部。这是通过OVS的流表规则实现的。当实例启动后,Neutron的代理(如ovs-agent)会计算并下发流表规则到br-int和隧道网桥br-tun(如果使用VXLAN/GRE),确保实例的流量能被正确打上标签、转发到正确的网络。如果流表规则没有正确下发,实例就可能出现“有IP但无法通信”的问题。

6. 实例创建失败常见问题与深度排查指南

创建实例失败是OpenStack学习者的“必修课”。下面是我总结的几个最常见的问题场景和排查路径。

6.1 错误状态:“调度中”超时或“错误”状态

可能原因及排查:

  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
  2. 计算节点资源不足或不可用
    • 检查计算节点服务:在计算节点,systemctl status openstack-nova-compute确保它是活跃的。
    • 检查计算节点状态:在控制节点,openstack compute service list。确保所有计算节点的nova-compute服务状态是up
    • 检查资源:在控制节点,openstack hypervisor stats show查看总体资源;openstack hypervisor listopenstack hypervisor show <id>查看具体节点的资源使用情况。确认有足够的空闲内存和磁盘。
  3. 镜像问题
    • 镜像状态openstack image list确保镜像状态是active
    • 镜像格式:确认镜像格式是QCOW2或RAW,并且是支持的架构。有些镜像可能需要特定的Hypervisor类型。
  4. 消息队列或数据库连接问题
    • 查看Nova各组件日志(nova-api,nova-conductor,nova-scheduler),看是否有连接RabbitMQ或MySQL失败的错误。

6.2 错误状态:构建中失败,控制台日志显示启动错误

可能原因及排查:

  1. 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)。
  2. 磁盘空间不足:检查计算节点的根分区和/var/lib/nova所在分区的空间df -h
  3. 网络配置问题导致元数据获取失败:实例启动时,如果通过DHCP获取IP,并需要访问元数据服务(169.254.169.254),网络不通会导致cloud-init执行失败,实例可能无法完成初始化(如注入密钥对)。检查计算节点上br-int的流表,以及网络节点(如果独立部署)上相关服务(dhcp-agent,l3-agent,metadata-agent)的状态和日志。

6.3 实例状态为“活跃”,但无法Ping通或SSH登录

这是网络层的问题。

  1. 检查安全组规则:确认实例关联的安全组已经添加了ICMP和SSH的入站规则。
  2. 检查实例IP:确认实例获取到的IP地址是否在预期的子网内。
  3. 检查计算节点网络
    • 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回复。如果能,说明二层是通的,问题可能在三层(路由)或安全组。
  4. 检查DHCP服务:查看网络节点或计算节点(如果DHCP Agent部署在上面)的/var/log/neutron/dhcp-agent.log,看是否有为你的实例分配IP的日志。
  5. 检查路由和浮动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作为云操作系统基石的核心能力。

返回列表