网络 → 子网 → 路由 → 安全组 → 实例 → 浮动 IP第一次完整走通云主机诞生全流程并学会判断“它真的活着”一、部署概述项目值业务网private 10.0.0.0/24geneve带 DHCP外部网public 172.24.4.0/24flatbr-ex 网关 172.24.4.1镜像cirrosqcow2约 13MB规格m1.tiny1 vCPU / 512MB / 1GB 盘上篇回顾三Packstack 单机一键部署与 10 步验证——部署完成10 步验证通过到镜像环节。本篇以 CLI 为主线每步都对应 Dashboard 里的同名操作文末给出对照表从零创建一台真正可登录的云主机。请先source /root/keystonerc_admin。二、准备镜像务必先验 sizePackstack 部署时自动注册了一个 cirros 镜像但正如坑 2 预告的它可能是个 273 字节的“假镜像”。稳妥做法是自己传一个bashwget http://download.cirros-cloud.net/0.5.2/cirros-0.5.2-x86_64-disk.imgopenstack image create cirros \--file cirros-0.5.2-x86_64-disk.img \--disk-format qcow2 --container-format bare --publicopenstack image show cirros -c size -c disk_format -c status -f value✔应该看到size 为 13M~20M 量级、qcow2、active。★ 如果 size 是几百字节立刻停手——302 页面被当成了镜像先看第五篇领解药再回来。参数解释--disk-format qcow2稀疏磁盘格式节省存储OpenStack 默认推荐--container-format bare镜像外没有再包一层如 ovf/tar裸镜像就是 bare--public所有项目可见测试镜像设 public 方便正式环境镜像默认 private常用云镜像源汇总都有 qcow2 现成下载发行版地址Cirroshttp://download.cirros-cloud.net/CentOShttp://cloud.centos.org/centos/7/images/Ubuntuhttps://cloud-images.ubuntu.com/Rockyhttps://dl.rockylinux.org/pub/rocky/9/images/x86_64/已有 imgraw想转 qcow2qemu-img convert -f raw -O qcow2 myserver.img myserver.qcow2三、创建网络与子网3.1 外部网络flat直接桥到物理网卡bashopenstack network create --external \--provider-physical-network extnet \--provider-network-type flat publicopenstack subnet create --network public \--subnet-range 172.24.4.0/24 --gateway 172.24.4.1 \--allocation-pool start172.24.4.100,end172.24.4.200 \--no-dhcp public-subnet理解要点--external标记为外部网络路由器的出口--provider-physical-network extnet对应 Neutron 配置里physical_network映射到br-ex网桥的名字名字要与 ML2 配置一致这是 provider 网络最常见的出错点--no-dhcp外网通常不做 DHCP浮动 IP 从 allocation-pool 里取3.2 内部网络geneve 租户网络带 DHCPbashopenstack network create privateopenstack subnet create --network private \--subnet-range 10.0.0.0/24 --dhcp private-subnet应该看到openstack network list --long出现 publicflat/ExternalTrue和 privategeneve两个网络。两种网络类型的分工provider 网络flat直接映射物理网性能好但占用真实 IP租户网络geneve用隧道封装支持任意多租户隔离是私有云的主力。实例默认挂在租户网络上。四、路由与安全组4.1 路由打通内外网bashopenstack router create router1openstack router add subnet router1 private-subnet # 内网接口openstack router set router1 --external-gateway public # 外网网关至此三层链路打通实例(10.0.0.x) → private 子网 → router1 → public → br-ex → 物理网。图表代码SNAT 出网DNAT 入站云主机 10.0.0.xprivate-subnetgeneverouter1public 172.24.4.0/24flatbr-ex 物理网浮动IP 172.24.4.x4.2 安全组默认只放行“同组内”流量坑 4bashopenstack security group rule create --proto icmp defaultopenstack security group rule create --proto tcp --dst-port 22 default不加这两条规则从外面 ping/SSH 实例的浮动 IP 会全部丢包——这是新手第二大错觉来源第一大是坑 1症状和“实例死了”一模一样实际只是门没开。五、创建实例与“真活三连”验证bashopenstack flavor list # 选 m1.tinyopenstack server create --flavor m1.tiny --image cirros \--network private test-vmopenstack server list# ✔ 状态 ACTIVE分配到 10.0.0.x★ 但 ACTIVE 不代表真的跑起来了坑 1全系列最重要的判断标准。做“真活三连”bash# 1) console.log 有内核引导输出假的只会有 cloud-init 元数据openstack console log show test-vm | head# 2) 到实例所在节点看 CPU time 持续增长无 KVM 环境增长慢是正常的virsh dominfo instance-00000001 | grep CPU time# 3) 实例控制台里应出现 cirros 登录横幅tail -f /var/lib/nova/instances/实例UUID/console.log无 KVM 环境的预期cirros 引导约 1~3 分钟期间 CPU time 缓慢增长、console.log 逐渐出现内核日志。如果几分钟后 console.log 仍无任何内核输出、CPU time 几乎不动那就是实例根本没引导——回看镜像 size第五篇。六、浮动 IP 与登录验证bash# 从外网地址池取一个浮动 IP 并绑定openstack floating ip create public # 得到 172.24.4.xopenstack server add floating ip test-vm 172.24.4.199# 放行过 icmp/22 后从外部验证ping -c 3 172.24.4.199 # 实测0% 丢包ssh cirros172.24.4.199 # 密码 cubswin:)✔应该看到CirrOS 登录横幅上面打印着实例的内网 IP、网卡、主机名等启动信息。浮动 IP 的原理一句话router1 在 public 网络上做 DNAT把浮动 IP 的流量转发到实例的固定 IP实例出网则走 SNAT。所以固定 IP10.0.0.x是实例的“身份证”浮动 IP 是它的“门牌号”。七、CLI 与 Dashboard 操作对照表CLIDashboard 位置image create项目 → 计算 → 镜像 → 创建镜像network create项目 → 网络 → 网络 → 创建网络router create / set项目 → 网络 → 路由拓扑security group rule create项目 → 网络 → 安全组 → 管理规则server create项目 → 计算 → 实例 → 创建实例floating ip create / add创建实例向导第 4 步“网络”或 实例 → 绑定浮动 IPconsole log show实例 → 动作 → 控制台日志七点五、创建实例的完整姿势超出最小示例的参数第五节的命令是最小可用版本生产中创建实例还要带这些参数bashopenstack server create \--flavor m1.small \--image centos7 \--network private \--security-group web-sg \--key-name mykey \--availability-zone nova:compute1 \--property departmentops \--user-data cloud-init.yaml \--wait web-01参数作用说明--security-group指定安全组不指定则用 default只放同组内流量--key-name注入 SSH 公钥云镜像没有密码必须用密钥登录--availability-zone指定调度节点nova:compute1 调度到 compute1排障/隔离时常用--property自定义元数据可配合调度过滤器使用--user-data云初始化脚本开机自动装软件/改配置cloud-init--wait阻塞等状态变化脚本化创建必备否则要轮询 status自定规格flavor示例——内置规格不合用时bashopenstack flavor create --vcpus 2 --ram 2048 --disk 20 web.medium --publicopenstack flavor list密钥对bashopenstack keypair create mykey /root/mykey.pem # 私钥只此一份务必备份chmod 600 /root/mykey.pemssh -i /root/mykey.pem centos浮动IP # 云镜像用户名centos/ubuntu/cloud-usercirros 用密码登录是特例教学友好所有云镜像的标准登录方式都是密钥--key-name参数从第一次创建正式实例起就该带上。八、两个网络原理补课看懂你建的东西8.1 geneve 隧道租户网络为什么能隔离geneve 是一种隧道封装协议实例发出的普通以太网帧在物理网传输时被套上一层 UDP 外壳外层 IP 是两台宿主机的 IP外壳里带着一个 24 位的 VNI网络标识符。不同租户网络的 VNI 不同物理网上的流量即使混在一起解包时也会被正确隔离——这就是为什么 private 网络可以用 10.0.0.0/24 这种“烂大街”的网段而不冲突。对比早期方案 VLAN 只有 12 位 ID4094 个大环境不够用geneve 24 位16M且元数据可扩展这是 Train 默认它的原因。8.2 浮动 IP 的 SNAT/DNAT 全过程图表代码入站 DNAT目的 172.24.4.199改写为 10.0.0.5外部用户router1实例出网 SNAT源地址改写为 172.24.4.x实例 10.0.0.5router1br-ex 物理网router1 在 public 网络接口上维护一张 NAT 表出网SNAT实例访问外网时源 IP 10.0.0.5 被改写为路由器的外网地址回程流量按表回翻入站DNAT外部访问浮动 IP 172.24.4.199 时目的 IP 被改写为 10.0.0.5这也解释了两个常见现象为什么实例不绑浮动 IP 也能上网出网只靠 SNAT为什么绑了浮动 IP 还 ping 不通DNAT 的入站规则有了但安全组没放行——坑 4。想亲眼看这张表登录 controller 执行ip netns | grep qrouter找到路由器命名空间ip netns exec qrouter-xxx iptables -t nat -L -n。九、cirros为什么全世界的教程都用它特性cirrosCentOS/Ubuntu 云镜像体积~13MB200MB~1GB引导时间数秒~1分钟无 KVM 下 1~3 分钟无 KVM 下 10 分钟用途专为核心链路验证设计接近生产登录方式密码 cubswin:)密钥/云-initcirros 是 OpenStack 官方维护的迷你测试系统它的存在意义就是把“验证云平台能不能跑”这个动作的成本压到最低。教学、验收、巡检都用它真正交付业务时再换云镜像。它的登录横幅本身就是一份“健康报告”——上面打印的 IP、网卡、主机名信息与元数据服务一致说明 metadata 链路也是通的。十、小结阶段关键命令易错点镜像openstack image createsize 只有几百字节 302 坑坑 2外网flat allocation-poolphysical-network 名字与 ML2 配置不一致内网geneve dhcp忘记加 DHCP 实例拿不到 IP路由router set --external-gateway忘设外网网关则实例出不了网安全组放行 icmp/22坑 4忘放行症状像“实例死了”实例server createACTIVE ≠ 真活做三连验证坑 1下篇预告五单机故障排查实录——我们部署时踩到的最隐蔽的坑Glance 里那个“镜像”其实是一个 273 字节的 HTML 文件。完整定位过程 修复方法。