睿诚科技协会

OpenStack网络配置如何实现高效管理与故障排查?

下面我将从核心概念、组件架构、常见部署模型配置示例四个方面,为你详细解析 OpenStack 的网络配置。

OpenStack网络配置如何实现高效管理与故障排查?-图1
(图片来源网络,侵删)

核心概念与术语

在开始配置之前,必须理解以下几个关键概念,它们是构建 OpenStack 网络的基石:

  1. Neutron:

    • OpenStack 的核心网络服务,负责管理所有虚拟网络、IP 地址、路由器、防火墙等。
    • 它本身不直接处理数据包,而是通过调用不同的 插件 来实现网络功能。
  2. 网络:

    一个隔离的二层广播域,类似于传统交换机,你可以创建多个虚拟网络,它们之间默认是隔离的。

    OpenStack网络配置如何实现高效管理与故障排查?-图2
    (图片来源网络,侵删)
  3. 子网:

    在一个网络内部,定义了一个 IP 地址段、网关、DNS 等信息,虚拟机从这个子网获取 IP 地址。

  4. 路由器:

    • 连接不同网络的设备,它可以在租户的私有网络和外部网络(如物理网络)之间进行路由,它还提供 NAT (网络地址转换) 功能,使私有网络中的实例可以访问外部网络,而外部网络无法直接访问它们。
  5. 端口:

    OpenStack网络配置如何实现高效管理与故障排查?-图3
    (图片来源网络,侵删)

    虚拟机网卡、路由器接口、负载均衡器等设备连接到网络的端点,每个端口都有一个唯一的 ID 和 MAC 地址。

  6. 安全组:

    状态ful的虚拟防火墙,作用于端口级别,你可以定义一组规则(如允许入站的 SSH 流量)来控制进出虚拟机的流量。

  7. 浮动 IP:

    外部网络的一个可路由 IP 地址,它被动态地绑定到虚拟机的固定(私有)IP 上,从而使虚拟机可以从外部网络被访问,这就像给虚拟机分配了一个“公网电话号码”。

  8. 插件:

    • Neutron 的核心架构,插件决定了底层网络技术的实现方式,常见的插件有:
      • ML2 (Modular Layer 2): 最流行、最灵活的插件,它本身不实现网络,而是通过 驱动 来支持多种技术(如 VLAN, VXLAN, GRE 等)。
      • OVS (Open vSwitch): 一种高性能的软件交换机,通常与 ML2 插件配合使用,是目前生产环境中最主流的选择。
      • 其他: 还有如 Calico (基于 BGP 的路由)、VPP (用户态协议栈) 等插件,用于特定场景。

组件架构

一个典型的 OpenStack 网络架构由以下几个关键部分组成:

  1. Neutron Server: API 服务,接收和处理来自 Horizon、CLI 或其他客户端的网络请求。
  2. Plugin Agent (如 ML2/OVS Agent): 运行在每个计算节点和控制节点上,负责在本地创建虚拟交换机(如 OVS),并根据 Neutron Server 的指令来配置这些交换机,实现虚拟机网卡的连接、VLAN 标签的打/解、VXLAN 隧道的建立等。
  3. L3 Agent (路由器代理): 运行在指定节点上,负责实现虚拟路由器的功能,包括路由和 NAT。
  4. DHCP Agent: 运行在指定节点上,为虚拟机提供 DHCP 服务,分配 IP 地址、网关等信息。
  5. Metadata Agent: 运行在指定节点上,允许虚拟机通过一个特殊的本地 IP 地址(169.254.169.254)获取元数据(如用户数据、SSH 密钥等)。
  6. ML2 Core & Mechanism Drivers: ML2 插件的核心,Core Driver 处理基础的网络对象(网络、端口、子网),Mechanism Driver 处理具体的网络实现技术(如 OVS、Linux Bridge)。

数据流向示例 (虚拟机访问外网):

  1. 虚拟机发送数据包到其默认网关(虚拟路由器的接口)。
  2. 虚拟机所在的计算节点上的 OVS Agent 将数据包从虚拟机的 vnet 端口转发到路由器的 qr-xxx 端口。
  3. L3 Agent 接收到数据包,发现目标地址是外网,于是进行源地址 NAT (SNAT),将虚拟机的私有 IP 替换为浮动 IP。
  4. L3 Agent 将数据包从路由器的 qg-xxx 端口发送到外部网络。
  5. 数据包通过物理网卡到达物理网络,最终到达互联网。

常见部署模型

根据业务需求,OpenStack 网络有几种经典的部署模型:

Provider 网络 (最简单)

  • 场景: 快速部署,虚拟机直接使用物理网络 VLAN。
  • 特点:
    • 网络由管理员预先在物理交换机上配置好 VLAN。
    • Neutron 只是“借用”这个物理网络,不对其进行隔离管理。
    • 虚拟机直接暴露在物理网络中,安全性较低。
  • 适用: 简单的测试环境,或对网络隔离要求不高的场景。

Self-Service 网络 (最常用)

  • 场景: 为租户提供完全隔离、可定制的私有网络。
  • 特点:
    • 租户可以创建自己的虚拟网络 (tenant-network)。
    • 通过 路由器 连接到外部网络 (provider-network),实现内外通信。
    • 关键技术: 使用 VXLANGRE 等隧道技术,在物理网络上叠加一层虚拟网络,实现租户间的二层隔离。
    • 这是 OpenStack 网络的精髓所在。
  • 适用: 绝大多数生产环境,提供安全、灵活的网络服务。

VLAN-aware Router 模式 (高级)

  • 场景: 需要为不同租户的子网分配不同的、可路由的 VLAN ID。
  • 特点:
    • 是 Self-Service 网络的增强版。
    • 路由器直接与物理网络集成,每个子网对应一个物理 VLAN。
    • 租户的子网可以直接被外部网络路由,无需 NAT。
    • 对物理交换机的配置要求更高。
  • 适用: 需要高度集成和性能,且物理交换机支持 VLAN Trunking 的场景。

配置示例 (Self-Service 网络)

下面我们以最常用的 Self-Service 网络 模式为例,演示如何通过 OpenStack CLI (命令行) 进行配置。

假设环境:

  • 已部署好 OpenStack,包括 Neutron 服务。
  • 已存在一个外部网络,名为 public,其网络 ID 为 a1b2c3d4-e5f6-7890-1234-567890abcdef

步骤 1: 创建租户私有网络

# 创建一个名为 'private-net' 的租户网络
neutron net-create private-net --shared
# 输出:
# +---------------------------+--------------------------------------+
# | Field                     | Value                                |
# +---------------------------+--------------------------------------+
# | admin_state_up            | True                                 |
# | id                        | 5e6f7g8h-i9j0-kl12-mn34-op56q7r8s9t |
# | mtu                       | 1500                                 |
# | name                      | private-net                           |
# | provider:network_type      | vxlan                                |  # 通常默认为 vxlan
# | provider:physical_network |                                      |
# | provider:segmentation_id  | 1                                    |  # VXLAN 的 VNI
# | router:external           | False                                |
# | shared                    | True                                 |
# | status                    | ACTIVE                               |
# | subnets                   |                                      |
# +---------------------------+--------------------------------------+

步骤 2: 在私有网络上创建子网

# 在 'private-net' 上创建一个子网,名为 'private-subnet'
neutron subnet-create private-net 10.0.0.0/24 --name private-subnet --gateway 10.0.0.1 --dns-nameserver 8.8.8.8
# 输出:
# +------------------+------------------------------------------------------+
# | Field            | Value                                                |
# +------------------+------------------------------------------------------+
# | allocation_pools | {"start": "10.0.0.2", "end": "10.0.0.254"}          |
# | cidr             | 10.0.0.0/24                                          |
# | enable_dhcp      | True                                                 |
# | gateway_ip       | 10.0.0.1                                             |
# | host_routes     |                                                      |
# | id               | 6a7b8c9d-e0f1-g234-h567-i890j1k2l3m4n               |
# | ip_version       | 4                                                    |
# | name             | private-subnet                                       |
# | network_id       | 5e6f7g8h-i9j0-kl12-mn34-op56q7r8s9t                 |
# | subnetpool_id    |                                                      |
# +------------------+------------------------------------------------------+

步骤 3: 创建路由器并连接到外部网络

# 创建一个路由器
neutron router-create my-router
# 输出:
# +-------------------+--------------------------------------+
# | Field             | Value                                |
# +-------------------+--------------------------------------+
# | admin_state_up    | True                                 |
# | id                | j1k2l3m4-n5o6-p789-q012-r3s4t5u6v7w |
# | name              | my-router                            |
# | routes           |                                      |
# | status            | ACTIVE                               |
# +-------------------+--------------------------------------+
# 将路由器连接到外部网络 'public'
neutron router-gateway-set my-router public
# 输出: (无输出,表示成功)

步骤 4: 将路由器接口连接到私有子网

# 将路由器的接口添加到 'private-subnet'
neutron router-interface-add my-router private-subnet
# 输出: (无输出,表示成功)

步骤 5: 创建安全组规则

# 允许 ICMP 流量 (ping)
neutron security-group-rule-create --protocol icmp default
# 允许 SSH 流量 (端口 22)
neutron security-group-rule-create --protocol tcp --port-range-min 22 --port-range-max 22 default

步骤 6: 启动虚拟机并分配浮动 IP

  1. 启动虚拟机:

    • 在 Horizon 或通过 nova boot 命令启动一个实例。
    • 在创建实例时,选择 private-net 网络。
    • 选择 default 安全组。
  2. 分配浮动 IP:

    # 从 'public' 网络中分配一个浮动 IP
    neutron floatingip-create public
    # 输出:
    # +---------------------+--------------------------------------+
    # | Field               | Value                                |
    # +---------------------+--------------------------------------+
    # | fixed_ip_address    |                                      |
    # | floating_ip_address | 203.0.113.10                        | # 分配到的公网 IP
    # | floating_network_id | a1b2c3d4-e5f6-7890-1234-567890abcdef |
    # | id                  | z1x2c3v4-b5n6-m7k8-l9p0-q1w2e3r4t5y6 |
    # | port_id             |                                      |
    # | router_id           |                                      |
    # | status              | DOWN                                 |
    # +---------------------+--------------------------------------+
  3. 将浮动 IP 绑定到虚拟机:

    • 你需要知道虚拟机实例的端口 ID,可以在 Horizon 的实例详情页找到,或通过 neutron port-list 查看。
    • 假设端口 ID 为 d4e5f6g7-h8i9-j012-k345-l6m7n8o9p0q
      # 将浮动 IP 绑定到虚拟机的端口
      neutron floatingip-associate z1x2c3v4-b5n6-m7k8-l9p0-q1w2e3r4t5y6 d4e5f6g7-h8i9-j012-k345-l6m7n8o9p0q
      # 输出: (无输出,表示成功)
    • 虚拟机就拥有了公网 IP 0.113.10,你可以通过 SSH 连接到它了。

总结与建议

  • 从简单开始: 如果你是新手,先从 Provider 网络 开始,理解基本概念。
  • 掌握核心: Self-Service 网络 是必须掌握的,理解其背后的 VXLAN 隧道路由器 原理至关重要。
  • 文档是朋友: OpenStack 官方文档是最好的学习资料,特别是 Neutron 的部分。
  • 工具辅助: 使用 Horizon (Web UI) 进行操作可以更直观地理解各个组件之间的关系,然后再学习使用 CLI。
  • 故障排查: 网络问题最常见,学会使用 neutron port-list, neutron port-show, neutron router-port-list 等命令查看端口状态,以及在各节点上使用 ovs-vsctl show, tcpdump 等工具排查底层网络问题。

希望这份详细的指南能帮助你理解并配置 OpenStack 网络!

分享:
扫描分享到社交APP
上一篇
下一篇