OpenStack虚拟网络

OpenStack虚拟网络结构

Neutron是一个用Python写的分布式软件项目,用来实现OpenStack中的虚拟网络服务,实现软件定义网络。

1698634048202.png

OpenStack 提供了几种不同类型的网络,以满足不同的网络需求。以下是一些常见的 OpenStack 网络类型:

按照网络的实现原理:

  1. Flat Network(扁平网络):这是最简单的网络类型,所有虚拟机实例共享同一个扁平的网络。在这种网络中,虚拟机实例通过虚拟交换机直接连接到物理网络。一般适用于简单的测试环境或不需要网络隔离的场景。

    Linux Bridge直接与物联网卡相连
    每个Flat独占一个物理网卡

    1731984910546.png

    1731985186179.png

  2. VLAN Network(VLAN 网络):VLAN 网络通过使用 VLAN 标签对虚拟机实例进行隔离。在这种网络中,物理网络上的不同 VLAN 标签对应不同的虚拟网络。虚拟机实例通过虚拟交换机连接到特定的 VLAN 网络,实现网络隔离。

    在基于linux bridge的vlan网络中,eht1物理网卡上创建了两个vlan接口,1.1连接到qbr1网桥,1.2连接到了qbr2网桥。在这种情况下vm通过eth1.1或者eth1.2发送到eth1的包会被打上各自的vlan id。此时vm2和vm3属于同一个network所以是互通的,vm与vm2和vm3不通。
    1731985722332.png

  3. VXLAN Network(VXLAN 网络):VXLAN 网络使用 VXLAN 封装技术在底层物理网络上创建逻辑隧道,以实现虚拟机实例之间的隔离和通信。VXLAN 网络可以扩展到更大的规模,并提供更多的虚拟网络隔离。

  4. GRE Network(GRE 网络):GRE 网络使用通用路由封装(Generic Routing Encapsulation)协议在底层物理网络上创建隧道,以实现虚拟机实例之间的隔离和通信。GRE 网络可以在不同物理网络之间建立逻辑连接。

按照网络的从属关系可以分为以下两类:

  1. Provider Network(提供者网络):提供者网络是指与外部网络或互联网连接的网络。它可以是物理网络中的一个 VLAN 或直接连接到外部网络。提供者网络通常用于连接虚拟机实例到互联网或外部资源。

    1698642246577.png
  2. Self-Service Network(自服务网络):自服务网络是为虚拟机实例创建的私有网络。它可以通过路由器与提供者网络连接,使虚拟机实例能够访问外部网络。自服务网络通常用于为用户提供独立的、可管理的网络环境。

    1698642315973.png

Neutron服务部署

基础配置

  1. 开启网卡的混杂模式。

    [root@controller ~]# ifconfig ens34 promisc
    [root@compute ~]# ifconfig ens34 promisc

控制节点服务配置

  1. 安装网络组件。

    [root@controller ~]# yum -y install openstack-neutron openstack-neutron-ml2  openstack-neutron-linuxbridge ebtables
  2. 创建数据库。

    MariaDB [(none)]> CREATE DATABASE neutron;
    MariaDB [(none)]> GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY '000000';
    MariaDB [(none)]> GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY '000000';
  3. 加载admin用户的环境脚本完成身份认证。

  4. 创建Neutron服务的用户、分配角色、创建服务。

    [root@controller ~]# openstack user create --domain default --password 000000 neutron
    [root@controller ~]# openstack role add --project project --user neutron admin
    [root@controller ~]# openstack service create --name neutron network
    [root@controller ~]# openstack endpoint create --region RegionOne  network public http://controller:9696
    [root@controller ~]# openstack endpoint create --region RegionOne  network internal http://controller:9696
    [root@controller ~]# openstack endpoint create --region RegionOne  network admin http://controller:9696
  5. 控制节点备份修改以下配置文件:

    • /etc/neutron/neutron.conf(neutron组件基础配置文件):指定二层和三层的网络插件、配置消息队列和数据库、keystone认证信息。

    • /etc/neutron/plugins/ml2/ml2_config.ini(二层插件配置文件):配置类型驱动的类型、自服务网络的类型、机制驱动类型等。

    • /etc/neutron/plugins/ml2/linuxbridge_agent.ini(机制驱动配置文件):物理网络的映射、vxlan网络配置、启用安全组

    • /etc/neutron/dhcp-agent.ini(dhcp配置文件):指定接口驱动、DHCP驱动。

    • /etc/neutron/metadata_agent.ini(元数据代理配置文件)。

    • /etc/nova/nova.conf(nova服务配置文件):设置neutron和nova的交互。

  6. 初始化数据库。

    [root@controller ~]# su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head"
  7. 重启控制节点nova,启动控制节点的Neutron服务。

    [root@controller ~]# systemctl restart openstack-nova-api
    [root@controller ~]# systemctl enable neutron-server neutron-linuxbridge-agent neutron-dhcp-agent neutron-metadata-agent neutron-l3-agent
    [root@controller ~]# systemctl start neutron-server neutron-linuxbridge-agent neutron-dhcp-agent neutron-metadata-agent neutron-l3-agent
  8. 查看控制节点服务运行状态。

    [root@controller ~]# systemctl status neutron-server

计算节点服务配置

  1. 安装所需软件包。

    [root@compute ~]# yum -y install openstack-neutron-linuxbridge ebtables ipset
  2. 备份修改以下配置文件/etc/neutron/neutron.conf/etc/neutron/plugins/ml2/linuxbridge_agent.ini

  3. 检测Neutron状态。

    [root@compute ~]# neutron-status upgrade check

Neutron网络应用

作业与实验环境

超星网址
快照管理:控制节点和计算节点选择均是默认的项目12

基础环境准备

  1. 加载admin用户的环境脚本完成身份认证。

    [root@controller ~]# source admin-login
  2. 实例类型创建。

    [root@controller ~]# openstack flavor create --public test_flavor --id auto --ram 256 --disk 5 --vcpus 1
  3. 桥接网络防火墙配置。

    [root@controller ~]# echo 'net.bridge.bridge-nf-call-iptables=1' >> /etc/sysctl.conf
    [root@controller ~]# echo 'net.bridge.bridge-nf-call-ip6tables=1' >> /etc/sysctl.conf
    [root@controller ~]# modprobe br_netfilter
    [root@controller ~]# sysctl -p
    net.bridge.bridge-nf-call-iptables = 1
    net.bridge.bridge-nf-call-ip6tables = 1

自服务网络使用

  1. 现有的环境不支持自服务网络,需要修改Neutron配置。

    1. 修改控制节点/etc/neutron/plugins/ml2/ml2_conf.ini

      [DEFAULT]
      [ml2]
      type_drivers = flat,vlan,vxlan                      # 1.添加vlan,vxlan类型支持
      tenant_network_types = vxlan                        # 2.添加自服务驱动的vxlan类型支持
      mechanism_drivers = linuxbridge,l2population        # 3.启用l2population,简化网络通信拓扑,减少网络广播
      extension_drivers = port_security
      
      [ml2_type_flat]
      flat_networks = provider
      
      [ml2_type_vxlan]                                    # 4.为私有网络配置VXLAN网络识别的网络范围
      vni_ranges = 1:1000
      
      [securitygroup]
      enable_ipset = true
    2. 修改控制节点/etc/neutron/plugins/ml2/linuxbridge_agent.ini

      [DEFAULT]
      [linux_bridge]
      physical_interface_mappings = provider:ens34
      
      [vxlan]
      enable_vxlan = true                             # 1.使能vxlan
      local_ip = 192.168.10.10                        # 2.控制节点IP
      l2_population = true                            # 3.使能l2_population
      
      [securitygroup]
      enable_security_group = true
      firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
    3. 重启控制节点服务。

      [root@controller ~]# systemctl restart neutron-server.service neutron-linuxbridge-agent.service
    4. 修改计算节点/etc/neutron/plugins/ml2/linuxbridge_agent.ini

      [DEFAULT]
      [linux_bridge]
      physical_interface_mappings = provider:ens34
      
      [vxlan]
      enable_vxlan = true                             # 1.使能vxlan
      local_ip = 192.168.10.20                        # 2.计算节点IP
      l2_population = true                            # 3.使能l2_population
      
      [securitygroup]
      enable_security_group = true
      firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
    5. 重启计算节点服务。

      [root@compute ~]# systemctl restart libvirtd openstack-nova-compute neutron-linuxbridge-agent
  2. 登录192.168.10.20Horizon图形控制台,左侧项目->网络->网络创建自服务网络。

    1699240174151.png

    子网配置:

    1699240230610.png

    DNS服务器设置:

    1699245061523.png
  3. 创建实例instance1,网络默认选择的是上文创建的自服务网络。

    1699248275574.png
  4. 使用相同的配置创建实例instance2,在实力列表中获取instance2IP地址,通过instance1ping包验证和instance2之间的网络连通。

    1699248942408.png

    作业1:上传两个实例之间的ping包的结果。

提供者网络使用

  1. 提供者网络涉及到物理网络,需要在管理员页面下才能创建,通过管理员->网络->网络创建提供者网络,配置如下。

    1699249390076.png

    子网配置:

    1699249465596.png

    DHCP、DNS配置:

    1699249486282.png
  2. 创建实例并使用提供者网络。

    1699249617251.png

    查看当前环境的网络拓扑:

    1699250048445.png

    进入实例instance3通过ping包验证实例之间的网络。

    1699250223158.png

    作业2:上传instance3ping包的结果。

自服务网络使用虚拟路由连通外部网络

这个实验是通过创建虚拟路由连通自服务网络和提供者网络从而是自服务网络的主机能够连通外部网络。
使用虚拟路由访问外网框图:
1731986454761.png

  1. 当前环境的路由功能是关闭的,需要重新配置/etc/neutron/neutron.conf启用路由功能。

    [DEFAULT]
    core_plugin = ml2
    service_plugins = router            # 1.启用三层路由插件
    transport_url = rabbit://rabbitmq:000000@controller
    auth_strategy = keystone
    notify_nova_on_port_status_changes = true
    notify_nova_on_port_data_changes = true
  2. 配置三层路由的接口驱动。

    [root@controller ~]# echo "interface_driver = linuxbridge" >> /etc/neutron/l3_agent.ini
  3. 重启控制节点的Neutron组件,启动路由服务。

    [root@controller ~]# systemctl restart neutron-server
    [root@controller ~]# systemctl enable neutron-l3-agent
    Created symlink from /etc/systemd/system/multi-user.target.wants/neutron-l3-agent.service to /usr/lib/systemd/system/neutron-l3-agent.service.
    [root@controller ~]# systemctl start neutron-l3-agent
  4. 配置计算节点/etc/openstack-dashboard/local_settings使得Horizon显示路由菜单。

    修改144行,将'enable_router': False,改为'enable_router': True,

  5. 重启计算节点的Horizon组件后,刷新图形控制台。

    [root@compute ~]# systemctl restart httpd
  6. 网络菜单中显示路由菜单。

  7. 新建路由,外部网络设置为上文创建的提供者网络。

    1699251602303.png

    当前的网络拓扑:

    1699251657914.png
  8. 点击新建好的路由名称->接口,增加接口。

    1699251700833.png
  9. 增加接口时子网选择上文创建的自服务网络名称。

    1699251814744.png
  10. 查看当前的网络拓扑。

    1699251876971.png
  11. 在实例instance1中使用ping包验证外网的连通性。

    1699252068962.png

    作业3:上传实例instance1的ping包结果。

拓展:使用浮动IP提供外网访问

作业3实现的是自服务实例内部对外的网络访问(内部->外部),该拓展实验是在作业3的基础上实现外部网络访问自服务实例内部(外部->内部)。

任务概述:在已有的OpenStack环境中,使用一台实例(可以使用instance1)搭建一个最简单的 HTTP 网页,并为该实例分配一个浮动IP(Floating IP),使得从外网可以通过该浮动IP访问该网页。

具体步骤

  1. 在实例内使用nc命令模拟Web应用(在 Cirros 系统上)。

    # 获取root权限
    $ sudo su
    # 创建包含 HTTP 头与页面内容的文件 msg
    $ echo -e "HTTP/1.0 200 OK\n\nHello from instance1" > msg
    # 注意:\n\n 必须,代表 HTTP 头结束,后面紧跟网页内容

    在控制台输入循环命令(输入时按回车若出现提示符 > 表示命令还未结束,请继续输入下一行):

    $ while true; do
    >    cat msg | nc -l -p 80
    >done
    1764732043595.png
  2. 在Horizon创建浮动IP。

    1764729521663.png
  3. 关联浮动IP到实例的端口。

    1764731129578.png
  4. 项目-网络-安全组中管理安全组规则,添加规则,开放TCP/80端口。

    1764731311518.png
  5. 在Windows上使用浏览器访问 http://<浮动IP>

    1764731416084.png

    此时使用浮动IP实现了Web应用的外网访问。

    能在外网通过 http://<浮动IP> 访问到页面并显示指定内容。
    作业4:访问到指定内容后截图上传。