主题
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 资源。
类比理解:
| 概念 | 传统 IT | OpenStack 云计算 |
|---|---|---|
| 申请服务器 | 找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 |
|---|---|---|---|
| Keystone | Identity | 统一认证、授权、服务目录 | IAM |
| Nova | Compute | 虚拟机生命周期管理 | EC2 |
| Neutron | Networking | 软件定义网络 (SDN) | VPC |
| Glance | Image | 虚拟机镜像管理 | AMI |
| Cinder | Block Storage | 块存储卷管理 | EBS |
| Swift | Object Storage | 对象存储 | S3 |
| Heat | Orchestration | 资源编排 (IaC) | CloudFormation |
| Octavia | Load Balancer | 负载均衡服务 | ELB/ALB |
| Designate | DNS | DNS 服务 | Route53 |
| Barbican | Key Manager | 密钥/证书管理 | KMS |
| Ceilometer | Telemetry | 计量与监控 | 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.sh2.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 list2.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-api | Controller | REST API 入口,接收用户请求 |
| nova-conductor | Controller | 数据库操作代理,隔离 compute 对 DB 的直接访问 |
| nova-scheduler | Controller | 选择最优计算节点运行 VM |
| nova-compute | Compute | 管理 hypervisor,执行 VM 生命周期操作 |
| placement | Controller | 资源追踪与分配 (独立服务) |
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 状态更新为 ACTIVE3.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 = true3.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 -n4.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_node6.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 56.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 -208.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 # 独占 CPU8.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:112119.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-a9.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 常用端口
| 服务 | 端口 | 说明 |
|---|---|---|
| Keystone | 5000 | Identity API |
| Nova API | 8774 | Compute API |
| Nova Metadata | 8775 | Metadata 服务 |
| Nova NoVNC | 6080 | VNC Web 控制台 |
| Neutron | 9696 | Network API |
| Glance | 9292 | Image API |
| Cinder | 8776 | Volume API |
| Heat API | 8004 | Orchestration API |
| Heat CFN | 8000 | CloudFormation 兼容 |
| Horizon | 80/443 | Web UI |
| RabbitMQ | 5672 | AMQP |
| RabbitMQ Mgmt | 15672 | 管理界面 |
| MariaDB | 3306 | 数据库 |
| Memcached | 11211 | 缓存 |
| Ceph MON | 6789/3300 | Ceph Monitor |
| Ceph OSD | 6800-7300 | Ceph 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.logC. 学习路线图
初级 (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 高级特性
└── 技术选型与架构决策