Nova Metadata 服务构建流程图

6 阅读2分钟

══════════════════════════════════════════════════════════ 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/           │
     └───────────────────────────────────┘

══════════════════════════════════════════════════════════ 关键理解 ══════════════════════════════════════════════════════════

  1. Metadata 不是独立镜像

    • 集成在 nova-api 镜像中
    • 通过 Apache VirtualHost 监听 8775 端口
  2. Metadata 代码来源

    • Nova 源码的 nova/api/metadata/ 目录
    • 在 nova-base 层通过 pip install /nova 安装
  3. 构建时自动包含

    • kolla-build nova-api 会自动包含所有 metadata 代码
    • 无需单独指定或配置
  4. 运行时才配置

    • 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 服务的完整构建资料!