Skip to content

OpenStack 运维教材:从零基础到高级

适用人群:Linux 运维工程师、云计算工程师、DevOps 工程师
前置知识:Linux 基础、网络基础、虚拟化基础
OpenStack 版本:2024.2 (Dalmatian) / 2025.1 (Epoxy)


第一部分:基础篇(入门)

第1章 OpenStack 概述

1.1 什么是 OpenStack

OpenStack 是一个开源的云计算管理平台,提供 IaaS (Infrastructure as a Service) 能力。
它可以管理计算、存储、网络三大核心资源,让用户通过 API 或 Web 界面自助申请和使用 IT 资源。

类比理解:

概念传统 ITOpenStack 云计算
申请服务器找IT部门,等1-2周API调用,30秒出机器
扩容采购硬件,上架部署点击/调用,分钟级
网络配置手动配交换机/VLAN软件定义网络 (SDN)
存储分配SAN/NAS LUN划分按需分配,秒级
资源回收手动下线API调用,立即释放

1.2 OpenStack 核心组件

┌─────────────────────────────────────────────────────┐
│                   Horizon (UI)                       │
├─────────────────────────────────────────────────────┤
│                                                     │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐          │
│  │  Nova    │  │  Neutron │  │  Cinder  │          │
│  │ (计算)   │  │ (网络)   │  │ (块存储) │          │
│  └──────────┘  └──────────┘  └──────────┘          │
│                                                     │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐          │
│  │  Glance  │  │ Keystone │  │  Swift   │          │
│  │ (镜像)   │  │ (认证)   │  │ (对象存储)│          │
│  └──────────┘  └──────────┘  └──────────┘          │
│                                                     │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐          │
│  │   Heat   │  │ Octavia  │  │Designate │          │
│  │ (编排)   │  │ (负载均衡)│  │ (DNS)   │          │
│  └──────────┘  └──────────┘  └──────────┘          │
│                                                     │
├─────────────────────────────────────────────────────┤
│        MariaDB (数据库) + RabbitMQ (消息队列)        │
└─────────────────────────────────────────────────────┘

核心组件详解:

组件项目名功能对标 AWS
KeystoneIdentity统一认证、授权、服务目录IAM
NovaCompute虚拟机生命周期管理EC2
NeutronNetworking软件定义网络 (SDN)VPC
GlanceImage虚拟机镜像管理AMI
CinderBlock Storage块存储卷管理EBS
SwiftObject Storage对象存储S3
HeatOrchestration资源编排 (IaC)CloudFormation
OctaviaLoad Balancer负载均衡服务ELB/ALB
DesignateDNSDNS 服务Route53
BarbicanKey Manager密钥/证书管理KMS
CeilometerTelemetry计量与监控CloudWatch

1.3 OpenStack 项目/租户/用户 概念

OpenStack 多租户模型:

Cloud Admin (超级管理员)

  ├── Project A (研发部)
  │   ├── User: alice (admin角色)
  │   ├── User: bob (member角色)
  │   ├── VM: web-01, web-02, db-01
  │   ├── Network: dev-net (10.10.1.0/24)
  │   └── Volume: data-vol-1 (100GB)

  ├── Project B (运维部)
  │   ├── User: charlie (admin角色)
  │   ├── VM: monitor-01, log-01
  │   ├── Network: ops-net (10.10.2.0/24)
  │   └── Volume: backup-vol (500GB)

  └── Project C (测试部)
      ├── User: dave (member角色)
      ├── VM: test-01
      └── Network: test-net (10.10.3.0/24)

关键概念:

  • Project (项目/租户): 资源隔离边界,不同项目间网络/VM/存储完全隔离
  • User (用户): 可以属于多个项目
  • Role (角色): 控制用户在项目中的权限 (admin, member, reader)
  • Domain (域): 项目和用户的逻辑分组,用于多组织场景

第2章 环境搭建与 CLI 基础

2.1 DevStack 快速体验

bash
# 在 Ubuntu 22.04 上快速搭建开发/测试环境
# 注意:DevStack 仅用于学习/开发,不要用于生产!

# 创建 stack 用户
sudo useradd -s /bin/bash -d /opt/stack -m stack
echo "stack ALL=(ALL) NOPASSWD: xxx" | sudo tee /etc/sudoers.d/stack
su - stack

# 下载 DevStack
git clone https://opendev.org/openstack/devstack
cd devstack

# 最小化配置
cat > local.conf << 'EOF'
[[local|localrc]]
ADMIN_PASSWORD=xxx
DATABASE_PASSWORD=xxx
RABBIT_PASSWORD=xxx
SERVICE_PASSWORD=xxx

# 仅启用核心服务
disable_all_services
enable_service key nova n-api n-cpu n-cond n-sch n-novnc
enable_service neutron q-svc q-agt q-dhcp q-l3 q-meta
enable_service horizon
enable_service mysql rabbit
EOF

# 安装 (约30-60分钟)
./stack.sh

2.2 OpenStack CLI 安装与配置

bash
# 安装 CLI
pip3 install python-openstackclient

# 配置认证 (使用 admin-openrc.sh)
export OS_AUTH_URL=http://10.0.1.100:5000/v3
export OS_PROJECT_NAME=admin
export OS_USERNAME=xxx
export OS_PASSWORD=xxx
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_REGION_NAME=RegionOne
export OS_IDENTITY_API_VERSION=3

# 验证连接
openstack token issue
openstack service list
openstack endpoint list

2.3 CLI 常用命令速查

bash
# ==================== 认证与项目 ====================
openstack token issue                          # 获取/验证 token
openstack project list                          # 列出所有项目
openstack project create --description "研发部" dev-project
openstack user create --project dev-project --password-prompt devuser
openstack role add --project dev-project --user devuser member

# ==================== 计算 (Nova) ====================
openstack flavor list                           # 列出规格
openstack flavor create m1.custom \
  --ram 4096 --disk 40 --vcpus 4               # 创建规格
openstack server list --all-projects            # 列出所有VM
openstack server create my-vm \
  --flavor m1.medium --image ubuntu-22.04 \
  --network dev-net --key-name mykey            # 创建VM
openstack server show my-vm                     # 查看详情
openstack server stop my-vm                     # 关机
openstack server start my-vm                    # 开机
openstack server reboot my-vm                   # 重启
openstack server delete my-vm                   # 删除
openstack console url show my-vm                # VNC 控制台

# ==================== 网络 (Neutron) ====================
openstack network list                          # 列出网络
openstack network create my-net                 # 创建网络
openstack subnet create my-subnet \
  --network my-net --subnet-range 10.10.1.0/24  # 创建子网
openstack router create my-router               # 创建路由器
openstack router set my-router \
  --external-gateway external-net               # 关联外网
openstack router add subnet my-router my-subnet # 添加子网
openstack floating ip create external-net       # 申请浮动IP
openstack server add floating ip my-vm 203.0.113.10  # 绑定浮动IP
openstack security group list                    # 安全组列表

# ==================== 存储 (Cinder) ====================
openstack volume list --all-projects            # 列出所有卷
openstack volume create --size 100 data-vol     # 创建100G卷
openstack server add volume my-vm data-vol      # 挂载卷到VM
openstack snapshot create --name snap-1 data-vol # 创建快照

# ==================== 镜像 (Glance) ====================
openstack image list                            # 列出镜像
openstack image create ubuntu-22.04 \
  --file ubuntu-22.04.qcow2 \
  --disk-format qcow2 --container-format bare   # 上传镜像

# ==================== 运维查看 ====================
openstack compute service list                  # Nova 服务状态
openstack network agent list                    # 网络 Agent 状态
openstack hypervisor list                       # 宿主机列表
openstack hypervisor show compute-01            # 宿主机详情
openstack hypervisor stats show                 # 资源统计

第二部分:进阶篇

第3章 深入 Nova 计算服务

3.1 Nova 架构详解

┌────────────────────────────────────────────────────────┐
│                     Nova 架构                           │
│                                                        │
│  用户请求 → API (8774) → Policy → Conductor → DB       │
│                                ↓                       │
│                    ┌───────────────────┐               │
│                    │    Scheduler       │               │
│                    │  (资源调度/过滤)    │               │
│                    └─────────┬─────────┘               │
│                              │ RPC (RabbitMQ)           │
│              ┌───────────────┼───────────────┐         │
│              ↓               ↓               ↓         │
│        ┌──────────┐   ┌──────────┐   ┌──────────┐     │
│        │nova-     │   │nova-     │   │nova-     │     │
│        │compute   │   │compute   │   │compute   │     │
│        │(host-1)  │   │(host-2)  │   │(host-3)  │     │
│        └────┬─────┘   └────┬─────┘   └────┬─────┘     │
│             │              │              │            │
│        ┌────┴────┐   ┌────┴────┐   ┌────┴────┐      │
│        │libvirtd │   │libvirtd │   │libvirtd │      │
│        │(KVM)    │   │(KVM)    │   │(KVM)    │      │
│        └─────────┘   └─────────┘   └─────────┘      │
└────────────────────────────────────────────────────────┘

Nova 关键组件:

组件部署位置作用
nova-apiControllerREST API 入口,接收用户请求
nova-conductorController数据库操作代理,隔离 compute 对 DB 的直接访问
nova-schedulerController选择最优计算节点运行 VM
nova-computeCompute管理 hypervisor,执行 VM 生命周期操作
placementController资源追踪与分配 (独立服务)

3.2 VM 创建流程深度解析

创建 VM 请求的完整流程:

1. 用户发起 POST /servers 请求

2. nova-api 验证请求 + Token 认证 (Keystone)

3. nova-api 在 DB 中创建 instance 记录 (状态=building)

4. nova-api 发送 RPC 消息到 scheduler

5. nova-scheduler 执行过滤 + 权重计算:
   │  过滤阶段 (Filter):
   │  ├── AvailabilityZoneFilter   → 匹配 AZ
   │  ├── ComputeFilter            → 节点是否 enabled
   │  ├── ComputeCapabilitiesFilter → CPU/内存/磁盘是否足够
   │  ├── ImagePropertiesFilter    → 架构匹配 (x86/ARM)
   │  ├── ServerGroupAntiAffinityFilter → 反亲和
   │  └── RetryFilter              → 排除之前失败的节点

   │  权重阶段 (Weigher):
   │  ├── RAMWeigher              → 内存剩余多的优先
   │  ├── DiskWeigher             → 磁盘剩余多的优先
   │  └── IoOpsWeigher            → IO负载低的优先

6. scheduler 选择最优 compute 节点

7. nova-conductor 发送 RPC 到目标 nova-compute

8. nova-compute 执行:
   │  a. 分配网络端口 (调用 Neutron)
   │  b. 分配块存储卷 (调用 Cinder)
   │  c. 从 Glance 下载镜像 (如果是首次使用,缓存到本地)
   │  d. 调用 libvirt 创建并启动 VM
   │     - 生成 XML domain 定义
   │     - 创建 qcow2 磁盘 (COW, 基于镜像快照)
   │     - 配置网络 (tap 设备 + OVS/OVN)
   │     - 启动 QEMU/KVM 进程

9. VM 状态更新为 ACTIVE

3.3 Nova 关键配置调优

ini
# /etc/nova/nova.conf 关键调优项

[DEFAULT]
# 并发构建控制 (千节点必须调优)
max_concurrent_builds = 20          # 同时创建的 VM 数
max_concurrent_live_migrations = 4  # 同时热迁移数

# RPC 超时
rpc_response_timeout = 600          # 大规模环境增大

# 调度器
scheduler_default_filters = \
  AvailabilityZoneFilter,ComputeFilter,\
  ComputeCapabilitiesFilter,ImagePropertiesFilter,\
  ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter

[libvirt]
virt_type = kvm
cpu_mode = host-passthrough          # 透传 CPU 特性
live_migration_uri = qemu+tcp://%s/system
live_migration_tunnelled = true      # 加密迁移通道
live_migration_permit_auto_converge = true

[compute]
# 连续失败 N 次后标记服务为 down
consecutive_build_service_disable_threshold = 10

[placement]
# Placement API 调优
randomize_allocation_candidates = true

3.4 热迁移实战

bash
# 检查迁移前提条件
# 1. 源和目标节点 CPU 型号兼容
# 2. 共享存储 (Ceph RBD) 或本地镜像迁移
# 3. 网络连通 (迁移网络)

# 查看 VM 所在节点
openstack server show my-vm -c OS-EXT-SRV-ATTR:host

# 冷迁移 (关机迁移)
openstack server migrate my-vm --os-migrate-params 'host=compute-02' --wait

# 热迁移 (Live Migration)
openstack server migrate my-vm --live-migration \
  --host compute-02 --wait

# 块迁移 (无共享存储时)
openstack server migrate my-vm --live-migration \
  --block-migration --host compute-02 --wait

# 监控迁移进度
openstack server migration list --server my-vm

# 查看迁移日志
journalctl -u openstack-nova-compute -f

# 常见迁移故障:
# - 错误: "Live migration not supported" → 检查 CPU 兼容性
# - 错误: "No valid host" → 目标节点资源不足
# - 超时: 内存脏页速率 > 迁移速率 → 增大带宽或降低 VM 负载

第4章 深入 Neutron 网络

4.1 Neutron 架构 (OVN 模式)

┌──────────────────────────────────────────────────────┐
│                  Neutron + OVN 架构                   │
│                                                      │
│  ┌─────────────────────────────────────────┐         │
│  │          neutron-server (API)            │         │
│  │  REST API → 写入 Neutron DB → 同步 OVN   │         │
│  └───────────────────┬─────────────────────┘         │
│                      │                               │
│  ┌───────────────────┴─────────────────────┐         │
│  │          OVN Northbound DB               │         │
│  │  (逻辑网络: switch, router, ACL, port)    │         │
│  └───────────────────┬─────────────────────┘         │
│                      │                               │
│  ┌───────────────────┴─────────────────────┐         │
│  │          ovn-northd (翻译器)             │         │
│  │  NB 逻辑 → 逻辑流表 → SB                  │         │
│  └───────────────────┬─────────────────────┘         │
│                      │                               │
│  ┌───────────────────┴─────────────────────┐         │
│  │          OVN Southbound DB               │         │
│  │  (逻辑流表: 实际转发规则)                  │         │
│  └───────────────────┬─────────────────────┘         │
│                      │ Geneve Tunnel                  │
│     ┌────────────────┼────────────────┐               │
│     ↓                ↓                ↓               │
│  ┌──────┐      ┌──────┐      ┌──────┐               │
│  │ovn-  │      │ovn-  │      │ovn-  │               │
│  │ctrl  │      │ctrl  │      │ctrl  │  (每个节点)     │
│  └──┬───┘      └──┬───┘      └──┬───┘               │
│     │             │             │                    │
│  ┌──┴───┐      ┌──┴───┐      ┌──┴───┐               │
│  │ OVS  │      │ OVS  │      │ OVS  │               │
│  │br-int│      │br-int│      │br-int│               │
│  └──────┘      └──────┘      └──────┘               │
└──────────────────────────────────────────────────────┘

4.2 网络类型与流量模型

bash
# Provider Network (直连物理网络)
openstack network create provider-net \
  --external --provider-network-type vlan \
  --provider-physical-network physnet1 \
  --provider-segment 100

# Self-service Network (租户 overlay)
openstack network create tenant-net     # Geneve 封装
openstack subnet create tenant-subnet \
  --network tenant-net \
  --subnet-range 192.168.1.0/24 \
  --dns-nameserver 8.8.8.8

# East-West 流量 (同网段 VM 间通信)
# VM-A → tap → br-int → OVS flow → Geneve tunnel → br-int → tap → VM-B

# North-South 流量 (VM 访问外网)
# VM → tap → br-int → OVS flow → Gateway node → br-ex → 物理网络

4.3 OVN/OVS 调试命令

bash
# OVS 基础检查
ovs-vsctl show                          # 查看 bridge 和 port
ovs-vsctl list-br                       # 列出所有 bridge
ovs-ofctl dump-flows br-int             # 查看流表
ovs-ofctl dump-ports br-int             # 端口流量统计

# OVN 调试
ovn-nbctl show                          # 查看 NB 逻辑网络
ovn-nbctl list logical_switch           # 逻辑交换机
ovn-nbctl list logical_router           # 逻辑路由器
ovn-nbctl list acl                      # ACL 规则
ovn-sbctl show                          # 查看 SB chassis
ovn-sbctl list logical_flow             # 逻辑流表
ovn-sbctl find chassis hostname=compute-01  # 查找 chassis

# 追踪 VM 数据包路径
ovn-trace tenant-net \
  'inport == "vm-port" && \
   eth.src == fa:16:3e:aa:bb:cc && \
   eth.dst == fa:16:3e:dd:ee:ff && \
   ip4.src == 192.168.1.10 && \
   ip4.dst == 192.168.1.11 && \
   ip.ttl == 64'

# 检查 tunnel 状态
ovs-appctl -t ovs-monitor-ipsec ipsec/status
ovs-vsctl list interface | grep -A5 tunnel

# 检查安全组 (ACL)
# OVN 安全组通过 ACL 实现
ovn-nbctl list acl | grep -B2 -A5 "security_group"

# 抓包调试
# 在 VM tap 口抓包
tcpdump -i tap-<vm-uuid-first8> -n port 80

# 在 tunnel 口抓包
tcpdump -i genev_sys_6081 -n

4.4 安全组深度解析

bash
# 安全组是有状态的 (连接追踪)
# ingress = 入方向 (到VM), egress = 出方向 (从VM)

# 创建安全组并配置
openstack security group create sg-web

# 允许 SSH (仅内网)
openstack security group rule create sg-web \
  --protocol tcp --dst-port 22 \
  --remote-ip 10.0.0.0/8 --ingress

# 允许 HTTP/HTTPS (公网)
openstack security group rule create sg-web \
  --protocol tcp --dst-port 80,443 \
  --remote-ip 0.0.0.0/0 --ingress

# 允许 ICMP
openstack security group rule create sg-web \
  --protocol icmp --ingress

# 允许出方向 (通常默认允许)
openstack security group rule create sg-web \
  --protocol tcp --egress --remote-ip 0.0.0.0/0
openstack security group rule create sg-web \
  --protocol udp --egress --remote-ip 0.0.0.0/0

# 安全组间引用 (允许 sg-db 的项目访问 sg-web)
openstack security group rule create sg-web \
  --protocol tcp --dst-port 3306 \
  --remote-group sg-app --ingress

# 应用到 VM
openstack server add security group my-vm sg-web

# 安全组底层实现 (OVN ACL):
# 每个安全组规则会被翻译为 OVS flow 或 OVN ACL
# 使用 conntrack 实现有状态过滤
# 检查: conntrack -L | grep <vm-ip>

第5章 深入 Cinder 与 Ceph 集成

5.1 Cinder 架构

Cinder 架构:

API (cinder-api)
  │ 接收请求: 创建/挂载/快照/删除卷

Scheduler (cinder-scheduler)
  │ 选择最优存储后端

Volume (cinder-volume)
  │ 执行实际操作
  ├── 后端: LVM (本地)
  ├── 后端: Ceph RBD ✅ (推荐)
  ├── 后端: NFS
  └── 后端: 商业 SAN (EMC, NetApp...)

5.2 Ceph RBD 常用运维命令

bash
# Ceph 集群状态
ceph status
ceph health detail

# OSD 状态
ceph osd tree                         # OSD 树状结构
ceph osd df                           # OSD 空间使用
ceph osd perf                         # OSD 性能指标
ceph osd pool ls detail               # 存储池详情

# 查看 RBD 卷 (Cinder 卷在 Ceph 中的映射)
rbd -p volumes ls                     # 列出所有 Cinder 卷
rbd -p volumes info volume-<uuid>     # 查看卷详情
rbd -p volumes du volume-<uuid>       # 磁盘使用量

# 查看快照
rbd -p volumes snap ls volume-<uuid>

# Ceph 集群性能
ceph osd pool stats                   # 实时 IO 统计
ceph tell osd.* bench                 # OSD 性能测试

# 常见 Ceph 问题排查:
# HEALTH_WARN: clock skew → 检查 NTP 同步
# HEALTH_WARN: nearfull → 扩容或清理数据
# PG degraded → 检查 OSD 是否 down
# slow requests → 检查 OSD 负载/磁盘健康

5.3 Cinder 卷操作实战

bash
# 创建卷
openstack volume create --size 100 --type ceph-rbd data-vol-01

# 挂载到 VM (热挂载)
openstack server add volume my-vm data-vol-01

# 在 VM 内使用
# Linux:
fdisk -l                              # 查看新卷 (/dev/vdb)
mkfs.ext4 /dev/vdb
mount /dev/vdb /data
echo "/dev/vdb /data ext4 defaults 0 0" >> /etc/fstab

# 创建快照 (在线/离线均可)
openstack snapshot create --name snap-20240101 data-vol-01

# 从快照恢复
openstack volume create --size 100 \
  --source snap-20240101 data-vol-restored

# 卷扩容 (在线扩容需要 VM 内操作)
openstack volume set --size 200 data-vol-01
# VM 内:
partprobe /dev/vdb                    # 重新扫描分区
resize2fs /dev/vdb                    # 扩展文件系统

# 卷迁移 (跨后端)
openstack volume migrate --host ceph-backend data-vol-01

# 传输卷所有权 (跨项目)
openstack volume transfer request create data-vol-01
# 返回 transfer_id 和 auth_key
openstack volume transfer request accept <transfer-id> <auth-key>

第6章 高可用与故障处理

6.1 控制平面 HA 原理

HA 架构图:

            ┌──────────┐
            │  VIP     │  Keepalived 管理
            │10.0.1.100│  VRRP 心跳检测
            └────┬─────┘

     ┌───────────┼───────────┐
     │           │           │
┌────┴────┐ ┌───┴────┐ ┌───┴────┐
│HAProxy  │ │HAProxy │ │HAProxy │  5 节点
│ctrl-01  │ │ctrl-02 │ │ctrl-03 │
│ ACTIVE  │ │STANDBY │ │STANDBY │
└────┬────┘ └───┬────┘ └───┬────┘
     │          │          │
     │   MariaDB Galera (同步复制)
     │   RabbitMQ (镜像队列)
     │   所有 OpenStack 服务
bash
# HAProxy 状态检查
echo "show stat" | socat /var/lib/haproxy/stats stdio 2>/dev/null
curl -s http://localhost:1993/haproxy?stats

# Keepalived 检查
ip addr show | grep "10.0.1.100"     # 看 VIP 在哪个节点
journalctl -u keepalived -f

# Galera 集群检查
docker exec mariadb mysql -e "SHOW STATUS LIKE 'wsrep_%'" | \
  grep -E "cluster_size|cluster_status|ready|connected"
# 关键指标:
# wsrep_cluster_size = 5           (节点数)
# wsrep_cluster_status = Primary   (集群状态)
# wsrep_ready = ON                 (就绪)
# wsrep_local_state_comment = Synced (同步完成)

# RabbitMQ 检查
docker exec rabbitmq rabbitmqctl cluster_status
docker exec rabbitmq rabbitmqctl list_queues name messages consumers
# 关注: 消息堆积(messages)和无消费者队列

# 常见 HA 故障:
# 1. VIP 漂移 → 检查 keepalived 日志
# 2. Galera 脑裂 → 检查 wsrep_cluster_status
# 3. RabbitMQ 分区 → rabbitmqctl forget_cluster_node

6.2 故障排查方法论

排查框架 (由外到内):

1. 确认故障现象
   - 哪个 API 报错?
   - 影响范围?(单个VM/整个项目/全局)

2. 检查 API 层
   curl -v http://VIP:8774/v2.1/servers  # Nova API
   curl -v http://VIP:9696/v2.0/networks # Neutron API

3. 检查服务状态
   openstack compute service list | grep down
   openstack network agent list | grep "xxx"

4. 检查日志
   # 容器化部署日志位置
   docker logs nova_api 2>&1 | tail -100
   docker logs nova_conductor 2>&1 | grep ERROR
   docker logs neutron_server 2>&1 | tail -100

5. 检查基础设施
   # 数据库
docker exec mariadb mysql -e "SHOW PROCESSLIST" | wc -l
docker exec mariadb mysql -e "SHOW STATUS LIKE 'Threads_%'"
   # RabbitMQ
   docker exec rabbitmq rabbitmqctl list_queues messages

6. 检查系统资源
   top -bn1 | head -20
   free -h
   df -h
   iostat -x 1 5

6.3 常见故障场景与解决

bash
# ============ 故障1: VM 创建失败 (BUILD → ERROR) ============
# 排查步骤:
openstack server show <vm-id> -c fault    # 查看错误信息
# 常见原因:
# a) "No valid host was found" → 检查计算节点状态/资源
openstack compute service list --service nova-compute | grep up
openstack hypervisor stats show

# b) "Block device is still being created" → Cinder 卷创建超时
# 检查 cinder-volume 服务
openstack volume service list

# c) "Neutron port creation failed" → 网络问题
openstack network agent list

# ============ 故障2: VM 无法 SSH 连接 ============
# 排查路径:
# 1. 检查 VM 状态
openstack server show my-vm -c status -c addresses

# 2. 检查安全组规则
openstack security group rule list --security-group <sg-id>

# 3. 检查 VNC 控制台是否可访问
openstack console url show my-vm

# 4. 检查网络连通性
# 从同网段 VM ping
# 检查 OVS/OVN 流表

# ============ 故障3: 热迁移失败 ============
# 排查:
openstack server migration list --server <vm-id>
# 常见原因:
# a) CPU 不兼容 → 使用 cpu_mode=host-model
# b) 内存脏页速率过高 → 启用 auto-converge
# c) 存储不可达 → 检查 Ceph 健康
ceph status

# ============ 故障4: API 响应缓慢 ============
# 排查:
# 1. 数据库慢查询
docker exec mariadb mysql -e "SHOW PROCESSLIST" | grep -v Sleep

# 2. RabbitMQ 消息堆积
docker exec rabbitmq rabbitmqctl list_queues \
  name messages messages_ready messages_unacknowledged

# 3. 连接池耗尽
grep "pool size" /var/log/kolla/nova/nova-conductor.log
# 调优: 增大 max_pool_size 和 max_overflow

第三部分:高级篇

第7章 Heat 编排与自动化

7.1 Heat 模板语法 (HOT)

yaml
# heat-3tier-app.yaml - 三层架构应用部署
heat_template_version: 2021-04-16

description: 部署一个三层 Web 应用架构

parameters:
  image:
    type: string
    default: ubuntu-22.04
  flavor:
    type: string
    default: m1.medium
  network:
    type: string
    default: app-net
  key_name:
    type: string
    default: mykey

resources:
  # 负载均衡器
  lb:
    type: OS::Octavia::LoadBalancer
    properties:
      name: web-lb
      vip_subnet: {get_param: network}

  lb_listener:
    type: OS::Octavia::Listener
    properties:
      name: http-listener
      protocol: HTTP
      protocol_port: 80
      loadbalancer: {get_resource: lb}

  lb_pool:
    type: OS::Octavia::Pool
    properties:
      name: web-pool
      protocol: HTTP
      lb_algorithm: ROUND_ROBIN
      listener: {get_resource: lb_listener}

  lb_monitor:
    type: OS::Octavia::HealthMonitor
    properties:
      type: HTTP
      url_path: /health
      delay: 10
      timeout: 5
      max_retries: 3
      pool: {get_resource: lb_pool}

  # Web 服务器组 (3台)
  web_servers:
    type: OS::Heat::ResourceGroup
    properties:
      count: 3
      resource_def:
        type: web_server.yaml
        properties:
          image: {get_param: image}
          flavor: {get_param: flavor}
          network: {get_param: network}
          key_name: {get_param: key_name}
          pool_id: {get_resource: lb_pool}

  # 浮动 IP
  floating_ip:
    type: OS::Neutron::FloatingIP
    properties:
      floating_network: external-net

  floating_ip_assoc:
    type: OS::Neutron::FloatingIPAssociation
    properties:
      floatingip_id: {get_resource: floating_ip}
      port_id: {get_attr: [lb, vip_port_id]}

outputs:
  app_url:
    description: 应用访问地址
    value: {get_attr: [floating_ip, floating_ip_address]}
bash
# 部署 Heat Stack
openstack stack create -t heat-3tier-app.yaml my-stack

# 查看 Stack 状态
openstack stack show my-stack
openstack stack resource list my-stack

# 查看事件日志
openstack stack event list my-stack

# 更新 Stack
openstack stack update -t heat-3tier-app-v2.yaml my-stack

# 删除 Stack
openstack stack delete my-stack

第8章 性能调优与大规模运维

8.1 数据库调优

ini
# MariaDB Galera 调优 (/etc/mysql/conf.d/openstack.cnf)

[mysqld]
# 连接数 (千节点必须增大)
max_connections = 4096
max_connect_errors = 100000

# InnoDB 优化
innodb_buffer_pool_size = 64G          # 物理内存的 70%
innodb_buffer_pool_instances = 16
innodb_log_file_size = 2G
innodb_flush_log_at_trx_commit = 1     # 1=最安全, 2=更快
innodb_flush_method = O_DIRECT
innodb_io_capacity = 2000              # SSD 调高
innodb_io_capacity_max = 4000

# 查询缓存 (Galera 下建议关闭)
query_cache_type = 0
query_cache_size = 0

# 慢查询日志
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2

# Galera 复制优化
wsrep_slave_threads = 16               # 并行复制线程
wsrep_sync_wait = 1                    # 1=强一致, 0=最终一致

8.2 RabbitMQ 调优

bash
# RabbitMQ 配置优化

# 1. 内存水位设置
docker exec rabbitmq rabbitmqctl set_vm_memory_high_watermark 0.7

# 2. 镜像队列策略 (关键队列)
docker exec rabbitmq rabbitmqctl set_policy ha-all "^nova\." \
  '{"ha-mode":"exactly","ha-params":3,"ha-sync-mode":"automatic"}' \
  --apply-to queues

docker exec rabbitmq rabbitmqctl set_policy ha-all "^neutron\." \
  '{"ha-mode":"exactly","ha-params":3,"ha-sync-mode":"automatic"}' \
  --apply-to queues

# 3. 消费者超时
docker exec rabbitmq rabbitmqctl set_policy consumer-timeout ".*" \
  '{"consumer-timeout":1800000}' --apply-to queues

# 4. 磁盘水位
docker exec rabbitmq rabbitmqctl set_disk_free_limit 2GB

# 5. 监控队列状态
docker exec rabbitmq rabbitmqctl list_queues \
  name messages consumers \
  | sort -k2 -rn | head -20

8.3 计算节点超分策略

ini
# /etc/nova/nova.conf

[DEFAULT]
# CPU 超分比
cpu_allocation_ratio = 4.0        # 4:1 通用场景
# cpu_allocation_ratio = 2.0      # 2:1 高性能场景
# cpu_allocation_ratio = 8.0      # 8:1 开发测试

# 内存超分比 (生产建议不超分)
ram_allocation_ratio = 1.0        # 1:1 生产环境
# ram_allocation_ratio = 1.5     # 1.5:1 轻负载环境

# 磁盘超分比
disk_allocation_ratio = 1.0       # 不建议超分磁盘

# 预留资源 (系统保留)
reserved_host_memory_mb = 8192    # 保留 8GB 给系统
reserved_host_disk_mb = 20480     # 保留 20GB 给系统
reserved_host_cpus = 2            # 保留 2 个核心
bash
# 动态调整超分比 (通过 Placement API)
openstack allocation candidate list \
  --resource VCPU=1 \
  --resource MEMORY_MB=1024

# 按节点设置不同超分比
# 使用 flavor extra_specs 控制调度
openstack flavor set m1.highperf \
  --property hw:cpu_sockets=1 \
  --property hw:cpu_cores=8 \
  --property hw:cpu_threads=1 \
  --property hw:cpu_policy=dedicated  # 独占 CPU

8.4 大规模运维自动化

bash
#!/bin/bash
# daily-operations.sh - 日常运维自动化

set -euo pipefail
source /etc/kolla/admin-openrc.sh

# 1. 清理孤儿资源
echo "=== 清理孤儿资源 ==="

# 删除 ERROR 状态的 VM
for vm in $(openstack server list --all-projects --status ERROR \
  -f value -c ID 2>/dev/null); do
  echo "删除 ERROR VM: $vm"
  openstack server delete "$vm" --wait 2>/dev/null || true
done

# 删除未使用的卷 (available 状态超过 7 天)
for vol in $(openstack volume list --all-projects --status available \
  -f value -c ID -c Created\ At 2>/dev/null | \
  awk '$2 < "'$(date -d '7 days ago' +%Y-%m-%d)'" {print $1}'); do
  echo "删除过期空闲卷: $vol"
  # openstack volume delete "$vol"  # 取消注释以启用

  # 2. 检查并修复服务异常
echo "=== 服务健康检查 ==="

# 重启 down 状态的 nova-compute 容器
for host in $(openstack compute service list --service nova-compute \
  -f value -c Host -c State | grep down | awk '{print $1}'); do
  echo "尝试修复: $host"
  ssh "$host" "docker restart nova_compute" 2>/dev/null || true
done

# 3. 容量报告
echo "=== 容量报告 ==="
openstack hypervisor stats show -f yaml | \
  grep -E "vcpus|memory|disk|running"

echo ""
echo "=== 完成 ==="
date

第9章 Keystone 认证与安全

9.1 Fernet Token 机制

bash
# Keystone Token 类型:
# - UUID Token: xxx DB 中,需要定期清理
# - Fernet Token: xxx DB 存储 ✅ (推荐)

# Fernet 密钥轮换
# 密钥文件: /etc/keystone/fernet-keys/
# 0 = 主密钥 (用于加密)
# 1 = 次密钥 (用于解密)
# 2+ = 历史密钥

# 轮换密钥
keystone-manage fernet_rotate

# 建议: 配置 cron 定期轮换
# 0 0 * * * keystone-manage fernet_rotate

# Token 过期时间 (nova.conf)
# [keystone_authtoken]
# token_cache_time = 600
# memcached_servers = ctrl-01:11211,ctrl-02:11211

9.2 RBAC 权限控制

bash
# 角色层次: admin > member > reader

# 创建只读用户
openstack user create --domain default \
  --password-prompt readonly-user
openstack role add --project admin \
  --user readonly-user reader

# 创建项目管理员
openstack user create --domain default \
  --password-prompt project-admin
openstack role add --project dev-project \
  --user project-admin admin

# 创建网络管理员 (仅管理网络)
openstack role create network-admin
# 需要在 policy.json 中定义权限映射

# Domain 管理 (多组织)
openstack domain create org-a
openstack project create --domain org-a project-a1
openstack user create --domain org-a user-a

9.3 审计日志

ini
# /etc/keystone/keystone.conf

[security_compliance]
# 密码策略
lockout_duration = 1800              # 锁定30分钟
lockout_failure_attempts = 5         # 5次失败锁定
password_expires_days = 90           # 密码90天过期
unique_last_password_count = 5       # 不能重复最近5个密码
minimum_password_length = 12         # 最小12字符

[audit]
enabled = true
audit_map_file = /etc/keystone/api_audit_map.yaml

[oslo_middleware]
enable_proxy_headers_parsing = true

附录

A. OpenStack 常用端口

服务端口说明
Keystone5000Identity API
Nova API8774Compute API
Nova Metadata8775Metadata 服务
Nova NoVNC6080VNC Web 控制台
Neutron9696Network API
Glance9292Image API
Cinder8776Volume API
Heat API8004Orchestration API
Heat CFN8000CloudFormation 兼容
Horizon80/443Web UI
RabbitMQ5672AMQP
RabbitMQ Mgmt15672管理界面
MariaDB3306数据库
Memcached11211缓存
Ceph MON6789/3300Ceph Monitor
Ceph OSD6800-7300Ceph OSD

B. 日志文件位置 (Kolla-Ansible)

/var/log/kolla/
├── nova/
│   ├── nova-api.log
│   ├── nova-compute.log
│   ├── nova-conductor.log
│   ├── nova-scheduler.log
│   └── nova-novncproxy.log
├── neutron/
│   ├── neutron-server.log
│   └── neutron-ovn-metadata-agent.log
├── cinder/
│   ├── cinder-api.log
│   ├── cinder-volume.log
│   └── cinder-scheduler.log
├── glance/
│   └── glance-api.log
├── keystone/
│   └── keystone.log
├── heat/
│   ├── heat-api.log
│   └── heat-engine.log
├── haproxy/
│   └── haproxy.log
└── rabbitmq/
    └── rabbit@ctrl-01.log

C. 学习路线图

初级 (1-3个月)
├── Linux 基础 (文件/进程/网络)
├── KVM/libvirt 基础
├── OpenStack 安装 (DevStack/PackStack)
├── CLI 基本操作
└── Horizon 界面操作

中级 (3-6个月)
├── Nova 深入 (调度/迁移/资源管理)
├── Neutron 深入 (OVN/OVS/安全组)
├── Cinder + Ceph 集成
├── Keystone 认证体系
├── 监控告警 (Prometheus + Grafana)
└── 故障排查能力

高级 (6-12个月)
├── Kolla-Ansible 生产部署
├── 大规模集群运维 (1000+节点)
├── 性能调优 (DB/MQ/API)
├── 安全加固 (审计/加密/合规)
├── 自动化运维 (Ansible/Python)
├── 升级迁移方案
└── 架构设计与容量规划

专家 (1-2年)
├── OpenStack 源码阅读
├── 自定义插件/驱动开发
├── 多站点/多云联邦
├── 容器化 (K8s + OpenStack 集成)
├── GPU/SR-IOV/DPDK 高级特性
└── 技术选型与架构决策