1 nova命令
先介绍一下nova命令中与网络相关的一些参数。
1.1 指定网络启动虚机
usage: nova boot [--flavor <flavor>] [--image <image>] [--image-with <key=value>] [--boot-volume <volume_id>] [--snapshot <snapshot_id>] [--min-count <number>] [--max-count <number>] [--meta <key=value>] [--file <dst-path=src-path>] [--key-name <key-name>] [--user-data <user-data>] [--availability-zone <availability-zone>] [--security-groups <security-groups>] [--block-device-mapping <dev-name=mapping>] [--block-device key1=value1[,key2=value2...]] [--swap <swap_size>] [--ephemeral size=<size>[,format=<format>]] [--hint <key=value>] [--nic <net-id=net-uuid,v4-fixed-ip=ip-addr,v6-fixed-ip=ip-addr,port-id=port-uuid>] [--config-drive <value>] [--poll] <name> |
其中,v4/6-fixed-ip不能单独配置,必须和net-id一起配置;在一个--nic中net-id与port-id只能选择一个。
命令示例:
根据Port-ID启动虚机: # neutron port-create accd72eb-2cd0-4961-ad67-d028c92e5254 --fixed-ip ip_address=1.2.3.20 # nova boot --flavor 100 --image 18f8b6e1-a957-4d94-a3dd-eca757afdeb9 \ --nic port-id=10e7e093-156e-402b-9a45-ff8ab13dfb03 test_vm_1
启动虚机时指定网络,指定IP: # nova boot --flavor 100 --image 18f8b6e1-a957-4d94-a3dd-eca757afdeb9 \ --nic net-id=accd72eb-2cd0-4961-ad67-d028c92e5254,v4-fixed-ip=1.2.3.10 test_vm_2
创建多网络虚机: # nova boot --flavor 100 --image 18f8b6e1-a957-4d94-a3dd-eca757afdeb9 \ --nic net-id=accd72eb-2cd0-4961-ad67-d028c92e5254 \ --nic net-id= 2125e96e-d2a3-42b3-931f-5a90149d0f90 test_vm_3
|
1.2 修改虚机网络
nova支持对于active的虚机添加或删除网卡,对应命令如下:
interface-attach Attach a network interface to a server. interface-detach Detach a network interface from a server. interface-list List interfaces attached to a server.
用法: nova interface-attach [--port-id <port_id>] [--net-id <net_id>] [--fixed-ip <fixed_ip>] <server> nova interface-detach <server> <port_id> |
命令示例:
绑定一个端口、网络或者IP地址到虚机: nova interface-attach 06fd79d1-99a8-451d-955c-f466b8986f34 --port-id c310babc-c833-4b10-9d76-78d60a58af98 将port-id从虚机解绑: nova interface-detach 8dd2fb5d-30a9-45c7-8931-ba039adcd20f 5138a9ce-7114-4126-82e8-8685a6aeccee
查看虚机对应的Port端口: [root@node-82 ~]# nova interface-list f09c0b84-8e5a-4a3d-8da9-7d57d105e0e3 +------------+--------------------------------------+--------------------------------------+--------------+-------------------+ | Port State | Port ID | Net ID | IP addresses | MAC Addr | +------------+--------------------------------------+--------------------------------------+--------------+-------------------+ | ACTIVE | 182b1ed7-beab-46cd-84b1-1daf72f4e266 | accd72eb-2cd0-4961-ad67-d028c92e5254 | 1.2.3.12 | fa:16:3e:3f:3a:91 | | ACTIVE | 51b10239-005d-4d20-8d03-269bc85bacc6 | 2125e96e-d2a3-42b3-931f-5a90149d0f90 | 1.1.1.32 | fa:16:3e:d5:6c:5a | +------------+--------------------------------------+--------------------------------------+--------------+-------------------+ |
2 nova介绍
2.1 Nova服务
nova主要服务包括:
nova-api:对外提供rest-api。
nova-conductor:用于分发消息。
nova-scheduler:在创建虚机时,选择计算节点。
nova-compute:在计算节点上运行,负责管理虚机的生命周期。
3 处理流程
3.1 创建虚机流程
用户创建虚机的命令到达nova-api后,通过rpc发给nova-conductor处理。conductor中,先通过nova-scheduler选择虚机调度到的主机,然后发送到对应主机的nova-compute上进行处理。
如下是nova-compute处理虚机创建的详细流程。
与网络相关的部分,简要地可以分为几部:
1) 创建网络资源,此时更新neutron port,或者创建neutron port,返回VIF列表
2) libvirt spawn,根据VIF列表,配置虚机底层网络,然后起虚机进程,并等待虚机启动完成。
3) ovs-agent捕获到虚机网卡添加到br-int中,发送rpc给plugin更新neutron db port状态为up。
4) neutron db检测到端口up,发送network-vif-plug event通知nova端口。
l 日志分析
创建虚机,通过查看nova-computedebug日志,可以大致了解虚机启动过程。
allocate_for_instance /usr/lib/python2.7/site-packages/nova/network/neutronv2/api.py GET http://controller:9696/v2.0/networks.json?id=2 GET http://controller:9696/v2.0/security-groups.json?tenant_id= POST http://controller:9696/v2.0/ports.json '{"port": {"binding:host_id": "compute1", "admin_state_up": true, "network_id": "2337cce4-512c-4b36-a5a7-6af99bfe21d2", "tenant_id": "47227b9865f64869aee959af81caf8dd", "device_owner": "compute:nova", "security_groups": ["17be47bc-1629-4266-812f-a0750975f89f"], "device_id": "74f3bd67-4362-477d-b700-c10866dea8a6"}}' |