══════════════════════════════════════════════════════════ Nova Metadata 服务构建流程图 ══════════════════════════════════════════════════════════
┌──────────────────────┐
│ 执行构建命令 │
│ kolla-build nova-api│
└──────────┬───────────┘
│
↓
┌──────────────────────┐
│ Kolla 获取源码 │
├──────────────────────┤
│ 1. 克隆 Nova 仓库 │
│ ├─ nova/api/ │
│ │ └─ metadata/ │ ← Metadata 代码!
│ │ ├─ handler.py
│ │ ├─ base.py
│ │ └─ ...
│ ├─ nova/cmd/ │
│ └─ nova/etc/ │
│ │
│ 2. 打包成 tar │
│ nova-base-archive │
└──────────┬───────────┘
│
↓
┌──────────────────────┐
│ 渲染 Dockerfile │
├──────────────────────┤
│ Jinja2 模板处理: │
│ Dockerfile.j2 │
│ ↓ │
│ Dockerfile (真实) │
└──────────┬───────────┘
│
↓
┌──────────────────────────────────────────────┐
│ Docker 分层构建 │
├──────────────────────────────────────────────┤
│ │
│ Layer 1: base │
│ ├─ Ubuntu 22.04 │
│ └─ 基础工具 (curl, git, python3) │
│ ↓ │
│ │
│ Layer 2: openstack-base │
│ ├─ Apache2 + mod_wsgi │
│ ├─ Python pip │
│ └─ OpenStack 公共依赖 │
│ ↓ │
│ │
│ Layer 3: nova-base │
│ ┌─────────────────────────────┐ │
│ │ ADD nova-base-archive │ │
│ │ → 解压 Nova 源码 │ │
│ │ ├─ nova/api/metadata/ │ ← 核心! │
│ │ ├─ nova/cmd/api.py │ │
│ │ └─ nova/etc/ │ │
│ │ │ │
│ │ RUN pip install /nova │ │
│ │ → 安装到 Python 环境 │ │
│ │ /var/lib/kolla/venv/ │ │
│ │ lib/python3.10/ │ │
│ │ site-packages/nova/ │ │
│ │ └─ api/metadata/ │ ← 已安装! │
│ └─────────────────────────────┘ │
│ ↓ │
│ │
│ Layer 4: nova-api │
│ ├─ extend_start.sh (启动脚本) │
│ └─ kolla_httpd_setup (Apache 配置) │
│ │
└──────────────────┬───────────────────────────┘
│
↓
┌──────────────────────┐
│ 构建完成 │
├──────────────────────┤
│ 镜像包含: │
│ ✓ Nova Metadata 代码│
│ ✓ Python 依赖 │
│ ✓ Apache/WSGI │
│ ✓ 配置模板 │
└──────────┬───────────┘
│
↓
┌──────────────────────────────────┐
│ kolla-ansible deploy (部署阶段) │
├──────────────────────────────────┤
│ 注入运行时配置: │
│ ├─ nova.conf │
│ │ [metadata] │
│ │ nova_metadata_port = 8775 │
│ │ │
│ ├─ api-paste.ini │
│ │ [app:metaapp] │
│ │ paste.app_factory = │
│ │ nova.api.metadata. │
│ │ handler:... │
│ │ │
│ └─ Apache VirtualHost 配置 │
│ Listen 8775 │
│ WSGIScriptAlias / ... │
└──────────────┬───────────────────┘
│
↓
┌──────────────────────────────────┐
│ 容器运行 │
├──────────────────────────────────┤
│ Apache 启动 │
│ ├─ 加载 nova.conf │
│ ├─ 加载 api-paste.ini │
│ ├─ 初始化 WSGI 应用 │
│ │ from nova.api.metadata │
│ │ import handler │
│ │ │
│ └─ 监听 8775 端口 │
│ │
│ Metadata 服务就绪! │
│ curl http://169.254.169.254/ │
│ latest/meta-data/ │
└───────────────────────────────────┘
══════════════════════════════════════════════════════════ 关键理解 ══════════════════════════════════════════════════════════
-
Metadata 不是独立镜像
- 集成在 nova-api 镜像中
- 通过 Apache VirtualHost 监听 8775 端口
-
Metadata 代码来源
- Nova 源码的 nova/api/metadata/ 目录
- 在 nova-base 层通过 pip install /nova 安装
-
构建时自动包含
- kolla-build nova-api 会自动包含所有 metadata 代码
- 无需单独指定或配置
-
运行时才配置
- nova.conf 中的 [metadata] 段
- api-paste.ini 中的路由配置
- 这些由 kolla-ansible 在部署时注入
总结:Nova Metadata 服务构建所需资料
直接回答你的问题:
是的,有 metadata 的构建流程,但它不是独立的镜像,而是集成在 nova-api 镜像中。
Metadata 使用的代码清单:
从 Nova 源码中,metadata 服务使用以下代码:
nova/
├── api/metadata/
│ ├── base.py # 生成 metadata 内容的核心逻辑
│ ├── handler.py # HTTP 请求处理器(最重要!)
│ ├── password.py # 实例密码 metadata
│ ├── vendordata.py # 厂商数据
│ └── vendordata_json.py # JSON 格式厂商数据
│
├── cmd/api.py # API 服务启动入口
├── api/openstack/compute/wsgi.py # WSGI 应用初始化
└── etc/nova/api-paste.ini # API 路由配置
构建所需的完整资料:
1. 源码资料 (自动获取)
- Nova 项目完整源码(主要是
nova/api/metadata/目录) - 来源:
https://opendev.org/openstack/nova
2. 依赖库 (自动安装)
- oslo.config, oslo.middleware, oslo.context
- WebOb, Paste, Routes
- requests, eventlet
3. 运行环境 (镜像层提供)
- Apache2/httpd
- mod_wsgi
- Python 3.10+
4. 配置文件 (运行时注入)
nova.conf- 配置 metadata 端口和行为api-paste.ini- 定义 WSGI 路由
快速验证镜像包含的 metadata 代码:
# 查看镜像中的 metadata 文件
docker run --rm quay.io/openstack.kolla/nova-api:2024.1 \
ls -la /var/lib/kolla/venv/lib/python3.*/site-packages/nova/api/metadata/
# 输出会显示:
# base.py
# handler.py
# password.py
# vendordata.py
# ...
核心要点:
✅ Metadata 代码自动包含 - 运行 kolla-build nova-api 时,整个 Nova 源码(包括 metadata)都会被安装
✅ 无需额外配置 - 构建时不需要特殊指定 metadata
✅ 关键代码位置 - nova/api/metadata/handler.py 是处理所有 metadata 请求的核心
✅ 运行端口 - 默认监听 8775 端口
这就是 metadata 服务的完整构建资料!