8-OpenStack启动虚拟机实例

熊 0 阅读 虚拟化

我们知道在openstack中要启动一个虚拟机实例 , 通常会经过这样几步 , 第一步我们要有一个用户登录到openstack上 , 进行创建虚拟机的操作 , 而这一步通常由keystone服务来验证登录的用户 , 并返回一个token给用户 , 如果keystone验证成功 , 则用户就可以到openstack上进行对应的操作 , 反之亦然 ; 第二步 , 用户在keystone上完成登录验证 , 并拿到keystone给的token后 , 用户就可以在openstack上进行创建虚拟机 , 在创建虚拟机之前 , 用户要选择创建的虚拟机用那个模板进行创建 , 用那个镜像来安装系统 , 选择什么网络 , 安全组策略等等 ; 这些都必须事先创建好 ; 用户选择好必要的组件后 ; 用户就可以把创建虚拟机的需求发送给openstack 控制节点 , 由openstack的控制节点间的各服务调用 , 最后创建一个虚拟机实例 ; 这里需要强调一点 , 在openstack上创建虚拟机不能像我们使用kvm-qemu工具创建虚拟机指定要使用的虚拟cpu,内存 , 磁盘等等信息 ; 在openstack上创建虚拟机 , 它是通过模板来定义虚拟机的基础信息的 ; 专业术语叫flavor ; 了解了创建虚拟机的大致过程后 , 我们基于之前配置的环境来跑一个虚拟机实例在openstack上 ;

1. 创建模板

  1. 在控制节点上导出admin环境变量,创建flavor

    [root@node01 ~]# . keystone_admin.rc 
    [root@node01 ~]# openstack flavor create --id 0 --vcpus 1 --ram 64 --disk 1 m1.nano
    +----------------------------+---------+
    | Field                      | Value   |
    +----------------------------+---------+
    | OS-FLV-DISABLED:disabled   | False   |
    | OS-FLV-EXT-DATA:ephemeral  | 0       |
    | description                | None    |
    | disk                       | 1       |
    | id                         | 0       |
    | name                       | m1.nano |
    | os-flavor-access:is_public | True    |
    | properties                 |         |
    | ram                        | 64      |
    | rxtx_factor                | 1.0     |
    | swap                       | 0       |
    | vcpus                      | 1       |
    +----------------------------+---------+
  2. 导出demo用户环境变量,创建一个keypair

    [root@node01 ~]# source demo.sh 
    [root@node01 ~]# ssh-keygen -q -N ""
    Enter file in which to save the key (/root/.ssh/id_rsa): 
    /root/.ssh/id_rsa already exists.
    Overwrite (y/n)? y
    [root@node01 ~]#  openstack keypair create --public-key ~/.ssh/id_rsa.pub demo_key
    +-------------+-------------------------------------------------+
    | Field       | Value                                           |
    +-------------+-------------------------------------------------+
    | created_at  | None                                            |
    | fingerprint | cf:65:ae:5b:87:c5:48:bc:62:d9:42:60:3a:f6:2d:1b |
    | id          | demo_key                                        |
    | is_deleted  | None                                            |
    | name        | demo_key                                        |
    | type        | ssh                                             |
    | user_id     | c6bab906341d42b99f0c1c714e45b0b7                |
    +-------------+-------------------------------------------------+
    ​
  3. 列出安全组

    [root@node01 ~]# openstack security group list 
    +--------------------------------------+---------+------------------------+----------------------------------+------+
    | ID                                   | Name    | Description            | Project                          | Tags |
    +--------------------------------------+---------+------------------------+----------------------------------+------+
    | 169e6cd1-b047-42dc-8f80-ad92223c06b2 | default | Default security group | a183bc3c4a4d4c83b78cf56b38804882 | []   |
    +--------------------------------------+---------+------------------------+----------------------------------+------+
    ​
  4. 查看default安全组中的规则

    [root@node01 ~]# openstack security group rule list 
    +--------------------------------------+-------------+-----------+-----------+------------+-----------+--------------------------------------+----------------------+--------------------------------------+
    | ID                                   | IP Protocol | Ethertype | IP Range  | Port Range | Direction | Remote Security Group                | Remote Address Group | Security Group                       |
    +--------------------------------------+-------------+-----------+-----------+------------+-----------+--------------------------------------+----------------------+--------------------------------------+
    | 59bfffc3-c042-4100-b509-e39bd8a6a12f | None        | IPv6      | ::/0      |            | egress    | None                                 | None                 | 169e6cd1-b047-42dc-8f80-ad92223c06b2 |
    | 86f068b4-30f3-49ad-ae58-d8c46e62b7a1 | None        | IPv6      | ::/0      |            | ingress   | 169e6cd1-b047-42dc-8f80-ad92223c06b2 | None                 | 169e6cd1-b047-42dc-8f80-ad92223c06b2 |
    | d09d634d-72ca-432d-99a3-6260466c2a6a | None        | IPv4      | 0.0.0.0/0 |            | ingress   | 169e6cd1-b047-42dc-8f80-ad92223c06b2 | None                 | 169e6cd1-b047-42dc-8f80-ad92223c06b2 |
    | f24cdf93-87b0-4b31-b2b6-3c1bcacd6f04 | None        | IPv4      | 0.0.0.0/0 |            | egress    | None                                 | None                 | 169e6cd1-b047-42dc-8f80-ad92223c06b2 |
    +--------------------------------------+-------------+-----------+-----------+------------+-----------+--------------------------------------+----------------------+--------------------------------------+
    ​

    openstack上的安全组我们可以理解为一个虚拟的防火墙,里面的rule我们可以理解为iptabels规则;从上面查看default安全组中的规则来看,它默认是禁止任何ip任何协议连接内部虚拟机;这很显然不符合我们需求,至少我们应该把ssh端口开放出去;

  5. 添加开放ssh端口的rule到default安全组中

    [root@node01 ~]# openstack security group rule create --proto tcp --dst-port 22 169e6cd1-b047-42dc-8f80-ad92223c06b2
    +-------------------------+--------------------------------------+
    | Field                   | Value                                |
    +-------------------------+--------------------------------------+
    | created_at              | 2024-09-25T16:55:07Z                 |
    | description             |                                      |
    | direction               | ingress                              |
    | ether_type              | IPv4                                 |
    | id                      | 6a76c6b6-f936-45fc-8c28-c8643b6f5b22 |
    | name                    | None                                 |
    | normalized_cidr         | 0.0.0.0/0                            |
    | port_range_max          | 22                                   |
    | port_range_min          | 22                                   |
    | project_id              | a183bc3c4a4d4c83b78cf56b38804882     |
    | protocol                | tcp                                  |
    | remote_address_group_id | None                                 |
    | remote_group_id         | None                                 |
    | remote_ip_prefix        | 0.0.0.0/0                            |
    | revision_number         | 0                                    |
    | security_group_id       | 169e6cd1-b047-42dc-8f80-ad92223c06b2 |
    | tags                    | []                                   |
    | updated_at              | 2024-09-25T16:55:07Z                 |
    +-------------------------+--------------------------------------+
    [root@node01 ~]# 
    ​
  6. 添加开放icmp协议rule到default安全组中

    [root@node01 ~]# openstack security group rule create --proto icmp 169e6cd1-b047-42dc-8f80-ad92223c06b2
    +-------------------------+--------------------------------------+
    | Field                   | Value                                |
    +-------------------------+--------------------------------------+
    | created_at              | 2024-09-25T16:55:48Z                 |
    | description             |                                      |
    | direction               | ingress                              |
    | ether_type              | IPv4                                 |
    | id                      | 1250fac5-23dd-4bd4-8d43-31518b6424d9 |
    | name                    | None                                 |
    | normalized_cidr         | 0.0.0.0/0                            |
    | port_range_max          | None                                 |
    | port_range_min          | None                                 |
    | project_id              | a183bc3c4a4d4c83b78cf56b38804882     |
    | protocol                | icmp                                 |
    | remote_address_group_id | None                                 |
    | remote_group_id         | None                                 |
    | remote_ip_prefix        | 0.0.0.0/0                            |
    | revision_number         | 0                                    |
    | security_group_id       | 169e6cd1-b047-42dc-8f80-ad92223c06b2 |
    | tags                    | []                                   |
    | updated_at              | 2024-09-25T16:55:48Z                 |
    +-------------------------+--------------------------------------+
    ​
  7. 验证:查看default安全组中的规则,看看我们添加到规则是否都添加上了?

    [root@node01 ~]# openstack security group rule list 
    +--------------------------------------+-------------+-----------+-----------+------------+-----------+--------------------------------------+----------------------+--------------------------------------+
    | ID                                   | IP Protocol | Ethertype | IP Range  | Port Range | Direction | Remote Security Group                | Remote Address Group | Security Group                       |
    +--------------------------------------+-------------+-----------+-----------+------------+-----------+--------------------------------------+----------------------+--------------------------------------+
    | 1250fac5-23dd-4bd4-8d43-31518b6424d9 | icmp        | IPv4      | 0.0.0.0/0 |            | ingress   | None                                 | None                 | 169e6cd1-b047-42dc-8f80-ad92223c06b2 |
    | 59bfffc3-c042-4100-b509-e39bd8a6a12f | None        | IPv6      | ::/0      |            | egress    | None                                 | None                 | 169e6cd1-b047-42dc-8f80-ad92223c06b2 |
    | 6a76c6b6-f936-45fc-8c28-c8643b6f5b22 | tcp         | IPv4      | 0.0.0.0/0 | 22:22      | ingress   | None                                 | None                 | 169e6cd1-b047-42dc-8f80-ad92223c06b2 |
    | 86f068b4-30f3-49ad-ae58-d8c46e62b7a1 | None        | IPv6      | ::/0      |            | ingress   | 169e6cd1-b047-42dc-8f80-ad92223c06b2 | None                 | 169e6cd1-b047-42dc-8f80-ad92223c06b2 |
    | d09d634d-72ca-432d-99a3-6260466c2a6a | None        | IPv4      | 0.0.0.0/0 |            | ingress   | 169e6cd1-b047-42dc-8f80-ad92223c06b2 | None                 | 169e6cd1-b047-42dc-8f80-ad92223c06b2 |
    | f24cdf93-87b0-4b31-b2b6-3c1bcacd6f04 | None        | IPv4      | 0.0.0.0/0 |            | egress    | None                                 | None                 | 169e6cd1-b047-42dc-8f80-ad92223c06b2 |
    +--------------------------------------+-------------+-----------+-----------+------------+-----------+--------------------------------------+----------------------+--------------------------------------+

    可以看到default安全组里多了两条rule;

2. 基于provider network创建虚拟机实例

  1. 在控制节点导出demo用户的环境变量,验证是否有可用模板

    [root@node01 ~]# source demo.sh
    [root@node01 ~]# openstack flavor list
    +----+---------+-----+------+-----------+-------+-----------+
    | ID | Name    | RAM | Disk | Ephemeral | VCPUs | Is Public |
    +----+---------+-----+------+-----------+-------+-----------+
    | 0  | m1.nano |  64 |    1 |         0 |     1 | True      |
    +----+---------+-----+------+-----------+-------+-----------+
    [root@node01 ~]#
  2. 验证是否有可用镜像

    [root@node01 ~]# openstack image list
    +--------------------------------------+--------+--------+
    | ID                                   | Name   | Status |
    +--------------------------------------+--------+--------+
    | 94dd2ba0-1736-4307-865d-7cb86b85d32e | cirros | active |
    +--------------------------------------+--------+--------+
    [root@node01 ~]#
  3. 验证是否有安全组?

    [root@node01 ~]# openstack security group list
    +--------------------------------------+---------+------------------------+----------------------------------+------+
    | ID                                   | Name    | Description            | Project                          | Tags |
    +--------------------------------------+---------+------------------------+----------------------------------+------+
    | 06b13f55-8beb-48d4-9994-490acc5488cf | default | Default security group | 1a918887f38a42c28f9d0d3774f34b16 | []   |
    +--------------------------------------+---------+------------------------+----------------------------------+------+
    [root@node01 ~]#
  4. 验证是否有可用网络?

    [root@node01 ~]# openstack network list
     
    [root@node01 ~]#

    这里显示为空,表示没有任何可用网络;

  5. 创建provider network

    在控制节点导出admin用户的环境变量,创建provider network

    [root@node01 ~]# source admin.sh
    [root@node01 ~]# openstack network create  --share --external   --provider-physical-network external   --provider-network-type flat provider-net
    +---------------------------+--------------------------------------+
    | Field                     | Value                                |
    +---------------------------+--------------------------------------+
    | admin_state_up            | UP                                   |
    | availability_zone_hints   |                                      |
    | availability_zones        |                                      |
    | created_at                | 2024-09-27T11:08:54Z                 |
    | description               |                                      |
    | dns_domain                | None                                 |
    | id                        | 84d97504-ffd7-4c4e-b5b6-1066a7b1b97b |
    | ipv4_address_scope        | None                                 |
    | ipv6_address_scope        | None                                 |
    | is_default                | None                                 |
    | is_vlan_transparent       | None                                 |
    | mtu                       | 1500                                 |
    | name                      | provider-net                         |
    | port_security_enabled     | False                                |
    | project_id                | d2dd7a9d467a4c5dbd2faf6944986d1b     |
    | provider:network_type     | flat                                 |
    | provider:physical_network | external                             |
    | provider:segmentation_id  | None                                 |
    | qos_policy_id             | None                                 |
    | revision_number           | 1                                    |
    | router:external           | External                             |
    | segments                  | None                                 |
    | shared                    | True                                 |
    | status                    | ACTIVE                               |
    | subnets                   |                                      |
    | tags                      |                                      |
    | tenant_id                 | d2dd7a9d467a4c5dbd2faf6944986d1b     |
    | updated_at                | 2024-09-27T11:08:54Z                 |
    +---------------------------+--------------------------------------+

    --share表示创建一个共享网络(桥接网络),--external表示创建一个外部的网络,如果希望创建的是内部网络,可以使用--internal选项来指明即可;--provider-network-type flat表示创建的网络类型为平面网络;最后是给我们创建的网络起一个名称叫provider-net;这里需要注意一点,--provider-physical-network这个选项的值要和我们在配置neutron服务时,在ml2_conf.ini文件中【ml2_type_flat】配置段中的flat_networks 的值保持一致;如下所示

    image-20240927214050015

    /etc/neutron/plugins/ml2/ml2_conf.ini 这个配置文件中的【ml2_type_flat】配置段中的flat_networks的值要和/etc/neutron/plugins/ml2/openvswitch_agent.ini 配置文件中的【ovs】配置段中的bridge_mappings中的provider名称保持一致;如下所示

    以上两个配置文件中标记的部分都需要同这里创建网络时指定的--provider-physical-network 选项的值保持一致;

  6. 创建子网

    [root@node01 ~]# openstack subnet create --network provider-net --allocation-pool start=192.168.71.116,end=192.168.71.136 --dns-nameserver 223.5.5.5 --gateway 192.168.71.254  --subnet-range 192.168.71.0/24 provider-net-sub
    +----------------------+--------------------------------------+
    | Field                | Value                                |
    +----------------------+--------------------------------------+
    | allocation_pools     | 192.168.71.116-192.168.71.136        |
    | cidr                 | 192.168.71.0/24                      |
    | created_at           | 2024-09-27T11:10:28Z                 |
    | description          |                                      |
    | dns_nameservers      | 223.5.5.5                            |
    | dns_publish_fixed_ip | None                                 |
    | enable_dhcp          | True                                 |
    | gateway_ip           | 192.168.71.254                       |
    | host_routes          |                                      |
    | id                   | c4485771-22be-4bed-8514-b87c14bbf1c9 |
    | ip_version           | 4                                    |
    | ipv6_address_mode    | None                                 |
    | ipv6_ra_mode         | None                                 |
    | name                 | provider-net-sub                     |
    | network_id           | 84d97504-ffd7-4c4e-b5b6-1066a7b1b97b |
    | project_id           | d2dd7a9d467a4c5dbd2faf6944986d1b     |
    | revision_number      | 0                                    |
    | segment_id           | None                                 |
    | service_types        |                                      |
    | subnetpool_id        | None                                 |
    | tags                 |                                      |
    | updated_at           | 2024-09-27T11:10:28Z                 |
    +----------------------+--------------------------------------+

    --network使用来指定使用那个网络来创建子网,或者说给那个网络创建子网,这个名称要和我们创建网络时给的名称保持一致;这里需要说明一点,provider network是桥接到物理网卡上,所以这里的子网要根据你物理网络来划分子网;

  7. 验证:导出demo环境变量,看看demo用户是否有可用网络?

    [root@node01 ~]# source demo.sh
    [root@node01 ~]# openstack network list 
    +--------------------------------------+--------------+--------------------------------------+
    | ID                                   | Name         | Subnets                              |
    +--------------------------------------+--------------+--------------------------------------+
    | 84d97504-ffd7-4c4e-b5b6-1066a7b1b97b | provider-net | c4485771-22be-4bed-8514-b87c14bbf1c9 |
    +--------------------------------------+--------------+--------------------------------------+
  8. 创建虚拟机

    [root@node01 ~]# openstack server create --flavor m1.nano --image cirros   --nic net-id=84d97504-ffd7-4c4e-b5b6-1066a7b1b97b  --security-group default   --key-name demo_key provider-instance
    +-------------------------------------+-----------------------------------------------+
    | Field                               | Value                                         |
    +-------------------------------------+-----------------------------------------------+
    | OS-DCF:diskConfig                   | MANUAL                                        |
    | OS-EXT-AZ:availability_zone         |                                               |
    | OS-EXT-SRV-ATTR:host                | None                                          |
    | OS-EXT-SRV-ATTR:hypervisor_hostname | None                                          |
    | OS-EXT-SRV-ATTR:instance_name       |                                               |
    | OS-EXT-STS:power_state              | NOSTATE                                       |
    | OS-EXT-STS:task_state               | scheduling                                    |
    | OS-EXT-STS:vm_state                 | building                                      |
    | OS-SRV-USG:launched_at              | None                                          |
    | OS-SRV-USG:terminated_at            | None                                          |
    | accessIPv4                          |                                               |
    | accessIPv6                          |                                               |
    | addresses                           |                                               |
    | adminPass                           | TsVzd3Xz9tHF                                  |
    | config_drive                        |                                               |
    | created                             | 2024-09-27T12:58:23Z                          |
    | flavor                              | m1.nano (0)                                   |
    | hostId                              |                                               |
    | id                                  | e8b34357-91b8-4fdb-9477-c758e5159d9a          |
    | image                               | cirros (514c6db8-1866-4ee4-b464-2c9eca88f0f9) |
    | key_name                            | demo_key                                      |
    | name                                | provider-instance                             |
    | progress                            | 0                                             |
    | project_id                          | d2dd7a9d467a4c5dbd2faf6944986d1b              |
    | properties                          |                                               |
    | security_groups                     | name='bb511975-5f8d-4a08-8775-c4ac29f6c7a5'   |
    | status                              | BUILD                                         |
    | updated                             | 2024-09-27T12:58:23Z                          |
    | user_id                             | c4c0a73ca297489c9771b3d7e7814b53              |
    | volumes_attached                    |                                               |
    +-------------------------------------+-----------------------------------------------+

    查看虚拟机状态

    [root@node01 ~]# openstack server list 
    +--------------------------------------+-------------------+--------+-----------------------------+--------+---------+
    | ID                                   | Name              | Status | Networks                    | Image  | Flavor  |
    +--------------------------------------+-------------------+--------+-----------------------------+--------+---------+
    | e8b34357-91b8-4fdb-9477-c758e5159d9a | provider-instance | ACTIVE | provider-net=192.168.71.136 | cirros | m1.nano |
    +--------------------------------------+-------------------+--------+-----------------------------+--------+---------+

    可以看到provider-instance处于active状态,使用的网络上provicder-net,ip地址为192.168.71.136,使用的镜像是cirros镜像,使用的模板是m1.nano;

  9. 验证:在计算节点使用virsh命令看看是否能够看到启动的虚拟机?

    [root@node03 ~]# virsh list 
     Id   Name                State
    -----------------------------------
     1    instance-0000000b   running
  10. 验证:使用其他主机ping虚拟机的ip地址,看看是否能够ping通?

[root@node02 ~]# ping 192.168.71.136
PING 192.168.71.136 (192.168.71.136) 56(84) bytes of data.
64 bytes from 192.168.71.136: icmp_seq=1 ttl=64 time=9.37 ms
64 bytes from 192.168.71.136: icmp_seq=2 ttl=64 time=1.57 ms
64 bytes from 192.168.71.136: icmp_seq=3 ttl=64 time=0.976 ms
  1. 查看虚拟机实例的vnc地址

    [root@node01 ~]# openstack console url show provider-instance
    +----------+--------------------------------------------------------------------------------------------------+
    | Field    | Value                                                                                            |
    +----------+--------------------------------------------------------------------------------------------------+
    | protocol | vnc                                                                                              |
    | type     | novnc                                                                                            |
    | url      | http://openstack-vip.net:6080/vnc_auto.html?path=%3Ftoken%3D6812dd5f-6ea7-4787-be01-81f869e1adc0 |
    +----------+--------------------------------------------------------------------------------------------------+
    
    [root@node01 ~]#

    使用浏览器访问上述命令返回的url,看看是否能够访问到对应虚拟机的vnc控制台?

    image-20240927212327251

    使用windows访问,需要在windows上对openstack-vip.net做地址解析;

  2. 验证:登录虚拟机系统,看看虚拟机是否可正常访问外部网络?

    image-20240927212628522

    可以看到使用虚拟机ping外部网络能够正常ping通,并且虚拟机获取到地址和我们宿主机在同一网段中;说明我们基于provider network启动的虚拟机实例运行正常;

3. 基于self-sevice network创建虚拟机实例

  1. 在控制节点导出demo用户环境变量,创建self-service network

    [root@node01 ~]# . demo.sh 
    [root@node01 ~]# openstack network list 
    +--------------------------------------+--------------+--------------------------------------+
    | ID                                   | Name         | Subnets                              |
    +--------------------------------------+--------------+--------------------------------------+
    | 84d97504-ffd7-4c4e-b5b6-1066a7b1b97b | provider-net | c4485771-22be-4bed-8514-b87c14bbf1c9 |
    | abc5cb2f-8c3f-446c-93f5-abca2c025455 | internal-net | fef662c5-ad1d-42ff-adc5-09583a911885 |
    +--------------------------------------+--------------+--------------------------------------+
    [root@node01 ~]# openstack network create demo_selfservice_net
    +---------------------------+--------------------------------------+
    | Field                     | Value                                |
    +---------------------------+--------------------------------------+
    | admin_state_up            | UP                                   |
    | availability_zone_hints   |                                      |
    | availability_zones        |                                      |
    | created_at                | 2024-10-04T23:30:59Z                 |
    | description               |                                      |
    | dns_domain                | None                                 |
    | id                        | f2ba3d1d-6c3f-46f0-bd6a-f7b004adaf28 |
    | ipv4_address_scope        | None                                 |
    | ipv6_address_scope        | None                                 |
    | is_default                | False                                |
    | is_vlan_transparent       | None                                 |
    | mtu                       | 1450                                 |
    | name                      | demo_selfservice_net                 |
    | port_security_enabled     | True                                 |
    | project_id                | d2dd7a9d467a4c5dbd2faf6944986d1b     |
    | provider:network_type     | vxlan                                |
    | provider:physical_network | None                                 |
    | provider:segmentation_id  | 616                                  |
    | qos_policy_id             | None                                 |
    | revision_number           | 1                                    |
    | router:external           | Internal                             |
    | segments                  | None                                 |
    | shared                    | False                                |
    | status                    | ACTIVE                               |
    | subnets                   |                                      |
    | tags                      |                                      |
    | tenant_id                 | d2dd7a9d467a4c5dbd2faf6944986d1b     |
    | updated_at                | 2024-10-04T23:30:59Z                 |
    +---------------------------+--------------------------------------+
    

    创建self-service network请确保/etc/neutron/plugins/ml2/ml2_conf.ini配置文件中的[ml2]配置段中配置的tenant_network_types = vxlan,以及[ml2_type_vxlan]配置段中配置的有vxlan的标识范围,如下所示

    image-20241004191332857

  2. 创建子网

    [root@node01 ~]# openstack subnet create --network demo_selfservice_net  --dns-nameserver 223.5.5.5 --gateway 10.0.0.254  --subnet-range 10.0.0.0/8 demo_selfservice_net_sub
    +----------------------+-----------------------------------------------+
    | Field                | Value                                         |
    +----------------------+-----------------------------------------------+
    | allocation_pools     | 10.0.0.1-10.0.0.253,10.0.0.255-10.255.255.254 |
    | cidr                 | 10.0.0.0/8                                    |
    | created_at           | 2024-10-04T23:31:27Z                          |
    | description          |                                               |
    | dns_nameservers      | 223.5.5.5                                     |
    | dns_publish_fixed_ip | None                                          |
    | enable_dhcp          | True                                          |
    | gateway_ip           | 10.0.0.254                                    |
    | host_routes          |                                               |
    | id                   | d6fc6e40-9b4c-4f32-8fd5-1c4f43101004          |
    | ip_version           | 4                                             |
    | ipv6_address_mode    | None                                          |
    | ipv6_ra_mode         | None                                          |
    | name                 | demo_selfservice_net_sub                      |
    | network_id           | f2ba3d1d-6c3f-46f0-bd6a-f7b004adaf28          |
    | project_id           | d2dd7a9d467a4c5dbd2faf6944986d1b              |
    | revision_number      | 0                                             |
    | segment_id           | None                                          |
    | service_types        |                                               |
    | subnetpool_id        | None                                          |
    | tags                 |                                               |
    | updated_at           | 2024-10-04T23:31:27Z                          |
    +----------------------+-----------------------------------------------+
    

    这里我们创建子网就不用admin用户的环境变量,用demo用户的环境变量即可;因为self-service network创建的就是一个租户网络,由租户自行管理

  3. 创建虚拟路由器

    [root@node01 ~]# openstack router create demo_selfservice_net_sub_router1
    +-------------------------+--------------------------------------+
    | Field                   | Value                                |
    +-------------------------+--------------------------------------+
    | admin_state_up          | UP                                   |
    | availability_zone_hints |                                      |
    | availability_zones      |                                      |
    | created_at              | 2024-10-04T23:31:49Z                 |
    | description             |                                      |
    | distributed             | False                                |
    | enable_ndp_proxy        | None                                 |
    | external_gateway_info   | null                                 |
    | flavor_id               | None                                 |
    | ha                      | False                                |
    | id                      | f0411e8c-aab8-414b-9704-0322062a6bc8 |
    | name                    | demo_selfservice_net_sub_router1     |
    | project_id              | d2dd7a9d467a4c5dbd2faf6944986d1b     |
    | revision_number         | 1                                    |
    | routes                  |                                      |
    | status                  | ACTIVE                               |
    | tags                    |                                      |
    | tenant_id               | d2dd7a9d467a4c5dbd2faf6944986d1b     |
    | updated_at              | 2024-10-04T23:31:49Z                 |
    +-------------------------+--------------------------------------+
    
    
  4. 将上面创建的子网添加到路由器

    [root@node01 ~]# openstack router add subnet demo_selfservice_net_sub_router1 demo_selfservice_net_sub
    [root@node01 ~]#

    openstack router add subnet 后面跟虚拟路由启动名称(或id)和子网的名称(或id);

  5. 设置虚拟路由器的上游网络,有点类似设置路由器的wlan口网络

    [root@node01 ~]# openstack router set demo_selfservice_net_sub_router1 --external-gateway provider-net
    [root@node01 ~]#

    到此虚拟路由器就创建和配置完成

    这里需要注意, 创建过程中, 新建的route的内部接口显示为DOWN。这个应该是最新版本的bug。如果需要处理这个问题需要重启这个接口。可以在这个接口中, 点击取消掉启用管理员状态。取消之后再启用即可

    image-20241005075851028

    或者直接运行命令关闭管理员状态

    [root@node01 ~]# openstack port list | grep 10.0.0.253
    | 21cfae2c-fd63-477d-93ff-af04c340298f |           | fa:16:3e:a7:24:95 | ip_address='10.0.0.253', subnet_id='d6fc6e40-9b4c-4f32-8fd5-1c4f43101004'     | DOWN   |
    [root@node01 ~]# openstack port set --disable 21cfae2c-fd63-477d-93ff-af04c340298f
    [root@node01 ~]# openstack port set --enable 21cfae2c-fd63-477d-93ff-af04c340298f

  6. 验证:在控制节点导出admin用户环境变量,查看网络名称空间信息

    [root@node01 ~]# ip netns
    qdhcp-abc5cb2f-8c3f-446c-93f5-abca2c025455 (id: 0)
    qdhcp-84d97504-ffd7-4c4e-b5b6-1066a7b1b97b (id: 1)
    
    
    [root@node06 ~]# ip netns
    qrouter-f0411e8c-aab8-414b-9704-0322062a6bc8 (id: 1)
    qdhcp-f2ba3d1d-6c3f-46f0-bd6a-f7b004adaf28 (id: 0)
    

    能看到一个qrouter名称空间和两个qdhcp名称空间。就表示我们创建的虚拟路由器没有问题;

  7. 验证:列出路由器上的端口信息,看看对应端口是否是我们设置的网络ip地址信息?

    [root@node01 ~]# openstack router list
    +--------------------------------------+----------------------------------+--------+-------+----------------------------------+-------------+-------+
    | ID                                   | Name                             | Status | State | Project                          | Distributed | HA    |
    +--------------------------------------+----------------------------------+--------+-------+----------------------------------+-------------+-------+
    | f0411e8c-aab8-414b-9704-0322062a6bc8 | demo_selfservice_net_sub_router1 | ACTIVE | UP    | d2dd7a9d467a4c5dbd2faf6944986d1b | False       | False |
    +--------------------------------------+----------------------------------+--------+-------+----------------------------------+-------------+-------+
    
    
    [root@node01 ~]# openstack port list --router  demo_selfservice_net_sub_router1
    +--------------------------------------+------+-------------------+-------------------------------------------------------------------------------+--------+
    | ID                                   | Name | MAC Address       | Fixed IP Addresses                                                            | Status |
    +--------------------------------------+------+-------------------+-------------------------------------------------------------------------------+--------+
    | 16830365-e009-4cb8-a9b9-72f7137e7874 |      | fa:16:3e:a6:cb:12 | ip_address='10.0.0.254', subnet_id='d6fc6e40-9b4c-4f32-8fd5-1c4f43101004'     | ACTIVE |
    | e01dbda8-b833-4126-b9a8-dcf1cd3f63ae |      | fa:16:3e:47:ac:d5 | ip_address='192.168.71.119', subnet_id='c4485771-22be-4bed-8514-b87c14bbf1c9' | ACTIVE |
    +--------------------------------------+------+-------------------+-------------------------------------------------------------------------------+--------+
    

  8. 验证:查看路由器的网络接口信息

    [root@node06 ~]# ip netns
    qrouter-f0411e8c-aab8-414b-9704-0322062a6bc8 (id: 1)
    qdhcp-f2ba3d1d-6c3f-46f0-bd6a-f7b004adaf28 (id: 0)
    [root@node06 ~]# ip netns exec qrouter-f0411e8c-aab8-414b-9704-0322062a6bc8 ifconfig
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            inet6 ::1  prefixlen 128  scopeid 0x10<host>
            loop  txqueuelen 1000  (Local Loopback)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    qg-e01dbda8-b8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.71.119  netmask 255.255.255.0  broadcast 192.168.71.255
            inet6 fe80::f816:3eff:fe47:acd5  prefixlen 64  scopeid 0x20<link>
            ether fa:16:3e:47:ac:d5  txqueuelen 1000  (Ethernet)
            RX packets 592  bytes 88171 (86.1 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 18  bytes 1348 (1.3 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    qr-16830365-e0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
            inet 10.0.0.254  netmask 255.0.0.0  broadcast 10.255.255.255
            inet6 fe80::f816:3eff:fea6:cb12  prefixlen 64  scopeid 0x20<link>
            ether fa:16:3e:a6:cb:12  txqueuelen 1000  (Ethernet)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 13  bytes 998 (998.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
  9. 验证:在其他主机上ping虚拟路由器地址,看看是否能够ping通?

    [root@node01 ~]# ping -c 4 192.168.71.119
    PING 192.168.71.119 (192.168.71.119) 56(84) bytes of data.
    64 bytes from 192.168.71.119: icmp_seq=1 ttl=64 time=1.60 ms
    64 bytes from 192.168.71.119: icmp_seq=2 ttl=64 time=0.479 ms
    64 bytes from 192.168.71.119: icmp_seq=3 ttl=64 time=0.755 ms
    64 bytes from 192.168.71.119: icmp_seq=4 ttl=64 time=0.619 ms
    
    --- 192.168.71.119 ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss, time 3045ms
    rtt min/avg/max/mdev = 0.479/0.864/1.604/0.438 ms

    到此,self-service network就创建完成;

  10. 启动一个虚拟机实例

    在控制节点导出demo用户环境变量,验证是否有可用的网络?

    [root@node01 ~]# . demo.sh 
    [root@node01 ~]# openstack network list 
    +--------------------------------------+----------------------+--------------------------------------+
    | ID                                   | Name                 | Subnets                              |
    +--------------------------------------+----------------------+--------------------------------------+
    | 84d97504-ffd7-4c4e-b5b6-1066a7b1b97b | provider-net         | c4485771-22be-4bed-8514-b87c14bbf1c9 |
    | abc5cb2f-8c3f-446c-93f5-abca2c025455 | internal-net         | fef662c5-ad1d-42ff-adc5-09583a911885 |
    | f2ba3d1d-6c3f-46f0-bd6a-f7b004adaf28 | demo_selfservice_net | d6fc6e40-9b4c-4f32-8fd5-1c4f43101004 |
    +--------------------------------------+----------------------+--------------------------------------+

    可以看到现在又多了一个网络;

  11. 创建虚拟机

    [root@node01 ~]# openstack server create --flavor m1.nano --image cirros  --nic net-id=f2ba3d1d-6c3f-46f0-bd6a-f7b004adaf28 --security-group bb511975-5f8d-4a08-8775-c4ac29f6c7a5 --key-name demo_key demo_vm2
    +-------------------------------------+-----------------------------------------------+
    | Field                               | Value                                         |
    +-------------------------------------+-----------------------------------------------+
    | OS-DCF:diskConfig                   | MANUAL                                        |
    | OS-EXT-AZ:availability_zone         |                                               |
    | OS-EXT-SRV-ATTR:host                | None                                          |
    | OS-EXT-SRV-ATTR:hypervisor_hostname | None                                          |
    | OS-EXT-SRV-ATTR:instance_name       |                                               |
    | OS-EXT-STS:power_state              | NOSTATE                                       |
    | OS-EXT-STS:task_state               | scheduling                                    |
    | OS-EXT-STS:vm_state                 | building                                      |
    | OS-SRV-USG:launched_at              | None                                          |
    | OS-SRV-USG:terminated_at            | None                                          |
    | accessIPv4                          |                                               |
    | accessIPv6                          |                                               |
    | addresses                           |                                               |
    | adminPass                           | 8pdJoU7FyLuU                                  |
    | config_drive                        |                                               |
    | created                             | 2024-10-04T23:36:24Z                          |
    | flavor                              | m1.nano (0)                                   |
    | hostId                              |                                               |
    | id                                  | 3c1686c1-0068-41a7-9c55-33c7026940f1          |
    | image                               | cirros (514c6db8-1866-4ee4-b464-2c9eca88f0f9) |
    | key_name                            | demo_key                                      |
    | name                                | demo_vm2                                      |
    | progress                            | 0                                             |
    | project_id                          | d2dd7a9d467a4c5dbd2faf6944986d1b              |
    | properties                          |                                               |
    | security_groups                     | name='bb511975-5f8d-4a08-8775-c4ac29f6c7a5'   |
    | status                              | BUILD                                         |
    | updated                             | 2024-10-04T23:36:24Z                          |
    | user_id                             | c4c0a73ca297489c9771b3d7e7814b53              |
    | volumes_attached                    |                                               |
    +-------------------------------------+-----------------------------------------------+
  12. 查看当前用户虚拟机列表

    [root@node01 ~]# openstack server list 
    +--------------------------------------+----------+---------+----------------------------------------------------------+--------+---------+
    | ID                                   | Name     | Status  | Networks                                                 | Image  | Flavor  |
    +--------------------------------------+----------+---------+----------------------------------------------------------+--------+---------+
    | 3c1686c1-0068-41a7-9c55-33c7026940f1 | demo_vm2 | ACTIVE  | demo_selfservice_net=10.0.0.121                          | cirros | m1.nano |
    | a16ee05b-32db-4ed1-9b3f-f5a5bb654ed1 | 111111   | SHUTOFF | internal-net=192.168.10.172; provider-net=192.168.71.131 | cirros | m2.nano |
    | 57ebe263-ba50-4602-b49a-23d312169119 | test     | SHUTOFF | internal-net=192.168.10.161; provider-net=192.168.71.130 | cirros | m2.nano |
    +--------------------------------------+----------+---------+----------------------------------------------------------+--------+---------+

    可以看到demo_vm2已经运行,并且所使用的ip地址是10.0.0.21;

  13. 查看虚拟机的vnc地址

    [root@node01 ~]# openstack console url show demo_vm2
    +----------+--------------------------------------------------------------------------------------------------+
    | Field    | Value                                                                                            |
    +----------+--------------------------------------------------------------------------------------------------+
    | protocol | vnc                                                                                              |
    | type     | novnc                                                                                            |
    | url      | http://openstack-vip.net:6080/vnc_auto.html?path=%3Ftoken%3De4acb442-10e3-437a-a35c-514ff91da3ad |
    +----------+--------------------------------------------------------------------------------------------------+
    
  14. 验证:使用浏览器访问,看看是否能够访问到对应的虚拟机vnc界面?

    image-20241005073843178

    可以看到能够使用返回的url访问到demo_vm2实例;

  15. 验证:登录虚拟机系统,查看ip地址是否是我们指定的网络?

    image-20241005073920822
  16. 验证:是否可以和外部网络通信?

    image-20241005074003528

    可以看到虚拟机是可以正常和外部网络通信;

  17. 查看虚拟机的路由,看看网关是否是我们指定的网关呢?

    image-20241005074035979
  18. 验证:在控制节点使用ssh连接demo_vm2,看看是否能够正常连接呢?

    image-20241005074237387

    很明显使用外部网络是无法正常连接到虚拟机;

  19. 使用路由器的网络名称空间,连接虚拟机

    image-20241005074414838
    [root@node06 ~]# ip netns
    qrouter-f0411e8c-aab8-414b-9704-0322062a6bc8 (id: 1)
    qdhcp-f2ba3d1d-6c3f-46f0-bd6a-f7b004adaf28 (id: 0)
    [root@node06 ~]# ip netns exec qrouter-f0411e8c-aab8-414b-9704-0322062a6bc8 ssh cirros@10.0.0.121
    The authenticity of host '10.0.0.121 (10.0.0.121)' can't be established.
    ECDSA key fingerprint is SHA256:Ry5iRF4ttb7ZBYkvGJTGrlDNLQxxwibcWJNShWs6SKU.
    This key is not known by any other names
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
    Warning: Permanently added '10.0.0.121' (ECDSA) to the list of known hosts.
    cirros@10.0.0.121's password: 
    $ ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast qlen 1000
        link/ether fa:16:3e:67:05:7c brd ff:ff:ff:ff:ff:ff
        inet 10.0.0.121/8 brd 10.255.255.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::f816:3eff:fe67:57c/64 scope link 
           valid_lft forever preferred_lft forever
    $ 

    使用虚拟路由器的网络名称空间是可以正常从外部网络访问到虚拟机;

  20. 设定nat 一对一绑定,实现外部网络能够正常访问到虚拟机

    在provider-net网络中创建一个流动ip,用于外部访问内部虚拟机的流量接入地址

    [root@node01 ~]# openstack floating ip create provider-net
    +---------------------+--------------------------------------+
    | Field               | Value                                |
    +---------------------+--------------------------------------+
    | created_at          | 2024-10-04T23:45:39Z                 |
    | description         |                                      |
    | dns_domain          | None                                 |
    | dns_name            | None                                 |
    | fixed_ip_address    | None                                 |
    | floating_ip_address | 192.168.71.120                       |
    | floating_network_id | 84d97504-ffd7-4c4e-b5b6-1066a7b1b97b |
    | id                  | d30cde40-df60-4f5c-b2fd-8f5b13eef1cf |
    | name                | 192.168.71.120                       |
    | port_details        | None                                 |
    | port_id             | None                                 |
    | project_id          | d2dd7a9d467a4c5dbd2faf6944986d1b     |
    | qos_policy_id       | None                                 |
    | revision_number     | 0                                    |
    | router_id           | None                                 |
    | status              | DOWN                                 |
    | subnet_id           | None                                 |
    | tags                | []                                   |
    | updated_at          | 2024-10-04T23:45:39Z                 |
    +---------------------+--------------------------------------+
    [root@node01 ~]# openstack floating ip list 
    +--------------------------------------+---------------------+------------------+------+--------------------------------------+----------------------------------+
    | ID                                   | Floating IP Address | Fixed IP Address | Port | Floating Network                     | Project                          |
    +--------------------------------------+---------------------+------------------+------+--------------------------------------+----------------------------------+
    | 639bdab0-fdee-45ea-a15c-871d3b49959f | 192.168.71.128      | None             | None | 84d97504-ffd7-4c4e-b5b6-1066a7b1b97b | d2dd7a9d467a4c5dbd2faf6944986d1b |
    | d30cde40-df60-4f5c-b2fd-8f5b13eef1cf | 192.168.71.120      | None             | None | 84d97504-ffd7-4c4e-b5b6-1066a7b1b97b | d2dd7a9d467a4c5dbd2faf6944986d1b |
    +--------------------------------------+---------------------+------------------+------+--------------------------------------+----------------------------------+

    可以看到流动ip地址为192.168.71.120;

    将生成的流动ip地址和虚拟机实例做绑定

    [root@node01 ~]# openstack server add floating ip demo_vm2 192.168.71.120
    [root@node01 ~]#

    再次查看当前用户虚拟机实例

    [root@node01 ~]# openstack server list 
    +--------------------------------------+----------+---------+----------------------------------------------------------+--------+---------+
    | ID                                   | Name     | Status  | Networks                                                 | Image  | Flavor  |
    +--------------------------------------+----------+---------+----------------------------------------------------------+--------+---------+
    | 3c1686c1-0068-41a7-9c55-33c7026940f1 | demo_vm2 | ACTIVE  | demo_selfservice_net=10.0.0.121, 192.168.71.120          | cirros | m1.nano |
    | a16ee05b-32db-4ed1-9b3f-f5a5bb654ed1 | 111111   | SHUTOFF | internal-net=192.168.10.172; provider-net=192.168.71.131 | cirros | m2.nano |
    | 57ebe263-ba50-4602-b49a-23d312169119 | test     | SHUTOFF | internal-net=192.168.10.161; provider-net=192.168.71.130 | cirros | m2.nano |
    +--------------------------------------+----------+---------+----------------------------------------------------------+--------+---------+

    可以看到流动ip已经在demo_vm2的网卡上了;

  21. 验证:使用其他主机ping192.168.71.120 是否可ping通?

    image-20241005074930356

    验证:使用外部主机用ssh连接192.168.71.120,看看是否连接至虚拟机?

    [root@node01 ~]# ssh cirros@192.168.71.120
    The authenticity of host '192.168.71.120 (192.168.71.120)' can't be established.
    ECDSA key fingerprint is SHA256:Ry5iRF4ttb7ZBYkvGJTGrlDNLQxxwibcWJNShWs6SKU.
    This key is not known by any other names
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
    Warning: Permanently added '192.168.71.120' (ECDSA) to the list of known hosts.
    cirros@192.168.71.120's password: 
    $ ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast qlen 1000
        link/ether fa:16:3e:67:05:7c brd ff:ff:ff:ff:ff:ff
        inet 10.0.0.121/8 brd 10.255.255.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::f816:3eff:fe67:57c/64 scope link 
           valid_lft forever preferred_lft forever
    $ 

    可以看到现在外部主机通过连接流动ip地址,就可以直接和虚拟机通信;其实在我们给虚拟机添加浮动ip时,它就在虚拟路由器的iptables表中增加了一条DNAT规则,如下所示

    image-20241005075329570

    上面的DANT规则说明了为什么外部网络访问浮动ip地址能够访问到内网虚拟机;

    到此基于self-service network 启动的虚拟机实例配置测试就完成了;


参考链接

云计算管理平台之OpenStack启动虚拟机实例 - Linux-1874 - 博客园 (cnblogs.com)